diff --git a/CHANGELOG.md b/CHANGELOG.md index 4777e5a4e..42a9e6671 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,11 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/). ## [Unreleased] -## [0.8.0] - Unreleased +## [0.8.0] - 2026-11-04 -Source manifests identify `0.8.0`. The date is set when the release is published. -See [release notes and migration](docs/release-notes-0.8.0.md) and the -[checkpoint qualification](docs/release-qa-0.8.0.md) before choosing a consumer pin. +See the [release notes](docs/release-notes-0.8.0.md) for upgrade steps, +downloads and known limitations. ### Added @@ -40,6 +39,14 @@ See [release notes and migration](docs/release-notes-0.8.0.md) and the ### Changed +- `ModelImporter::import` and `import_with_progress` require the lifecycle-owned + `ModelLibrary` from `PumasApi` or `PumasLibraryInstance`; a directly + constructed library returns `PumasError::Config` before staging. +- `ModelImporter::discover_shard_recovery[_async]` returns a typed read-only + report; `recover_incomplete_shards[_async]` is deprecated and never starts + an inferred download. +- Library merge refuses copied imports whose publication receipt is bound to + their current library root. - A model's category is metadata: re-detection never moves a model or changes its ID for a category change (only a family change still moves it). Detection prefers file facts and architectures over task tags: a GGUF @@ -108,10 +115,10 @@ See [release notes and migration](docs/release-notes-0.8.0.md) and the - A desktop update that fails validation is no longer dropped silently, which had left views stale; the reason is reported and the view reloads. -## [0.7.0] - Unreleased candidate +## [0.7.0] - 2026-09-17 -See [0.7.0 release notes](docs/release-notes-0.7.0.md) for capabilities, -upgrade guidance, and scope. +See the [0.7.0 release](https://github.com/MrScripty/Pumas-Library/releases/tag/v0.7.0) +for capabilities, upgrade guidance, and scope. ### Added diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ada772695..22944997e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -79,6 +79,7 @@ Run the smallest evidence set that proves the change. Common baselines are: | Rust | `./scripts/rust/check.sh` or targeted `cargo test --manifest-path rust/Cargo.toml -p ` | | Frontend | `npm run -w frontend lint`, `check:types`, and targeted/full `test:run` | | Electron | `npm run -w electron lint`, `test`, and `validate` | +| Desktop contract | `pnpm --dir electron check:desktop-contract` after changing a Rust wire type or an `electron/contracts/` schema | | Launcher | `npm run test:launcher` | | Torch | Ruff checks plus `python3 -m unittest discover -s torch-server/tests` | | Release startup | `./launcher.sh --build-release` and `--release-smoke` | diff --git a/README.md b/README.md index 4f620a422..b4a5ca048 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ The listener is loopback-only. Add `--no-default-features` to the build to omit ## Integrate it -Use `pumas-library` from [pumas-core](rust/crates/pumas-core) for an embedded library, or [pumas-rpc](rust/crates/pumas-rpc/README.md) for a separate process. One `PumasApi` owns a library root; use `PumasLocalClient` to connect to an existing owner. Native bindings are experimental: check their [support status](docs/native-bindings.md) before choosing one. +Use `pumas-library` from [pumas-core](rust/crates/pumas-core) for an embedded library, or [pumas-rpc](rust/crates/pumas-rpc/README.md) for a separate process. One `PumasApi` owns a library root; use `PumasLocalClient` to connect to an existing owner. HTTP consumers start from `GET /v1/served-models` and the [model operations contract](docs/contracts/model-operations-v1.md). No host-language binding is currently supported: see the [binding status](docs/native-bindings.md). Linux x64 is the primary runtime target. Windows x64 and macOS arm64 build artifacts exist, with narrower runtime qualification. See [release guidance](RELEASING.md). @@ -47,4 +47,3 @@ Linux x64 is the primary runtime target. Windows x64 and macOS arm64 build artif - [Contributing](CONTRIBUTING.md) · [Security](docs/SECURITY.md) [MIT License](LICENSE). - diff --git a/RELEASING.md b/RELEASING.md index 941cfa91d..630e83fd9 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -15,13 +15,13 @@ manual/tag behavior. All outputs remain unsigned, unverified candidates. The workflow has read-only contents permissions and never creates a tag or GitHub release. -For a build-only rehearsal, first have the parent review the exact source and -run action. Set `PUMAS_REHEARSAL_SHA` to that reviewed full commit, then dispatch -this branch (or the accepted branch containing this workflow): +For a build-only rehearsal, first have the maintainer review the exact source +and run action. Set `PUMAS_REHEARSAL_BRANCH` to the branch holding that source +and `PUMAS_REHEARSAL_SHA` to its reviewed full commit, then dispatch: ```bash gh workflow run build.yml --repo MrScripty/Pumas-Library \ - --ref release/v080-package-qualification-20261014 \ + --ref "$PUMAS_REHEARSAL_BRANCH" \ -F build_candidates=true -f expected_source="$PUMAS_REHEARSAL_SHA" ``` @@ -168,7 +168,7 @@ and macOS ARM64 archives through `headless_inference_ci.py` and the existing strict `headless_inference_build.py` producer. Candidate assembly requires all three in addition to the thirteen existing assets. A missing or failed native job blocks the combined candidate. No workflow step publishes a release. -Pull requests and manual workflow runs also run the bounded Linux-only +Pull requests and ordinary (non-candidate) manual runs also run the bounded Linux-only `review-inference-linux` job on the existing `ubuntu-24.04` runner. It checks out the exact PR head (or manual run SHA), uses the same strict release producer, extracts the archive, and compares authenticated core/RPC startup identities. @@ -181,11 +181,16 @@ untrained ONNX graph through its own extracted Pumas binary, observes the pinned native runtime mapping, and requires graceful shutdown. Its separately labeled fixture hashes and lifecycle log are execution evidence, not pretrained Nomic acceptance or embedding-quality evidence. No model weights are downloaded. -The source version is `0.8.0`. Setting it does not publish a tag or release and -does not qualify native model execution. -The producer requires source version 0.8; older 0.7 sources fail before compilation. -After manifest or dependency changes, regenerate/review the matching `` -and `-s3` attribution directories. The generator and inference producer + +The bounded PR/manual `review-audio-dependencies` job separately requires the +frozen non-model audio dependency cohort to execute under real Linux confinement. +Unsupported confinement or recipe mismatch fails the job. Its evidence contains +the exact source head/tree, probe report and log; installed runtime bytes are not +uploaded. This dependency probe does not qualify a pretrained ASR model. + +The producer requires source version 0.8; older 0.7 sources fail before +compilation. After manifest or dependency changes, regenerate/review the +matching `` and `-s3` attribution directories. The generator and inference producer select those source-version paths without retaining a hard-coded 0.7 directory. `onnx-runtime-pins.json` records the official CPU 1.24.2 GitHub release archive @@ -250,9 +255,9 @@ also passed against the pinned library in this environment. A separate C harness executed a real CPU session using a synthetic two-element Identity graph, observed the pinned mapped runtime, released its native handles and exited successfully. That bounded untrained graph is not Pumas/Nomic or pretrained-model evidence. -This development environment has not executed a v0.8 release build, pretrained ONNX model, native Windows/macOS -startup, signing/notarization, final SBOM or security qualification. Preserve those -gates before the maintainer's publication decision. +None of these local checks executes a release build, a pretrained ONNX model, +native Windows/macOS startup, signing/notarization, a final SBOM or security +qualification. Those remain gates before the maintainer's publication decision. ## Complete candidate metadata @@ -281,10 +286,14 @@ SPDX/provenance or treat installer-only checksums as final publication coverage. ## Reviewed trained fixture The documented fixture is Nomic's public `nomic-ai/nomic-embed-text-v1.5`, using -`onnx/model_fp16.onnx` plus its matching tokenizer/config files. The -[fixture investigation](docs/plans/v080-packaging/reports/nomic-fixture.md) records -the official revision, publisher license declaration, exact weight identity and -remaining byte-verification limits. A provided directory is copied into an +`onnx/model_fp16.onnx` plus its matching `tokenizer.json`, `config.json`, +`tokenizer_config.json` and `special_tokens_map.json`, all at the immutable +revision `ac6fcd72429d86ff25c17895e47a9bfcfc50c1b2` (publisher license: +Apache-2.0). The publisher's Git-LFS pointer gives `onnx/model_fp16.onnx` as +273,859,028 bytes with SHA-256 +`cf5b5a86edb00f895561803cfc04729090a958340b8ca2ad76c143f565f6bb04`; that digest +comes from upstream and has not been recomputed locally. Fetch only those five +paths, never the whole (about 2.2 GB) repository. A provided directory is copied into an isolated library and never modified. The lifecycle receipt records the copied bytes; it does not itself authenticate their model provenance or establish model quality. No model is bundled in release artifacts or silently downloaded by this @@ -298,17 +307,19 @@ unmounts it, compares packaged resources, checks ARM64 executables and runs both RPC and desktop startup from the copied application. Reproduce on a Mac with `python3 scripts/release/smoke-macos-package.py CANDIDATE_DMG`. This check requires the matching staged RPC and frontend inputs. It does not qualify Gatekeeper, -notarization, native chooser recovery or interactive desktop behavior. macOS -remains a required target; its native results are pending until that job runs. +notarization, native chooser recovery or interactive desktop behavior. macOS is +a required target. ## Required release acceptance The candidate workflow rejects missing, empty, duplicate, stale-version, and -unexpected installer archives, and hashes the exact staged bytes. It checks -native RPC startup from staging and both extracted Linux installers, compares -packaged Linux resources against their build inputs, and checks Linux desktop -startup. These -are bounded startup checks, not installer installation or complete user flows. +unexpected artifacts, and hashes the exact final bytes. It checks native RPC +startup from staging on each target, compares packaged resources against their +build inputs on Linux, macOS and Windows, starts the packaged RPC and desktop +(Linux under Xvfb, the copied macOS application, the installed and portable +Windows applications), and asserts inference-route absence for each +no-inference package. These are bounded startup checks, not complete user +flows. Before tagging or publishing, satisfy the remaining artifact-plan obligations: @@ -328,8 +339,8 @@ Before tagging or publishing, satisfy the remaining artifact-plan obligations: embed the accepted notices and project license in each distributable. - Run current Cargo and pnpm vulnerability/license checks and review their results against the shipped dependency closure. -- Verify the final publication inventory and regenerate checksums after adding - release metadata. Candidate checksums cover installers only. +- Verify the final publication inventory. Candidate checksums cover every final + artifact and metadata file; regenerate them if anything is added or changed. - If shipping a Torch runtime, verify its resolved dependencies and real load/inference/control behavior on each claimed device/platform tuple. Unit fakes and source adapters do not qualify a runtime distribution. @@ -350,8 +361,8 @@ no-follow traversal, a pinned execution lock file, native handle-relative rename and writable directory flushes. Durable JSON publication retains the same explicit failure and durability states across Linux, macOS, and Windows. Native startup checks do not establish signing, SmartScreen acceptance, or interactive workflows. -See the [dependency review](docs/dependency-review-0.7.0.md) for the remaining -security and attribution decisions. +Run the vulnerability and license checks for the exact shipped closure, and +re-confirm the [accepted advisory exceptions](docs/SECURITY.md#accepted-advisory-exceptions). ## Tag and publish @@ -366,21 +377,3 @@ version. Failed workflow artifacts are diagnostics, never distribution assets. (The v0.7.0 tag was moved once before any publication because its original commit never passed CI and no release was cut from it; that pre-publication move is the exception, not the practice.) - -## Why this workflow changed for 0.7 - -The histories leading to v0.1–v0.6 repeatedly needed last-minute fixes for -binding-generator invocations, pnpm/native optional dependencies, action pins, -platform paths and symlinks, test isolation, lint, and Windows RAM-disk behavior. -The previous pipeline also shipped outputs excluded by the current artifact -plan and allowed missing uploads. The replacement removes RAM-disk setup and -unsupported bundle generation, locks Cargo resolution, reads the Rust toolchain -pin once, makes headless execution a separate gate, and rehearses installer -assembly before tags. Release failures remain visible instead of being converted -into partial success. - -The bounded PR/manual `review-audio-dependencies` job separately requires the -frozen non-model audio dependency cohort to execute under real Linux confinement. -Unsupported confinement or recipe mismatch fails the job. Its evidence contains -the exact source head/tree, probe report and log; installed runtime bytes are not -uploaded. This dependency probe does not qualify a pretrained ASR model. diff --git a/bindings/README.md b/bindings/README.md index 5f761e0a0..c04a122c3 100644 --- a/bindings/README.md +++ b/bindings/README.md @@ -1,41 +1,10 @@ # Generated Bindings -This directory is the local output and test area for experimental Pumas host -bindings. The stable implementation boundary is the Rust adapter in -`rust/crates/pumas-uniffi`; generated language files are build artifacts. - -Supported generators currently target Python, Kotlin, Swift, Ruby, and C#. -There is also an experimental Rustler crate for Elixir/Erlang, but it does not -currently expose the core library API. None of these surfaces has a complete -host/runtime support matrix yet. - -## Generate - -From the repository root: - -```bash -./scripts/generate-bindings.sh python -./scripts/generate-bindings.sh csharp -./scripts/generate-bindings.sh all -``` - -Generation builds `pumas-uniffi` and may require separately installed, -version-compatible bindgen tools. Generated files and their native library are -one compatibility cohort: do not combine output from different commits, -versions, targets, or profiles. - -## Check and Package - -```bash -./scripts/check-uniffi-surface.sh -./scripts/check-uniffi-csharp-smoke.sh -./scripts/package-uniffi-csharp-artifacts.sh -``` - -The C# smoke proves that generated code compiles, the matching native library -loads, and a synchronous version call works. It does not prove async APIs or a -complete model-library workflow. - -Generated output belongs in ignored directories and must not be hand-edited. -See [Native bindings](../docs/native-bindings.md) for the boundary, runtime -loading, packaging, and promotion requirements. +Local output and test area for the experimental host-language bindings. Only +this README, `support-matrix.json` and the C# smoke sources are tracked; +everything generated here is a build artifact and must not be hand-edited. + +`support-matrix.json` is the machine-readable support decision: it currently +accepts no host tuple. See [Native bindings](../docs/native-bindings.md) for +the status, boundary, generation and check commands, runtime loading and the +evidence required before any tuple is admitted. diff --git a/bindings/csharp/PACKAGE-README.md b/bindings/csharp/PACKAGE-README.md index ce89d19cd..75532e98f 100644 --- a/bindings/csharp/PACKAGE-README.md +++ b/bindings/csharp/PACKAGE-README.md @@ -9,7 +9,8 @@ commit, target, and build profile. Place the native library beside the host executable or on the platform's native-library search path before loading the binding. -These bindings are experimental. The current smoke evidence covers native -loading and a synchronous version call, not the full async or model-library API. +These bindings are experimental and not a supported SDK. The current smoke +evidence covers native loading and a synchronous version call, not the full +async or model-library API. See `docs/native-bindings.md` in the archive for integration constraints and the evidence required before claiming host support. diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 911dffffb..0fa428166 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -77,10 +77,9 @@ of admitted work. The primary drains local effects and downloads during composed shutdown. See the [core contract](../rust/crates/pumas-core/README.md#local-intent-interface) for availability evidence, restart, retry, deletion and downgrade limits. -Existing operational consumers remain supported. Desktop and UniFFI intent -adoption is separate from this native/local transport increment. Node, fleet, -remote discovery and additional network features are deferred until after the -next Pumas release. +Existing operational consumers remain supported. The desktop bridge and UniFFI +do not expose the intent methods. Nodes, fleet management, remote discovery and +additional discovery networks are later scope. ## Storage @@ -100,6 +99,17 @@ Import, download, reconciliation, migration, and deletion must keep filesystem, metadata, index, and event history consistent. Recovery outcomes must remain distinguishable from normal success. +A model's category (what it is used for, such as `llm`, `decision`, `video` or +`embedding`) is metadata. It groups models for display and never decides where +a model is stored or what its ID is; only a family change moves a model. Core +owns detection and the person's explicit choice (`set_model_category`), which +later re-detection keeps. See the +[core guide](../rust/crates/pumas-core/README.md#model-categories). + +The download store is schema 7. Older supported stores need the explicit, +one-way offline upgrade in [Opening an older library](library-upgrade.md); +ordinary startup never converts them. + ## Desktop Boundary The renderer accesses only `window.electronAPI`; it has no direct Node access. @@ -167,12 +177,11 @@ boundary split is recorded in The default `pumas-rpc` build enables inference plugins. The library-only desktop variant combines `pumas-rpc --no-default-features` with the frontend `library-only` Vite mode. `PUMAS_INFERENCE_PLUGINS=false` selects that pair in -the shared launcher. +the shared launcher. Releases ship both variants (see [Releasing](../RELEASING.md)). -The `pumas-core` HF/process/GPU feature names do not currently remove their -underlying dependency or public module surfaces. Do not describe its -`--no-default-features` build as minimal until the feature contract is fixed and -verified. +The [Rust guide](../rust/README.md#features-and-variants) owns the Cargo feature +facts, including why `pumas-library --no-default-features` is not a minimal +build. ## Known Boundary Work diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index d4bfee6bc..fa1c7a277 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -69,9 +69,9 @@ Pumas keep ownership of ORT environment settings and must select the same library before any other direct ORT calls. Consumers that only need model metadata can declare `pumas-library` with -`default-features = false`; add `hf-client`, `process-manager`, `gpu-monitor` -or `s3` only when their actual calls need them. `full` includes `onnx-runtime`. -Metadata/index/import APIs remain outside that feature. Cargo features unify +`default-features = false` to omit ONNX Runtime; add `s3` only when they call +the S3 reader. The [Rust guide](../rust/README.md#features-and-variants) owns +what each feature actually gates. Cargo features unify additively, so audit the entire consumer graph: another dependency enabling ORT defaults can reintroduce its optional download capability and is unsupported. `scripts/release/check-dependency-features.py` guards the workspace's default, @@ -167,13 +167,17 @@ release risk requires it. Repository hooks provide optional early local feedback when a contributor installs them. They can block that local Git operation, but Git bypass remains -operator authority and the hooks do not establish repository acceptance. CI -runs on pull requests targeting every branch, pushes to `main`, version-tag pushes, -and manual dispatches. Source quality and contract jobs run for every trigger; -fully optimized builds, packages, smoke checks, artifact uploads, and candidate -assembly run only when the selected ref is a `v*` version tag. A failing step -blocks its workflow and dependants; whether a workflow is required to merge is -external branch-protection state and is not asserted here. +operator authority and the hooks do not establish repository acceptance. + +The `Build` workflow runs on pull requests targeting every branch, pushes to +`main`, `v*` tag pushes, and manual dispatches. Source quality and contract jobs +run for every trigger. A *candidate run* is a `v*` tag push or a manual dispatch +with `build_candidates=true` (which also requires `expected_source`): only +candidate runs build optimized releases, packages, package smoke checks and the +release candidate. Pull requests and ordinary manual dispatches instead run the +bounded review jobs. A failing step blocks its workflow and dependants; whether +a workflow is required to merge is external branch-protection state and is not +asserted here. Setup, cache, download, upload, and artifact-transport steps are prerequisites, not independent evidence claims. The table lists the semantic gates that are @@ -187,34 +191,34 @@ intended to decide a property. | `check-merge-conflict` at installed `pre-commit` | Selected text has no unresolved merge-marker pattern; the pinned scanner is the oracle. | Git already rejects unresolved index entries; this catches accidentally staged marker text. | Local/bypassable; supported local pre-commit environment. | | `check-json` at installed `pre-commit` | Selected strict-JSON files outside the declared frontend/`.vscode` exclusions parse; the pinned parser is the oracle. | Package/tool consumers also parse files they read; this supplies earlier staged-file diagnosis for the remaining scope. | Local/bypassable; supported local pre-commit environment. | | `detect-private-key` at installed `pre-commit` | Selected staged text has no key signature recognized by the pinned detector. | Low-cost defense for known signatures; it does not prove secret absence or safe diagnostics. | Local/bypassable; supported local pre-commit environment. | -| Actionlint in `lint-workflows` | GitHub workflow structure and expressions satisfy Actionlint's model; Actionlint is the independent parser/static oracle. | Deeper than generic YAML parsing for `.github/workflows`; does not execute jobs. | Workflow-blocking on Linux CI for every CI trigger. | +| Actionlint in `lint-workflows` | GitHub workflow structure and expressions satisfy Actionlint's model; Actionlint is the independent parser/static oracle. | Deeper than generic YAML parsing for `.github/workflows`; does not execute jobs. | Workflow-blocking on Linux CI for every trigger. | | `check:dependency-ownership` in `lint-workflows` | Root owns no runtime/dev packages and each workspace declares the tool set the repository policy assigns it; manifests are inputs and the repository checker owns the mapping. | Package installation proves resolution, not declaration ownership. | Workflow-blocking, deterministic Node check on Linux CI; local on demand. | | `check:release-versions` in `lint-workflows` and release preparation | Root, frontend, Electron, and Rust workspace release versions are identical and version tags match them; their manifest values are the authoritative inputs. | Packaging may expose a mismatch later; this provides direct causal diagnosis before builds. | Workflow-blocking, deterministic Node check on Linux CI; locally required before release. | -| Cross-target Rust release build in `build-rust` | The non-Rustler workspace compiles in release mode for each declared target and produces the named native/RPC files; Cargo and file production are the oracle. | Rust quality checks debug/all-feature contracts; target builds uniquely prove target compilation/artifact creation, not runtime support. | Version-tag-only on Linux x64, macOS arm64, and Windows x64; Windows runs in `windows-release`. | -| Cross-platform Rust release tests in `build-rust` | The non-Rustler workspace tests pass in release mode on each runner OS; test assertions are the behavior oracles. | Linux debug tests overlap intentionally; runner-specific execution can expose OS/path/process behavior. | Version-tag-only on Linux, macOS, and Windows. | +| Attribution and release-script tests in `lint-workflows` (`check-attribution.cjs` default and `--features s3`, `node --test scripts/release/*.test.mjs`, `test_s3_build_provenance.py`) | Checked-in notices match the current default and S3 dependency graphs; release scripts satisfy their unit assertions. | Packaging re-checks attribution later; this diagnoses stale notices before any build. | Workflow-blocking on Linux CI for every trigger. | | `scripts/rust/check.sh` in `rust-quality` | Formatting, all-target/all-feature compilation, Clippy warnings, workspace tests, doctests, and no-default compilation each satisfy their named tool/assertion contract. | Complements release target builds with static, debug, docs, and feature evidence; excludes the separately owned Rustler host claim. | Workflow-blocking on representative Linux CI; local aggregate command. | -| Frontend ESLint in `build-frontend` | Type-aware and frontend lint rules accept the configured source scope; ESLint's AST/type analysis is the oracle for only those rules. | TypeScript overlaps type facts, not lint-specific source/interaction policy. | Workflow-blocking on representative Linux CI; local on demand. | -| Frontend `check:types` in `build-frontend` | The configured renderer TypeScript program type-checks without emit; the compiler is authoritative for static consistency. | Build also type-checks while emitting; the no-emit command gives direct diagnosis before tests/build. | Workflow-blocking on representative Linux CI; local on demand. | -| Frontend `test:run` in `build-frontend` | Vitest component/unit assertions pass in jsdom or their selected simulation. | Decides local renderer behavior only; representative browser/Electron workflows remain separately owned. | Workflow-blocking on representative Linux CI; local on demand. | -| Frontend default build in `build-frontend` | Vite emits the default renderer bundle consumed by Electron; build completion and output production are the oracle. | Does not prove renderer behavior or library-only mode. | Version-tag-only on Linux CI; output is an input to all Electron package jobs. | -| `test:launcher` in `build-frontend` | Shared CLI parsing, closed platform selection, action delegation, package-manager invocation, wrapper delegation, and controlled max/grace/force/process-tree outcomes satisfy their Node and child-process assertions. | Release smoke traverses a real startup path; the focused suite diagnoses contract and cleanup failures but Linux execution does not prove Windows or macOS process behavior. | Workflow-blocking on representative Linux CI for every CI trigger; local on demand. | -| Torch Ruff lint and format checks in `torch-quality` | Python source satisfies the selected Ruff diagnostics and formatting projection. | Static support only; unit and real-runtime claims remain distinct. | Workflow-blocking on representative Linux CI; local on demand. | -| Torch unit suite in `torch-quality` | Sidecar unit assertions pass with their declared local fakes/substitutes. | Does not prove ASGI, middleware, model loading, GPU, or inference in a resolved Torch environment. | Workflow-blocking on representative Linux CI; local on demand. | -| Staged release backend plus `launcher.sh --release-smoke` in `verify-launcher` | The Linux release layout builds and the Electron process starts under the recorded Xvfb smoke conditions for its bounded observation. | Build/startup only; no user workflow or non-Linux runtime claim. | Version-tag-only on Linux Xvfb CI. | -| Electron ESLint in `build-frontend` | Electron TypeScript/JavaScript satisfies the configured lint rules. | Deterministic lint runs once; platform tests retain target-specific value. | Workflow-blocking on representative Linux CI for every CI trigger. | -| Electron `test` in `build-frontend` and packaging jobs | TypeScript emits and Node tests prove the current IPC allowlist/request, launcher, and process-boundary assertions. | Representative Linux runs on every trigger; version tags additionally run the package input and target-specific tests on each packaging OS. | Workflow-blocking on representative Linux for every trigger and version-tag-only on the packaging matrix. | -| Electron-builder package step in `build-electron` | Each runner produces an installer/archive accepted by electron-builder for its configured target. | Does not prove installation, startup, contents, signing, or user behavior; those remain platform/release claims. | Version-tag-only on Linux, macOS, and Windows; the artifact-plan inventory rejects missing, empty, duplicate, and unexpected installers. | -| `smoke-linux-packages.py` in `build-electron` | Both exact Linux installers extract, contain resources matching build inputs, and start their bundled RPC server. | Does not prove system installation, desktop user flows, signing, or packaged model inference. | Version-tag-only on Linux; native macOS and Windows use their respective installer smoke checks. | -| `smoke-windows-packages.py` in `windows-release` | The NSIS candidate installs, installed resources match build inputs, and the installed RPC, installed desktop, and portable desktop start successfully. | Native installation/startup evidence; signing, SmartScreen, interactive workflows, and packaged inference require separate acceptance. | Version-tag-only on native Windows x64; both Windows installers are required for combined candidate assembly. | - -The workflow runs no-default core and RPC tests in separate Cargo invocations on -every trigger. For version tags only, it also builds and smokes a headless -release without the desktop toolchain. `release-candidate` then assembles only -the required installer and archive set in `scripts/release/artifact-plan.json` -and generates SHA-256 checksums after all required QA jobs succeed. The separate -tag-only `windows-release` job emits both Windows installers and checksums only -if its native checks pass. Candidate assembly never publishes a GitHub release. -See [Releasing](../RELEASING.md) for the remaining publication obligations. +| No-default and S3 tests in `headless` | `pumas-library` and `pumas-rpc` pass without inference plugins (also with `hf-client`, and with `s3` for the reader, acquisition and prefix tests); the Linux audio read-confinement proof passes; the inference-disabled release backend builds and `smoke-rpc.py --inference-disabled` sees health without inference routes. | The no-default graph is otherwise compiled only by `check.sh`; this executes it. | Workflow-blocking on Linux CI for every trigger. | +| Frontend ESLint, `check:types` and `test:run` in `build-frontend` | Lint rules, the no-emit TypeScript program and Vitest component/unit assertions pass; each tool is the oracle for only its own rules. | Decides local renderer behavior only; representative browser/Electron workflows remain separately owned. | Workflow-blocking on representative Linux CI for every trigger; local on demand. | +| Desktop contract gates in `build-frontend` (`check:desktop-contract`, `test:desktop-contract-generator`, `test:desktop-contract-conformance`, frontend `test:desktop-contract`) | Checked-in generated decoders equal a fresh export from current Rust source and `electron/contracts/`; constructor-produced fixtures pass the generated validators through the real bundled preload and renderer. | Typecheck proves only static consistency; these prove the shipped decoders match the producer. | Workflow-blocking on representative Linux CI for every trigger. | +| Electron ESLint, `validate` and `test` in `build-frontend` | Electron TypeScript satisfies lint and type rules; Node tests prove the IPC allowlist/request, launcher, and process-boundary assertions. | Packaging jobs re-run `test` on each packaging OS for target-specific value. | Workflow-blocking on representative Linux CI for every trigger; also on each packaging OS in candidate runs. | +| `test:launcher` in `build-frontend` and packaging jobs | Shared CLI parsing, closed platform selection, action delegation, package-manager invocation, wrapper delegation, and controlled max/grace/force/process-tree outcomes satisfy their Node and child-process assertions. | Release smoke traverses a real startup path; Linux execution does not prove Windows or macOS process behavior. | Workflow-blocking on Linux CI for every trigger; also on each packaging OS in candidate runs. | +| Frontend default and library-only builds in `build-frontend` | Vite emits both renderer bundles; the default bundle is the input to every Electron package job. | Does not prove renderer behavior. | Candidate runs only, on Linux CI. | +| Torch Ruff, release-contract and unit tests in `torch-quality` | `torch-server` and `scripts/release` satisfy Ruff lint and format; release-metadata and headless-owner unit tests pass; sidecar unit assertions pass with their declared fakes. | Does not prove ASGI, middleware, model loading, GPU, or inference in a resolved Torch environment. | Workflow-blocking on native Linux, Windows and macOS for every trigger. | +| Native cargo tests in `torch-quality` | Focused `pumas-library`, `pumas-app-manager` and `pumas-rpc` tests for Torch selection, acquisition and import custody, retained-download reconciliation, registry ownership, process ownership, HTTP drainage and RPC shutdown pass on each host OS. | Linux workspace tests overlap; these expose OS path, handle and process behavior on every trigger rather than only in candidate runs. | Workflow-blocking on native Linux, Windows and macOS for every trigger. | +| `review-inference-linux` | The exact review head builds through the strict inference producer, the extracted archive matches its authenticated build identity, and a deterministic untrained ONNX graph imports, loads, executes and unloads through it. | A review-only archive; it cannot satisfy the release inventory or qualify pretrained models or other OSes. | Pull requests and ordinary manual dispatches only, on Linux CI. | +| `review-audio-dependencies` | The frozen non-model audio dependency cohort executes under real Linux confinement and its controlled session lifecycle passes. | Does not qualify a pretrained speech model. | Pull requests and ordinary manual dispatches only, on Linux CI. | +| `torch-native-e2e` | Managed Python and Torch CPU install, restart and sidecar lifecycle pass through the real native RPC (`torch-managed-python-acceptance.py`). | Real-network install evidence; not CUDA/MPS or image adapters. | Ordinary manual dispatches and `v*` tags (not `build_candidates` runs) on native Linux, Windows and macOS. | +| Release target builds and tests in `build-rust` and `windows-release` | The non-Rustler workspace compiles warning-free and in release mode for each target, its tests pass under the `ci-test` profile, and the staged backend starts with the pinned ONNX Runtime (`onnx_runtime_probe.py`, `smoke-rpc.py`). | Linux debug tests overlap; runner-specific execution exposes OS behavior; startup is not inference. | Candidate runs only: Linux x64 and macOS arm64 in `build-rust`, Windows x64 in `windows-release`. | +| Headless archives in `headless-rpc` and `headless-inference` | Each no-inference and inference headless archive is produced with exactly the inventory entry `check-artifacts.mjs` expects; the inference producer binds source, schema and runtime bytes and runs authenticated owner startup and graceful shutdown, and an untrained synthetic ONNX graph runs through each extracted inference archive. | No pretrained-model or embedding-quality evidence. | Candidate runs only, native on Linux x64, macOS arm64 and Windows x64. | +| Electron-builder package steps in `build-electron`, `build-electron-no-inference`, `windows-release` and `windows-no-inference` | Each runner produces the full or no-inference installers the artifact plan names; `check-artifacts.mjs` rejects missing, empty, duplicate, and unexpected files. | Does not prove installation, startup, contents, signing, or user behavior. | Candidate runs only, on Linux, macOS, and Windows. | +| Package smoke checks (`smoke-linux-packages.py`, `smoke-macos-package.py`, `smoke-windows-packages.py`, each with `--variant no-inference` for that line) | Linux installers extract with resources matching build inputs and start their RPC; the macOS DMG copy and Windows NSIS install match build inputs and start RPC and desktop (Windows also the portable executable); no-inference packages lack inference routes. | Native startup evidence; signing, notarization, SmartScreen, interactive workflows, and packaged inference require separate acceptance. | Candidate runs only, on each native OS. | +| Staged release backend plus `launcher.sh --release-smoke` in `verify-launcher` | The Linux release layout builds and the Electron process starts under the recorded Xvfb smoke conditions for its bounded observation. | Build/startup only; no user workflow or non-Linux runtime claim. | Candidate runs only, on Linux Xvfb CI. | + +`release-candidate` runs only after every candidate-run QA job succeeds. It +checks that the downloaded set is exactly the sixteen files in +`scripts/release/artifact-plan.json`, then writes SPDX inventories, unsigned +provenance, notices and SHA-256 checksums over the final files. Candidate +assembly never publishes a GitHub release. See [Releasing](../RELEASING.md) for +the remaining publication obligations. ### Pending Higher-Fidelity Claims diff --git a/docs/README.md b/docs/README.md index cba2d3aca..1924e7a3f 100644 --- a/docs/README.md +++ b/docs/README.md @@ -13,13 +13,37 @@ available through Git history rather than in the working tree. | [Development](DEVELOPMENT.md) | Setup, standards routing, and verification | | [Contributing](../CONTRIBUTING.md) | Change, planning, documentation, and commit expectations | | [Releasing](../RELEASING.md) | Current release flow, required evidence, and known gaps | -| [Security](SECURITY.md) | Reporting and current trust-boundary guidance | +| [Security](SECURITY.md) | Reporting, trust boundaries, and accepted advisory exceptions | | [Native bindings](native-bindings.md) | Binding status, generation, and packaging | +| [Opening an older library](library-upgrade.md) | The one-time library metadata upgrade | +| [Package-facts fingerprint](package-facts-fingerprint-canonicalization.md) | Canonical package-facts fingerprint | +| [Changelog](../CHANGELOG.md) and [0.8.0 release notes](release-notes-0.8.0.md) | What changed, per release | + +## Contracts + +Consumer-facing contracts: + +- [Model operations v1](contracts/model-operations-v1.md) and [model lookup v1](contracts/model-lookup-v1.md) +- [Image-to-text](contracts/image-to-text-v0.8.md), [image generation](contracts/image-generation.md) and [generation lifetime](contracts/generation-lifetime.md) +- [Local HTTP consumer](contracts/local-http-consumer.md), [admission fence](contracts/local-http-admission-fence.md), [owner retention](contracts/local-owner-retention.md), [start authority](contracts/local-start-authority.md) and [inference-enabled bootstrap](contracts/inference-enabled-bootstrap.md) + +Internal boundaries: + +- [Artifact acquisition](contracts/artifact-acquisition.md), [Hugging Face model-detail cache](contracts/hf-model-detail-cache.md) and [retained download reconciliation](contracts/download-location-reconciliation.md) +- [Torch provider protocol](contracts/torch-provider-protocol.md) +- Audio: [custody foundation](contracts/audio-custody-foundation.md), [owned transport](contracts/owned-audio-transport.md), [owned lifecycle](contracts/owned-audio-lifecycle.md), [installed constructor](contracts/installed-audio-constructor.md), [installed session](contracts/installed-audio-session.md), [Cohere qualification](contracts/cohere-native-qualification.md) and [Cohere cohort](contracts/cohere-native-cohort.md) +- [Image-to-text native qualification](contracts/image-to-text-native-qualification.md) ## Durable Decisions - [ADR 0001: ONNX Runtime provider model](adr/0001-onnx-runtime-provider-model.md) - [ADR 0002: Torch image provider protocol](adr/0002-torch-image-provider-protocol.md) +- [ADR 0003: Explicit local acceptance of moved legacy download outputs](adr/0003-download-location-reconciliation.md) +- [ADR 0004: A model's category is metadata chosen by use](adr/0004-model-category-as-metadata.md) + +## Runbooks + +- [Recover a failed download whose files moved](runbooks/download-location-reconciliation.md) ## Point-in-Time Audits @@ -28,12 +52,28 @@ available through Git history rather than in the working tree. Audits describe the named repository and standards commits. They are evidence and remediation inputs, not current operating instructions. +## Product Briefs + +Direction, not commitments. Each brief states what of it exists today. + +- [Hugging Face discovery cache](breif/hf-cache.md) +- [Generic model fetching (S3)](breif/s3-model-fetch.md) +- [Unified inference gateway](breif/unified-inference-gateway.md) +- [Intent, discovery and distributed model management](breif/intent-discovery-distribution.md) +- [Capability discovery and resolution fabric](breif/capability-discovery-fabric.md) +- [Agent interaction and MCP layer](breif/agent-interaction-mcp.md) + ## Active and Planned Work -- [Artifact acquisition](plans/artifact-acquisition/plan.md) — Q1 shared HTTP acquisition is active; AQ-HTTP is not ready -- [Runtime installations and model adapters](plans/runtime-installations-and-model-adapters/plan.md) — runtime implementation remains gated by acquisition evidence -- [2026-09-03 current-standards remediation program](plans/current-standards-remediation-2026-09-03/plan.md) -- [Local intent API and transport-independent domain language](plans/local-intent-api-2026-09-12/plan.md) — complete within the recorded local scope; native resolution, acquisition, durable declarations and existing IPC/RPC projections accepted; nodes/fleets/new networking deferred until after the next release +No plan is being executed right now. These hold open acceptance gates: + +- [Artifact acquisition](plans/artifact-acquisition/plan.md) — Q1 (HTTP) and Q3 (S3) ship in 0.8.0; AQ-HTTP and AQ-S3 acceptance pending; Q2 not started +- [Runtime installations and model adapters](plans/runtime-installations-and-model-adapters/plan.md) — planned; R1 waits on AQ-HTTP acceptance +- [Download-location reconciliation](plans/download-location-reconciliation/plan.md) — implemented (ADR 0003); composed and artifact evidence pending +- [Torch cross-platform runtime management](plans/torch-cross-platform-runtime-management/plan.md) — packaged and Windows/macOS install gates open; the managed-Python license blocker is open +- [2026-09-03 current-standards remediation program](plans/current-standards-remediation-2026-09-03/plan.md) — open issues not yet re-verified against 0.8.0 +- [Hugging Face discovery cache readiness](plans/hf-discovery-cache/readiness.md) — deferred checklist for the shared cache +- Design records still linked as current: [operating owner custody](plans/operating-owner-custody-design.md) and [local discovery bootstrap](plans/local-discovery-bootstrap.md) An implementation invocation must name the exact focused `plan.md` and an explicit `start`, `continue`, or `verify` operation. Plans remain temporary diff --git a/docs/SECURITY.md b/docs/SECURITY.md index e4beb29eb..d04b5f8e3 100644 --- a/docs/SECURITY.md +++ b/docs/SECURITY.md @@ -16,9 +16,9 @@ maintainer explicitly announces otherwise. - Electron validates RPC method names and some request shapes before forwarding to the Rust sidecar. Coverage is incomplete; renderer TypeScript types are not a security boundary. -- `pumas-rpc` binds to loopback by default and limits body size and concurrent - requests. -- `pumas-rpc` has no supported LAN mode. Its receiving HTTP boundary rejects +- `pumas-rpc` refuses to bind any non-loopback address and limits body size + and concurrent requests. +- `pumas-rpc` has no LAN mode. Its receiving HTTP boundary rejects non-loopback Host values, non-loopback or malformed Origin values, duplicate authority/origin headers, and originless cross-site browser requests before dispatch. CORS controls response visibility and is not authorization. @@ -53,8 +53,14 @@ projection rather than serializing errors directly. ## Dependency and Release Evidence Authoritative dependency inputs are the checked-in Cargo and pnpm lockfiles plus -the Python requirements under `torch-server/`. The Torch production -requirements are not currently resolved into a reproducible lock. +the Python requirements under `torch-server/`. Only the bundled Torch preset +(Linux x86_64, CPython 3.12) installs from `torch-server/runtime/requirements.lock`, +a hash-pinned lock for that one recipe. Every other managed Torch install +resolves its own dependencies when it is created, so the checked-in lock does +not describe it: audit that installation's `runtime/requirements.txt`, +`runtime/resolution.json` and `runtime/pip-resolution.json` instead. +`torch-server/requirements.txt` is an unpinned direct-development input, not a +shipped dependency set. Before a release, run current vulnerability and license checks against the resolved shipped dependency closure for all three ecosystems. Record tool @@ -65,9 +71,20 @@ the current release workflow. Useful local tools include `cargo audit`, `npm audit`, and `pip-audit`, but a tool result is meaningful only when its inputs match the final artifact. +### Accepted advisory exceptions + +Last reviewed on the 0.8.0-rc.1 lockfiles (2026-10-14); every version below is +still in the 0.8.0 lockfiles. Re-confirm each one with the release's own +checks, and drop an entry once the dependency changes. + +| Dependency | Advisory | Why it is accepted | +| --- | --- | --- | +| `sprintf-js` 1.1.3 | GHSA-hp3w-g68c-fv3c | Build-only, through electron-builder; not shipped. Kept without a suppression. | +| `lru` 0.16.4 | RUSTSEC-2026-0253 | Only in `s3` builds, through `aws-sdk-s3` 1.137.0. The trigger is absent: the key is a `String` with no custom `Drop`, and `pop` is never called. | +| `http-cache-semantics` 4.3.0 | GHSA-ch52-4w7c-c8xp | Disputed upstream. | +| `bincode` 1.3.3, `instant` 0.1.13, `paste` 1.0.15 | Unmaintained notices | Pulled in by UniFFI tooling, `notify` and macro dependencies respectively; no known vulnerability. | + ## Current Security Work -Security and boundary findings are prioritized in the +Open security and boundary findings are tracked in the [current standards audit](audits/current-standards-2026-09-03/README.md). -Credential-safe diagnostics and the RPC/LAN threat model are the first required -remediation slice. diff --git a/docs/adr/0003-download-location-reconciliation.md b/docs/adr/0003-download-location-reconciliation.md index 468a2ba5a..7930eb416 100644 --- a/docs/adr/0003-download-location-reconciliation.md +++ b/docs/adr/0003-download-location-reconciliation.md @@ -1,6 +1,6 @@ # ADR 0003: Explicit local acceptance of moved legacy download outputs -Status: Accepted design, implementation in progress. +Status: Accepted and implemented (0.8.0). Native `retained_location` tests run in CI on Linux, macOS and Windows; composed and artifact acceptance evidence remains open. Historical reclassification moved a live download workspace without rebinding its admitted attempt. Existing shared mutation authority prevents recurrence, diff --git a/docs/adr/0004-model-category-as-metadata.md b/docs/adr/0004-model-category-as-metadata.md new file mode 100644 index 000000000..07121f5d9 --- /dev/null +++ b/docs/adr/0004-model-category-as-metadata.md @@ -0,0 +1,66 @@ +# ADR 0004: A model's category is metadata chosen by use + +Status: Accepted and implemented (0.8.0). + +Affected boundaries: `ModelType` in +`rust/crates/pumas-core/src/model_library/types.rs`, the shared resolver +(`model_type_resolver.rs`, `library.rs`), classification rule tables in the +model index (`index/model_index/governance.rs`), reclassification and +migration (`library/migration.rs`), the `set_model_category` RPC +(`rust/crates/pumas-rpc/src/contract.rs`) and the desktop library grouping +(`frontend/src/utils/libraryModels.ts`, +`frontend/src/components/ModelCategoryControl.tsx`). + +## Context + +Library models were grouped by a single detected type that was also the first +segment of their folder and ID. Several real models were grouped wrongly: Kev +and Laya (decision models) as LLMs because Hugging Face tags them +`text-classification`; LTX-2.3 (video) as audio or embedding; Granite Speech +(speech-to-text) as embedding because its repository tag said +`feature-extraction` while its config said `GraniteSpeechNarForASR`. Fixing a +category moved the model's folder and changed its ID, which broke served-model +IDs and runtime profiles. Models also have arbitrary inputs and outputs, which +one type cannot describe. + +## Decision + +- The category is the one use a person would choose the model for. Other + inputs and outputs are shown as modality badges, not extra categories. + Categories: `llm`, `vlm`, `decision`, `embedding`, `reranker`, `diffusion`, + `video`, `audio`, `vision`, `unknown` (`ModelType::ALL` is the one list). +- The category is metadata. Changing it never moves a folder or changes an ID; + the first ID segment is a storage bucket frozen at import. Only a family + change still moves a model. New imports file under their detected category. +- Evidence precedence: a person's choice (`model_type_resolution_source: + "user"`) > file and architecture facts (GGUF `.decision.type`, + `…ForASR`) > the Hugging Face task tag > name and file hints > the storage + bucket. A lower source that disagrees with a strong one adds a + `model-type-hint-conflict` review reason instead of overruling it, and the + model's task and modalities follow the category. +- Output decides the use: video output → `video`; image → `diffusion`; + decision → `decision`; vector → `embedding`; speech in or out → `audio`; + text with image input → `vlm`; text → `llm`. +- LoRA/PEFT packages are marked as adapters and take the category of the task + they adapt. +- `set_model_category` records a person's choice, which re-scans keep. Clearing + it re-detects the category in place. `unknown` cannot be chosen. + +## Alternatives considered + +- **Keep the category in the path and move models on a fix.** Rejected: it + breaks IDs that consumers and runtime profiles hold. +- **Several categories per model.** Rejected: grouping needs one answer; the + modality badges carry the rest. +- **Trust the task tag first.** Rejected: tags are set per repository and were + wrong for each misgrouped model above, while file facts were right. + +## Consequences + +- Opening a library updates its system rule tables in place; the next refresh + re-detects categories without moving anything. +- A model reports only the modalities its metadata records. An adapter with no + task or base-model evidence (for example the LTX-2.3 IC-LoRA) stays under + image generation until a person chooses its category. +- New categories are additive on the wire: the desktop contract is regenerated, + and HTTP consumers must ignore enum values they do not use. diff --git a/docs/audits/baseline-followups-2026-10-03.md b/docs/audits/baseline-followups-2026-10-03.md deleted file mode 100644 index 7a9283ff4..000000000 --- a/docs/audits/baseline-followups-2026-10-03.md +++ /dev/null @@ -1,364 +0,0 @@ -# Remaining import baseline work - -These follow-ups remain required before S3/network exposure. They are separate -from the net-improvement integration so an unsafe cleanup or inferred download -expansion is not added as a review shortcut. - -## B1: Own ordinary/progress import staging through every outcome - -Affected owners: `model_library/importer.rs`, `import`, `import_with_progress`, -`create_temp_import_dir`, and the copy/hash/publication phases. - -The progress path already returned through `?` after a failed blocking copy on -main `e37bbf4`, retaining its temporary directory. The ordinary path also ignored -path-based cleanup errors. Exclusive creation now safely refuses additional -filesystem-equivalent names (including Unicode equivalence); a refusal can -expose that pre-existing incomplete cleanup contract. The refusal must remain. - -Required repair: - -- Hold the created staging directory's physical identity and grant; do not delete - a replacement path or infer ownership from a name/nonce alone. -- Carry custody through copying, hashing, publication, caller cancellation and - shutdown. Define cooperating-writer and platform boundaries explicitly. -- Preserve the original operation failure and any cleanup failure. Distinguish - published output from retained/cleanup-pending workspace status. -- Exercise ordinary and progress imports, normalized and filesystem-equivalent - collisions, copy/hash failures, cancellation, replacement sentinels, renamed - original directories, successful publication, and platform-specific cleanup. - -Do not implement this with an ignored `remove_dir_all(temp_dir)` result. No -existing store is migrated or cleaned merely by tracking this work. - -### B1 implementation and remaining acceptance gates - -The copied-import implementation is in `model_library/importer/staging.rs`. -Ordinary, progress and copied-Diffusers imports share one admitted -`RuntimeTasks::run_owned` operation with one awaited `run_blocking` producer. -The root grant and stage capability remain inside that producer through -preparation, no-replace publication, and cleanup. No cleanup can race a live -copy/hash waiter. Progress uses nonblocking best-effort delivery. - -`DownloadDestinationRoot` exclusively creates a private stage, and -`DownloadRecoveryDestination` owns its no-follow file operations, physical -identity checks, publication and deletion. The shared rename helper now records -successful publication separately from later durability/visibility failure. -The legacy relocation wrapper preserves its previous error interface. Runtime -binding projection continues through held metadata with the final model ID. - -This excludes competing cooperating Pumas writers through the existing root -grant. It does not claim protection against arbitrary hostile mutation by -another process with equal filesystem authority. Observed root, ancestor or -stage replacement refuses publication/deletion. A renamed original may remain -outside its original location; neither a nonce scan nor pathname reacquisition -is recovery authority. Failed cleanup is a terminal explicit retained/unknown -outcome, not a promised automatic retry. Existing abandoned stages are not -migrated or deleted. - -Consumer disposition: - -- Production copied-import calls are `api/models.rs::import_model` and - `api/state.rs` dispatch, using the importer composed in `api/builder.rs`. -- RPC, UniFFI and Rustler route import calls through that owning API. Inspected - Pantograph production-dispatch UniFFI/Rustler adapters also call - `PumasApi::import_model`; its direct `ModelLibrary::new` fixture is read-only - update-feed setup, not copied-import admission. -- In-repo importer fixtures now install the real `RuntimeTasks`, destination - root and `LibraryMutationAuthority` composition. No test-only runtime fallback - is exposed to production. -- The new Config refusal is specifically for copied imports. External-reference - registration (`import_external_diffusers_directory`), in-place import, - download finalization and recovery retain their existing owners/contracts and - require separate ownership review; this slice does not expand or guard them. -- B2 below is unchanged, including its download-authorization limitation. - -Independent review follow-ups: - -- Copied Diffusers layout includes exclusively created, held empty directories. - Source validation selects the copy strategy only. The shared validator reads - `model_index.json` and referenced components through staged capabilities before - metadata may claim Ready/Valid. Empty-component and changed-staged-index - regressions reopen the published result through the normal reader. -- Import cleanup validates every observed descendant-directory binding and the - complete directory inventory before deleting any payload. Unknown or replaced - descendants retain the workspace and replacement sentinel. Physical identity - is used when readdir spelling differs on Unicode-normalizing filesystems. - This is import-specific; generic download deletion retains its prior contract. -- Publication repeats the complete held-directory and copied-file presence/size - proof after the final metadata notifier and test hook. It revalidates staged - Diffusers contents and requires exact `model_index.json` bytes to match the - snapshot that produced metadata/runtime hints. No external callback occurs - between this final proof and rename. A valid, same-size index rewrite is still - refused and retained after payload evidence was captured; removed/replaced empty components retain unknown custody - without deleting replacement sentinels. This is the cooperating-writer grant - contract, not protection against arbitrary equal-authority hostile mutation. -- Copied metadata preserves final model ID, final bundle source/entry paths, - generic recommended-backend normalization (shared with `save_metadata`), task - projection, custom runtime bindings and active dependency references. The - existing record-type fallback only applies when metadata lacks model_type; - copied metadata explicitly supplies it. External-reference revalidation does - not apply to the LibraryOwned copied path. -- Held metadata writes invoke the existing write notifier using display paths - solely as watcher observations. They never derive filesystem authority from a - callback path. Pending and final Ready metadata writes both notify before their - last payload proof. ONNX persisted/indexed recommendations and notifier - replacement-sentinel regressions cover these compatibility boundaries. -- New stages have no previous authoritative metadata to back up. Custom metadata - projection is prepared before publication; an unchanged post-publication - projection needs no replacement or backup. No existing model metadata is - overwritten: final directory publication remains exclusive. - -### Native Windows publication correction - -A native Windows diagnostic established that cached descendant directory handles -caused `AccessDenied(5)` at directory rename; releasing those handles let the same -held-parent rename succeed. The production correction is import-specific: - -1. Stream SHA-256/BLAKE3 while copying. Retain the configured root/stage IDs, - created directory identities (including empty components), output descriptor - identities, lengths and digests. Check the complete namespace against that - evidence without rereading payload bytes. -2. Exactly four root documents are mutable owner documents outside payload - evidence: `metadata.json`, `metadata.json.bak`, `overrides.json`, and - `.pumas_import_publication.json`. Original source names, normalized destination - names, and native filesystem-equivalent aliases are refused. Ordinary metadata - backup behavior is preserved. Overrides currently use `keep_backup=false`; - `overrides.json.bak` is not silently excluded. UUID temporary files created by - the atomic writers receive no wildcard exemption. -3. Persist Pending receipt and Pending/Invalid metadata. Complete structural - validation, release only descendants, and perform held no-replace rename. - Rebind the exact recorded IDs, sizes and complete namespace after success or - failure. A changed binding cannot authorize cleanup. Successful native rename - never becomes rollback authority. -4. Keep receipt and index Pending while dependency projections and the final - metadata notifier complete. Then perform **one full destination hash pass**, - including exact namespace/binding and bundle-content checks. A private proof - is consumed by a callback-free owner: durable Confirmed receipt, durable Ready - metadata, and conditional final index commit. Any uncertain outcome reports - the retained publication and does not claim success. - -Primary metadata and receipt share an explicit **16 MiB document limit**, enforced -both before producer publication and by bounded no-follow observation. There is -no truncation or fallback to legacy on malformed/oversized protocol evidence. -Every public readiness decision requires canonical primary metadata, receipt/root -identity, and matching indexed publication state. A Ready index or cached summary -cannot conceal missing, malformed, identity-erased, or replaced canonical metadata. -Backups and effective overlays cannot replace the primary publication gate. - -Conditional projections capture the source row before filesystem observation and -compare it inside a short SQLite transaction. No filesystem operation, callback, -root-grant acquisition or await occurs under that transaction. Stale Pending -watcher/rebuild results cannot overwrite producer Ready; only the producer may -advance its existing Pending row. A canonical-damage observation can invalidate -only the Ready row it observed. SQL update events are published after commit. -Deep rebuild preserves all protocol rows and conditionally prunes legacy rows, -so it cannot erase a Pending fence and subsequently cold-adopt its Ready file. - -A visible Ready file after unacknowledged final metadata durability already has a -verified durable Confirmed payload receipt. The import still reports uncertainty -and its existing Pending index remains fenced. With no indexed owner, discovery -may adopt an **already Ready** primary only after full payload verification. -A failed cold proof is reported as unadopted, without creating a permanent Pending -row from a temporary observation. Actual Pending primary/index state never -advances automatically. Ordinary metadata and override edits require finalized -index admission first, so legitimate atomic writer temporary files cannot race a -cold scan. Existing Ready rows use bounded document observations without scanning -those temporary files; unknown temporary-looking names still fail cold proof. - -Readiness integration includes canonical/effective metadata, public list/get/search -projections, execution descriptors and package reinspection, both artifact -resolution modes, `PumasReadOnlyLibrary`, public selector/summary snapshots, -watcher/index projection, startup/ordinary/deep rebuild, metadata/review/override -edits, in-place import, and owned metadata writers in reclassification, duplicate -maintenance and migration. Snapshot SQL captures publication fields with each row; -filesystem checks happen after the connection lock is released. Raw `ModelIndex` -methods remain trusted index-only primitives, not filesystem readiness observers. -Plain pathname/file enumeration helpers do not assert execution readiness. - -Cross-root merge refuses new protocol assets before moving their files. An -explicit re-publication workflow is not provided. Same-root reclassification and -migration retain the receipt identity and use a conditional owned index-ID remap, -including durable references. Its original `model_id` and stage pathname are -provenance; physical root/stage identities are authority. A UUID still indexed at -another model ID blocks cold adoption at a moved path. Passive damage observations -cannot downgrade a source protected by the existing mutation claim during its -owned transfer. The public reclassification regression covers this transition. - -A receipt with missing, malformed or identity-erased metadata remains diagnostic -protocol data. It is not adopted as a legacy orphan. Existing traversal recognizes -receipt-backed directories; orphan traversal prunes `.tmp_import_` subtrees. -In-place PreserveExisting checks the same Pending index fence before reporting -idempotent success. No database migration or live-store repair occurs. - -Operational cost: successful copied imports hash during the source copy and read -the destination payload once for final verification. The streamed digests also -supply ordinary primary-file metadata, eliminating its separate hash read. There -are multiple inexpensive namespace/identity walks and bounded metadata/config -reads. Streaming replaces potential kernel copy offload and adds digest CPU work; -throughput still needs measurement. Exceptional cleanup can add a verification -pass. Corruption discovered after rename leaves published Pending data instead of -an unpublished cleaned workspace. Cold adoption/rebuild without a matching Ready -row hashes the payload; existing Pending rows stay fenced, and matching Ready rows -use bounded canonical/receipt reads. Public cached snapshots therefore add small -filesystem observations for protocol evidence, never full payload scans. Ongoing -payload freshness after successful confirmation remains package inspection's job. - -There is **no supported reconciliation/finalization API for retained Pending -imports in this change**. Only the admitted live producer may finish its own -transition. Terminal Pending data requires manual diagnosis; retaining a receipt -is not a promise of automatic repair or a recommendation to delete/reimport it. -The root grant excludes cooperating writers; no arbitrary equal-authority hostile -mutation guarantee is claimed across handle release or any later filesystem edit. - -Revision regressions cover canonical damage with pre-existing Ready cached facts -before any reindex; stale watcher and independent-connection conditional writes; -Pending preservation through deep rebuild and in-place retry; override edits, -backups and temporary-file cold admission; shared document bounds; original and -normalized reserved names; source/target generation preservation during the public -same-root reclassification path; and pre-mutation cross-root merge refusal. - -Compile-plausibility audit: in-repo `ModelMetadata` construction uses defaults or -struct updates; the new optional field requires no exhaustive literal repair. -`ModelMetadata` has no UniFFI/contract-schema derive. RPC stored/effective metadata -is already `serde_json::Value` with `DesktopJsonValue` object properties; the new -identity contains only a version integer, UUID string and boolean. No generated -binding enum/schema is changed. Hosted contract generation remains a required gate. - -Acceptance remains **verifying**, not accepted: local `rustfmt` parsing and -`git diff --check` passed; no Rust compilation or tests were run locally because -of the shared resource budget. Parent-owned hosted CI and independent review -must qualify the exact proposed commit. Commands from `rust/`: - -Independent source review cleared the frozen production implementation at -`5e9c47ef7e57ff294a57bf1c13aec38aa595af61` after finding and correcting nested -replacement cleanup, empty-component/staged-validation, generic backend metadata -and final callback/publication issues. Native CI explicitly runs copied-import, -held-destination and metadata-projection suites. A Windows-only real open-handle -fixture forces cleanup failure after copying a read-only source, checking both -original and cleanup errors, preserved source/output attributes and retained -workspace/shutdown failure. This is prepared coverage, not yet a native pass. - -```sh -cargo test -p pumas-library --no-default-features --features hf-client --lib copied_import -- --nocapture -cargo test -p pumas-library --no-default-features --features hf-client --lib model_library::importer -cargo test -p pumas-library --no-default-features --features hf-client --lib model_library::download_recovery -cargo test -p pumas-library --no-default-features --features hf-client --lib model_library::library -cargo test -p pumas-library --no-default-features --features hf-client --lib index::model_index::model_selector_snapshot -cargo test -p pumas-library --no-default-features --features hf-client --lib api::runtime_tasks -cargo clippy -p pumas-library --no-default-features --features hf-client --all-targets -- -D warnings -``` - -Run native Linux, macOS and Windows jobs. Capture the case/Unicode equivalence -oracle output for the actual mounted filesystem; a filesystem reporting distinct -names does not qualify an equivalent-name refusal claim on another filesystem. -Required native gates also include Unix mode/umask, no-replace rename, post-rename -fsync failure, Windows held-handle/reparse replacement and read-only output -semantics. Source inspection, formatter success, cross-compilation and a native -Linux pass are not Windows/macOS runtime qualification. Existing generic held -capability replacement tests and new import integration fixtures both apply. - -## B2: Read-only canonical-root shard discovery - -Implementation is present; native acceptance remains pending the focused Rust -suite on Linux, macOS, and Windows. Formatting and source review are supporting -evidence, not native filesystem or startup execution evidence. - -Owners: `model_library/importer/recovery/shard_discovery`, the public discovery -DTOs in `importer.rs`, and the shard-only observer in `api/builder.rs`. - -`ModelImporter::discover_shard_recovery[_async]` returns a -`ShardRecoveryDiscovery`. It inspects only the canonical three-component storage -layout `{model_type}/{family}/{model_or_artifact}`. Category/family names use the -existing ordinary normalization; model names also permit the existing artifact -slug separators. Model/index/metadata evidence above the model-root boundary, -noncanonical names, nested package markers, and symlinks receive diagnostics. -They are never used to guess another repository root. Metadata-bearing model -roots are observed too; metadata presence is not a completeness shortcut. - -The configured library root may use a canonical platform alias. Discovery binds -its physical identity, holds the canonical ancestor chain, and reads descendants -through held no-follow directories. It rechecks observed bindings before/after -reads and before returning. An observed replacement invalidates the affected -root's evidence. `BindingChanged` also covers a binding check that could not be -observed (for example, a missing or inaccessible component); it does not assert -that an actor replaced a directory. There is no library-ID initialization, -marker, database, cache, cleanup, or network write. This is point-in-time evidence, not an immutable -snapshot or a grant for a later filesystem action. Concurrent in-place changes -can still require a fresh scan and authoritative package validation. - -Held descendant directory capabilities live only along the active traversal -path. Completed bindings retain physical identity and root-relative path, not -handles; final checks reopen one binding at a time through the existing -no-follow helper and invalidate overlapping model evidence on mismatch or -unobservable custody. This bounds retained handles by root-ancestor plus -traversal depth and allows already-scanned unrelated Windows subtrees to be -renamed before the entire scan finishes. The bounded entry/depth limits still -apply; identity observations do not become capabilities for later actions. - -Every counted set retains its full model-root-relative directory and -base/extension. Zero, out-of-range, duplicate, inconsistent, overflowing, -malformed, and uncounted/ambiguous shard names remain diagnostic. Missing -ordinals are inclusive compact ranges, so the declared total never determines -allocation size. Weight-map indexes are read through held directories with a -16 MiB per-index limit; invalid/duplicate maps, unsafe references, absent -conventional indexes, and unobserved referenced files remain visible. Filename -coverage never asserts global package completeness or repository identity. - -Enumeration/metadata failures, refused layouts, symlinks, the 100,000-entry scan -budget, the 64-level model traversal budget, and failed blocking workers cannot -become an empty successful scan. Callers must inspect `enumeration_complete`, -per-model observations, and diagnostics together. - -Startup logs the report and admits **zero downloads from inferred shard -candidates**. Its observer receives only `ModelImporter`, without an HF client -or download admission capability. Existing persisted authorized recovery and -the separate interrupted-download owner are unchanged; this repair makes no -new safety claim about those owners. Restoring missing orphan shards requires -an explicit recovery/download workflow with independently established source -and destination authority. - -The old public `recover_incomplete_shards[_async] -> Vec` -helpers remain deprecated, lossy projections of this one scanner. They warn on -incomplete/ambiguous observations and retain unverified path-derived name hints -only for compatible Rust callers. Their filenames are now root-relative, -including nested directories. An empty Vec cannot establish completeness, and -the reconstructed `repo_id` never authorizes a download. There is no second -legacy scanner or implicit acquisition fallback. - -Regression sources cover sibling model roots, nested identical basenames, -complete and incomplete sets together, legacy/ambiguous layouts, failed -iterator creation/items/completion, root/ancestor/child rebinding, symlink -sentinels, malformed ordinals and indexes, missing index evidence, bounded -missing ranges, read-only observations, and the exact startup shard observer. -The existing persisted-download recovery tests remain with their unchanged HF -owner. The incomplete-import validator and B1 copy-staging owner are unchanged. - -Native rebinding regressions require the attempted rename to succeed before -binding. Where held Windows descendant handles reject that same rename, only -access-denied/sharing-violation errors are considered refusal candidates. The -test must also prove unchanged source/sentinel names and bytes and a successful -same-path rename after discovery drops its handles. This establishes native -pin refusal rather than pretending rebinding occurred. Successful mutations -still require stale-evidence rejection. The startup observer regression checks -its actual byte/name effects; zero acquisition authority is established by its -`ModelImporter`-only input and the reviewed production call boundary, not an -unconnected test download client. - -The broad-tree regression observes the scanner's own `HeldDirectory` capability -lifetimes with a per-scan RAII high-water counter, independent of process-wide -file-descriptor activity. Its 48-model, 12-component fixture permits only four -active descendant capabilities above the selected root's ancestor chain and -requires all of them to be released on return. This counter measures retained -scanner capabilities, not a process FD total. Separately, the existing -no-follow helper owns at most a rolling parent/child pair of temporary -capabilities. Initial root selection also retains its one configured-source -handle while building the canonical chain. Final observation checks explicitly -drop their reopened handle before root re-verification or the next observation. -Directory iterators and index-file reads have separate single-read scopes; -platform/library-internal pathname resolution is not measured by this counter. -A real rename during later sibling traversal must succeed on Windows as well -as Unix, and final identity checks -must reject the changed model while preserving unrelated observations. Symlink -replacement after traversal remains no-follow. These new regression sources -require native execution; source review and formatting alone do not qualify -this resource-lifetime correction. diff --git a/docs/audits/baseline-repair-integration-2026-10-03.md b/docs/audits/baseline-repair-integration-2026-10-03.md deleted file mode 100644 index 4b793b193..000000000 --- a/docs/audits/baseline-repair-integration-2026-10-03.md +++ /dev/null @@ -1,47 +0,0 @@ -# Baseline repair integration - -This bounded integration starts at main `e37bbf4b964a0e2aadf25f80ab71edd8fa6b3eb3`. -It carries the independently developed milestones below without including the -acquisition branch, changing a real store, or enabling network exposure. The -original slice branches remain available for source and test provenance. - -| Order | Source PR and exact head | Included behavior | -| --- | --- | --- | -| 1 | #9 `100552a9b91916944126a5c61d9c83a6d747fd82` | Refuse normalized import collisions, propagate enumeration errors, create exclusively with private Unix permissions, restore source permissions by descriptor | -| 2 | #12 `c748e3922594b54a276f4ac6d539b7f4f0552562` | Validate every explicit shard set and retain full relative paths | -| 3 | #11 `6131fa8a27b50794217e5bd15eed5499c4dc78b7` | Loopback-only CLI and Host/Origin admission, including malformed authority ports | -| 4 | #13 `b2f80213e480d57bc4b2951ec103dee9c7e9d7e1` | Observe Unix termination signals before readiness and wait for existing owned cleanup | -| 5 | #14 `55b77170e441f8ae7c9412c1b01ef25c420e7920` | Refuse implicit execution of custom model repository code | -| 6 | #18 `a805c6f5d6491464d903c52de493255aa3528574` | Trigger the provider timeout fixture after descendant custody is established; refresh unchanged production input attribution fingerprint | -| 7 | #19 `e1517ac3a23114603098e1d0e315f9f8fa4e78d6` | Serialize primary claims at SQLite write admission and fence failed-startup release by claim identity | -| 8 | #20 `88639b47f89d60dc2b0a9bad75cb6c9ef5589500` | Bound WAL-mode busy retries and preserve exhausted/non-busy errors | - -Each source head passed its ordinary hosted Build jobs. That evidence does not -replace qualification of this combined tree. The integration adds explicit native -Linux, macOS, and Windows import/shard/registry tests, local RPC admission tests, -and Unix real-process signal tests to the existing matrix. The Unix restrictive -creation subprocess is intentionally absent on Windows; no Windows ACL parity is -claimed. Manual/tag-only release packaging and real Torch inference remain -separate gates, not implied by an ordinary PR Build. - -Before integration approval, require the exact combined head's CI results and a -full review of the combined final diff. Preserve the individual milestone commits -and original PRs until the owner chooses how to integrate/supersede them. This -record is a scope and provenance contract, not an assertion that those pending -gates have already passed. - -## Remaining baseline boundaries - -- Ordinary import temporary-directory ownership/cleanup needs a separate repair; - this change does not claim that its ignored cleanup errors are resolved. -- The RPC shutdown acknowledgement, HTTP/SSE drain, and Electron child completion - contract are being repaired separately. The included Unix signal change alone - does not close that lifecycle audit finding. -- Custom-code-only model loaders remain unavailable until a repository/revision - scoped trust contract exists; there is no undocumented global bypass. -- PR7 acquisition work and its admission, resume-state, and native-workspace - custody repairs remain a separate integration. Legacy/mismatched workspace - recovery and schema migrations must continue to fail closed. -- Cached Hugging Face search infrastructure readiness is a separate planning - deliverable. S3 and restricted networking follow baseline qualification; no - real-cluster or real-service qualification is claimed here. diff --git a/docs/audits/gguf-file-type-mapping-2026-10-03.md b/docs/audits/gguf-file-type-mapping-2026-10-03.md deleted file mode 100644 index af0ac8def..000000000 --- a/docs/audits/gguf-file-type-mapping-2026-10-03.md +++ /dev/null @@ -1,82 +0,0 @@ -# GGUF file-type inspection correction - -## Demonstrated failure - -The approved Qwen3-4B Q4_K_M artifact was acquired through Pumas's pinned intent -API. Its exact size and SHA-256 matched the approved upstream artifact, but -Pumas 0.7 reported a quantization mismatch. A read-only header/tensor-table probe -observed `general.file_type = 15`, with 216 Q4_K tensors, 37 Q6_K tensors and 145 -F32 tensors. No model weights are included in this repository. - -The [upstream llama_ftype enum at a pinned revision](https://github.com/ggml-org/llama.cpp/blob/99b95488cac0f00ce3f05af113a8c1e287753f87/include/llama.h#L106-L151) -assigns 15 to MOSTLY_Q4_K_M. Pumas's table incorrectly compressed retired numeric -slots 5 and 6, assigning 15 to MOSTLY_Q5_K_M and shifting every later label. The -[tensor-type enum](https://github.com/ggml-org/llama.cpp/blob/99b95488cac0f00ce3f05af113a8c1e287753f87/ggml/include/ggml.h) -is a different contract and must not be used to decode general.file_type. - -## Repair and compatibility - -The mapping preserves persisted enum numbers, including unsupported gaps, and -retains documented historical values without pretending removed quantizers are -available for inference. Unknown numbers remain UNKNOWN. A label is inspection -evidence, not a backend-support claim. - -GGUF inspection now contributes a parser revision to package source fingerprints. -Existing GGUF detail/summary caches therefore become stale on targeted validation and must be recomputed -from the current package by the supported resolve_model_package_facts path. No -model bytes, metadata, user declarations, or SQLite rows are manually rewritten. -Fast cache snapshots remain explicitly unvalidated Cached projections until targeted -resolution; this is lazy invalidation, not a database-wide eager rewrite. -Non-GGUF fingerprints and the public package-facts DTO version remain unchanged. -The old installed 0.7 binary cannot correct its own enum by reinspection; the -fixed code must be deployed before a fresh supported inspection is authoritative. - -## Evidence and gates - -- A standalone build of the exact old table failed the type15→Q4_K_M assertion; - the corrected table passes it, along with gap and Q5_K_M assertions. -- Repository tests cover raw-header extraction, stable upstream numeric values, - unsupported gaps, deterministic GGUF-only legacy-fingerprint invalidation and - unchanged source bytes. -- Native Linux/macOS/Windows workflow steps explicitly run the parser and cache - regressions. Their exact-head hosted results are required before qualification. -- No large local source build or live-store migration is part of this repair. - -Initial hosted qualification also exposed older intent/package-facts fixtures -encoding the same wrong enum numbers. Their Q4_K_M/Q5_K_M bytes are corrected to -15/17 while retaining their assertions. A new composed regression seeds stale -detail and summary rows, invokes the supported summary resolver, and verifies -regeneration from the raw header, both refreshed fingerprints, and unchanged -model/metadata bytes. No live store is edited by that synthetic test. - -## Temporary qualification binary - -This repair's PR25 headless job retained its already-tested Linux x86_64 -no-inference RPC output for one day. The archive was explicitly unreleased and -includes exact source/checkout commits and trees, Rust/Cargo toolchain, build -command/features, runtime-library listing, transformed/original binary hashes, -per-file hashes, and unchanged license/notice inventory provenance. It contains -no model weights, credentials, Python runtime, or runtime userdata. It is not a -production release or a model-inference executable. Using it against an owned -library requires the prior process to be observed stopped and the supported -inspection API; no cache edits or duplicate library owner are authorized by the -archive. The temporary workflow gate has been removed after qualification; -the allowlisted packager and its tests remain as provenance tooling, without -any automatic artifact publication. - -### Qualification receipt - -- Final source head `6a3e6ce6998f326e9cf7d2e1bc0ea51e3a2d381c`, source and hosted - merge tree `e025953b16178f5d953780171fc43fe953b22526`. -- [Build 37098100687](https://github.com/MrScripty/Pumas-Library/actions/runs/37098100687) - passed all ordinary gates, including native Linux/macOS/Windows. -- Artifact ZIP SHA-256 `698a2cf1f54964ca9c421104127a0f7630aa6fff85367f3cf77d2ec62a212a0b`; - packaged tar SHA-256 `c05201824d255bc4691f2b404ed813f8cf327ec4fc9930f6724a71e9485397a3`; - stripped RPC SHA-256 `4495e24298c37c2f861683dfbb74ff55f5c01dd88caa370ba6243883d6dbf26b`. -- ZIP digest, archive sidecar, every per-file checksum, notice source bytes and - source/checkout tree identity were independently verified. The stripped binary - executed `--help` successfully; that is not full runtime startup evidence. -- Supported reinspection of the historical managed store remains unqualified: - the prior process has no observed exit receipt across execution namespaces. - The store was preserved; no stale-row deletion, duplicate owner, manual cache - edit, model inference, installed-v0.7 repair or real-model readiness is claimed. diff --git a/docs/audits/http-acquisition-integration-2026-10-03.md b/docs/audits/http-acquisition-integration-2026-10-03.md deleted file mode 100644 index c5ade3c8a..000000000 --- a/docs/audits/http-acquisition-integration-2026-10-03.md +++ /dev/null @@ -1,156 +0,0 @@ -# HTTP acquisition integration checkpoint - -## Scope and provenance - -The [approved integration plan](../plans/http-acquisition-integration-baseline.md) -composes current main/B1 with PR7, PR10, PR15 and PR16. It preserves all four -feature histories and their milestone commits. The original PR7 branch is not a -replacement baseline and is not rebased away. - -Pinned parents: - -- Main/B1: `58b74e83fdf34131290933f576c7e338bde4a49d`, tree - `57b285ad99994de9e2cc0b83cc62916a3c184ae6`. -- PR7: `3b2a279b4d35bd19e5cc1727cc905c7ee7477fa6`. -- PR10: `57ed33db8c2995e4633f559d1a8d31d591b0dcca`. -- PR15: `dd04fdcf48132ef7237e61feba5e5c1d3629d49a`. -- PR16: `f344e7fed8a8cbc6f4c4831ec7c78aa4c44c2d64`. - -Main's independent Build 37127500248, CodeQL 37127499502 and Scorecard -37127500224 passed before implementation began. Those results do not qualify -this new composition. - -## Semantic joins - -1. Held download destinations keep B1's private staging, exclusive copy creation, - physical descendant binding, publication uncertainty and directory-mode rules. - Acquisition workspaces borrow the same verified authority. -2. Ordinary and raw metadata writes preserve copied-publication identity. - Only the copied producer may establish its Pending identity. The canonical - receipt parser remains shared by ambient-root and held-destination observers. -3. Importer keeps B1's runtime-owned copied producer and PR7's supervised HF - completion. Guarded reads cannot bypass canonical copied readiness. -4. Library writes keep both acquisition mutation guards and B1's conditional - index updates, stale-observation checks and retained Pending diagnostics. -5. Startup installs one shared acquisition owner before HF restore, retains the - exact failed-start claim guard, and keeps shard discovery read-only. Guessed - repository names never authorize a download. -6. RPC drains accepted HTTP responses concurrently with local domain owners and - native installation consumers. Only after these consumers settle does it - close the shared acquisition supervisor. Every observed failure participates - in the repeated final receipt. -7. Runtime managers receive that same acquisition service. The current HTTP - lifecycle policy and signal/acknowledgement contract remain in force. -8. The dependency lock keeps main's HTTP transport ownership plus PR7's pinned - Unicode normalization dependency. Attribution retains every package/source - object from both parents; only changed ownership fingerprints are refreshed. -9. The frontend preserves main's preview fixture reset/readiness corrections and - PR15's command ownership behavior. -10. Workflow coverage is the union of current baseline/native gates, all-base PR - triggers and native acquisition cleanup. Release and managed-runtime E2E - jobs retain their existing tag/manual restrictions. - -## Receipt-validation lifetime correction - -Composition exposed a grant-lifetime gap: HF receipt validation moved its only -root grant into the initial blocking read, dropping it before output proof -validation and durable settlement. The integrated path retains the owning grant -through those later effects. A test-only pause after the held read itself owns -no grant; the regression checks that a successor remains excluded after caller -cancellation, through valid settlement or missing/wrong-lease receipt failures. -Failed outcomes preserve custody, bytes and repeatable failure evidence. - -Acquisition receipts, copied-publication receipts and native cleanup receipts -remain separate contracts. None can substitute for another owner's proof. - -## Qualification matrix and honest limits - -Five cross-owner behavior groups cover: - -- Real copied Ready output through guarded observation, plus damaged/oversized/ - replaced evidence and cache/load-target refusal. -- Copy/HF exclusion before effects, including hidden predecessor custody. -- Distinct receipts, warm/cold retention and the post-read grant lifetime gap. -- Legacy schema refusal and coexistence of retained HF custody, copied Pending - evidence and incomplete local shards. -- Actual copied/HF owner drainage after caller loss, accepted HTTP shutdown/SSE - completion, and a synthetic native partial-transfer consumer on its separate - versions workspace. - -The hosted runner lists the exact filter before running it and rejects empty, -ignored, incomplete or failed execution. Native Linux/macOS/Windows runs include -core defaults, core HF-only features, RPC fixture defaults and inference-disabled -RPC. Package-separated no-default full suites avoid workspace feature-unification -claims. Ordinary Rust, frontend, Python, attribution and release-gating checks -remain required. - -The native source constructor is a non-default test-support seam with literal -loopback validation. Both metadata and archive requests reuse a no-proxy, -no-redirect transport, and archive URLs must keep the exact validated origin. -A synthetic explicitly configured proxy test checks routing without reading or -changing ambient credentials/environment; real fixture requests reject any -Authorization header. This guarantee belongs only to the new native metadata/ -archive seam. Composed API startup still inherits ordinary HF token resolution -and connectivity probes; these tests do not claim globally offline startup. -Its RPC feature forwarding is weak: enabling test support -without inference cannot introduce app-manager. Product/release dependency and -workflow assertions keep fixtures out of release builds. Synthetic bytes are -never launched as a runtime or represented as model inference evidence. - -At this source checkpoint, Rust formatting, 20 release/workflow tests, three -qualification-runner tests, 122 targeted download-command/preview frontend tests, -and Python lint/format checks have run. Rust compilation and all native behavior remain pending hosted -execution and independent source review. No successful filter/CI claim is made -from source inspection alone. - -Schema-7 fixtures do not qualify upgrades of deployed schema-5 stores. Normal -schema-4/5/6 acquisition startup/mutation remains fail-closed, preserving the -original document. No live store, historical process namespace or credential was -reconciled or changed. S3, public speech, actual model inference and networked -node qualification remain separate milestones. - -## Hosted qualification corrections - -The first combined attempt, Build 37133121619 at `d23100c2`, stopped on two new -fixture compile errors. The next attempt, Build 37133702169 at `828f6ade`, compiled -and executed the cross-owner cases, but remained failed. Full core default tests -reported 1,715 passed / 3 failed / 8 existing ignored cases; no-default reported -1,691 passed / 3 failed / 8 ignored. The seven cross-owner cases reported 5/2 on -Linux, 4/3 on macOS and 3/4 on Windows, with none ignored. Workflow/frontend jobs -and all twelve product/fixture dependency-graph checks passed. These partial -results do not qualify the branch. - -Separate corrective milestones preserve these outcomes: - -- Fixture oracles now distinguish held-identity refusal from the public retained - Pending/Invalid diagnostic. They check both original and replacement bytes, - exact warm/cold hidden queue custody, and the scanner's canonical root. -- Native fixture setup uses ordinary write access for `set_len`; append-only - Windows access is insufficient. Diagnostics retain both the primary producer - error and shutdown failure, and identify `files_ready` as seal plus persistence - rather than attributing an unobserved syscall. -- In-place imports now perform a rooted, held, bounded read-only copied-readiness - preflight before admitting owned effects. The original guarded readiness fence - remains, and late Validation/I/O/panic failures still reach shutdown. No ambient - JSON reader, mutation grant or global error exemption is used for preflight. - The FIFO refusal probe has an exact owned test child and requires acknowledgment - after runtime drainage; timeout kills and reaps that child before failure. -- Windows verification requests write access on the same no-follow descriptor - that is hashed and flushed. The second binding observation remains read-only; - there is no creation/truncation, chmod, ACL change, skipped flush or read-only - success fallback. Unix and consumer descriptor access remain unchanged. - -Rust 1.92 implements Windows `sync_all` through `FlushFileBuffers`, whose documented -handle contract requires `GENERIC_WRITE`. See [Rust's pinned implementation](https://github.com/rust-lang/rust/blob/1.92.0/library/std/src/sys/fs/windows.rs) -and [Microsoft's API contract](https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-flushfilebuffers). -The original read-only verification descriptor violates that contract. Native -controls reproduce read-only flush denial and require successful real-payload -seal/staged publication after correction. The permissions-negative case checks -open denial, not an injected production flush failure. Existing hosted Windows -failures are consistent with this defect, but their complete attribution remains -pending the corrected native run. - -Independent source review accepted these corrective boundaries. Fresh exact-head -hosted compilation and execution remain required. A verification descriptor binds -one checked operation; serialized path/size/digest receipts do not preserve a live -file identity or make bytes immutable against same-authority external writers. diff --git a/docs/audits/import-copy-review-corrections-2026-10-03.md b/docs/audits/import-copy-review-corrections-2026-10-03.md deleted file mode 100644 index 01568c1df..000000000 --- a/docs/audits/import-copy-review-corrections-2026-10-03.md +++ /dev/null @@ -1,95 +0,0 @@ -# Copied-import review corrections - -PR #28's first complete external review covered head -`48d86d91f3da94a2d0703ff936e8c18d98448655`. Its ordinary Build gates passed, -but the review identified behavioral corrections. That evidence does not qualify -this follow-up tree; native execution and independent review remain required. - -## Copy and terminal observations - -- Copy-time hashing and the final held destination verification retry only - `io::ErrorKind::Interrupted`. The regression interrupts before data, between - short reads, and before EOF; bytes, length, SHA256 and BLAKE3 must remain equal. - A separate InvalidData regression preserves the actual read error and partial - destination bytes rather than retrying corruption. -- Batch terminal `Complete` awaits channel capacity after every per-item owner - has settled. Per-item/staging progress remains best effort. A full-channel - regression drains `RuntimeTasks` before receiving the terminal batch receipt; - channel backpressure therefore cannot retain payload custody. Closing the - observer still returns the accumulated results. Dropping the batch caller is - observer loss, not a promise that an absent observer receives a terminal event. -- B1 merge publication checks, expected-row observation, metadata normalization, - conditional remap and unstarted-claim release run in observed blocking tasks. - Both mutation guards remain retained until successful post-move settlement; - filesystem/database failures are not converted into successful cleanup. - -## Ordinary Unix directory mode compatibility - -The previous importer created `.tmp_import_` directly under the library -root with normal directory-creation permissions, then renamed that same object -under its canonical model parent (`main b625862b`, importer.rs's -`create_temp_import_dir`). It did not inherit a new group or ACL from the final -parent on rename. - -The repair keeps the payload stage atomically private (0700 subject to the -process umask). Before copying payload, it creates a separate **empty** template -with normal directory-creation permissions under the same held library root. -No payload, metadata, receipt or credential is ever placed in that template. -The template's observed mode is bound to the actual stage and root identities; -its UID/GID must match the stage. Cleanup validates the held template's identity -and removes only an empty directory. Replacement or unexpected contents are -retained with an explicit error, never recursively removed or retried by name. - -Final ordering is: no-replace payload publication -> exact held payload -verification -> held-directory mode restoration and synchronization/readback -> -durable Confirmed receipt -> Ready metadata -> conditional Ready index. -An inability to settle final permissions leaves a retained Pending publication -and a real import/shutdown failure. No rollback or automatic promotion is added. - -Native Unix subprocess fixtures use umasks 000, 002, 022 and 077 without changing -the multi-threaded parent process's umask. They assert private staging and the -expected final mode (0777, 0775, 0755 and 0700 respectively). Separate regressions -cover template replacement, unexpected template contents and injected final-mode -failure before confirmation. Existing payload-file permission preservation stays -unchanged. - -This qualification is limited to ordinary Unix mode/umask behavior. It does not -claim preservation of custom ACL policies, alternate-parent group inheritance, -Windows DACL behavior or access for arbitrary different-UID deployments. The -repair neither copies ACLs nor changes UID/GID. Inherited policy remains that of -the library root, as before; differing observed ownership is an error. Metadata -mode bits alone are not proof of equivalent ACL access. [Linux ACL semantics](https://man7.org/linux/man-pages/man5/acl.5.html) -and [Apple mkdir semantics](https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/mkdir.2.html) -describe the distinct mode/inheritance boundaries. Operators requiring custom -ACL/group guarantees need representative qualification before relying on them. - -The cooperating-writer/trusted-filesystem limit remains: these identity checks do -not eliminate arbitrary concurrent hostile rebinding or in-place mutation by an -actor with equal filesystem authority. - -## Verification status - -Local: changed Rust parsed/formatted by the pinned toolchain, whitespace and -release attribution checks passed. No local monolithic build or native behavior -claim. New regressions use the existing `copied_import` native test filter. -Independent source review and fresh exact-head Linux/macOS/Windows Build results -will be recorded separately before acceptance. - -## Combined migration report consumer correction - -The integration adds the minimal adjacent consumers required by the new -`blocked_import_publication` result. API recounting preserves its skipped and -error counts even when partial-download report wording is rewritten. It never -changes the incomplete checkpoint timestamp or erases the per-model diagnostic. -The panel reports success only for an acknowledged completion timestamp, no -errors/skips, all planned moves completed, and consistent references. A consistent -reference graph alone cannot make retained work complete. This changes feedback, -not migration execution or recovery authority. - -Local frontend qualification: all seven MigrationReportsPanel tests passed, -including blocked publication, absent completion timestamp, skipped work and -execution-error cases. Scoped ESLint and the full frontend TypeScript check -passed using existing workspace dependencies. The first TypeScript attempt lacked -the existing Electron dependency link; restoring that local test-environment link -resolved it. No dependency or lockfile was changed or installed. Rust recounting -has a `copied_import` regression for fresh native hosted execution. diff --git a/docs/audits/import-publication-review-corrections-2026-10-03.md b/docs/audits/import-publication-review-corrections-2026-10-03.md deleted file mode 100644 index f2cf652d0..000000000 --- a/docs/audits/import-publication-review-corrections-2026-10-03.md +++ /dev/null @@ -1,149 +0,0 @@ -# Copied-publication library review corrections - -This bounded follow-up starts at local `72b809096186b5cb8f5ed2d41ad821254b0faab4` -(tree `e7ca8110925f8c743c4ee51f6d9c5d648fda70cb`), equivalent to PR 28 head -`48d86d91f3da94a2d0703ff936e8c18d98448655`. It addresses supplied review -comment identifiers `4172968746`, `4172968749`, `4172968738`, and `4172968698` -on [PR 28](https://github.com/MrScripty/Pumas-Library/pull/28). -Source inspection supplies the implementation evidence below. - -## Scope and outcomes - -Production changes belong only to `model_library/library.rs`, its migration -owner, and a private publication-observation helper. Import copying, hashing, -filesystem custody, merge, and receipt production are unchanged by this slice. - -1. Duplicate cleanup checks repo-key eligibility before requesting publication - edit authority. A typed `Validation` refusal for `import_publication` retains - that model and emits a per-model diagnostic; independent eligible entries - continue. `DuplicateRepoCleanupReport.blocked_models` contains model IDs and - actionable errors, including location. It is serde-defaulted for old report - JSON. Existing duplicate/removal counters continue to describe the eligible - entries actually considered by deduplication, while this new list separately - reports entries excluded by the publication fence. Unexpected errors still - abort and propagate. In-repository consumers obtain this report from the - operation or `Default`; there are no exhaustive literals or generated - contracts for this report in the checkout. -2. A pre-effect source or conversion-target publication refusal becomes the migration - result `blocked_import_publication`, with the original actionable error. It - contributes one to both `skipped_move_count` and `error_count`, never to - `completed_move_count`. A blocked run has `completed_at: null`. Independent - moves continue, and successful prior checkpoint results remain successful. - The checkpoint retains blocked terminal attempt results even when its - pending-move queue is empty. Explicit resume preserves those results and - does not re-run or silently finalize blocked publications. This does not - add a Pending recovery or checkpoint-unblocking API; retained publication - evidence still requires manual diagnosis. The existing internal field - `completed_results` stores completed attempts, including blocked/error - outcomes, rather than asserting that every recorded move succeeded. A - publication failure after rename keeps its error outcome and is not - mislabeled as a skipped pre-effect refusal. -3. Public record observation decodes only publication authority fields. It - overlays readiness state/validation diagnostics onto the original JSON; - unrelated omitted fields and unknown keys are not round-tripped through - `ModelMetadata`. Existing raw publication identity is preserved, including - malformed evidence. Malformed authority fields make that row diagnostic and - unavailable, without failing unrelated list/search records. Protocol-row - refresh uses the same raw-preserving conditional projection. Subsequent - dependency/backend projection leaves unavailable publication evidence intact - rather than reparsing it to derive runtime facts. Database and - genuine IO failures propagate in this record-observation path; missing or - malformed evidence remains unavailable. Other metadata readers retain their - existing observation policy. -4. Rebuild conditionally prunes undiscovered legacy rows without then refreshing - the deleted snapshot. A prune conflict leaves the newer row untouched. - Undiscovered protocol rows remain indexed. Invalid indexed paths become - per-row validation diagnostics while their original identity/path evidence - stays intact; unexpected filesystem or database errors still propagate. - Rebuild reaches its existing WAL checkpoint after ordinary stale-row pruning. - -All conditional index writes retain the previously observed row token. The -new code performs no filesystem work or callbacks under an index transaction. - -## Consumer integration disposition - -The bounded write set does not change these adjacent consumers: - -- `api/reconciliation.rs` and `examples/repair_library_integrity.rs` consume - duplicate cleanup counters without exhaustive report construction. They do - not yet display the new blocked-model list; the operation itself emits - per-model warnings, and direct callers receive the list. External Rust - consumers constructing this public report exhaustively must initialize the - additional field or use `Default`; old serialized reports deserialize with an - empty list. No in-repository generated schema includes this report. -- `api/migration.rs::recompute_execution_report_counts` runs when partial-download - outcome wording changes. Its current fallback counts the new blocked action - as an error but omits its skipped count. The parent integration owner must - preserve both counters when blocked publications and partial downloads occur - in one report. `api/state.rs` invokes this same aggregation helper. -- `MigrationReportsPanel.tsx` currently decides its success wording from - `referential_integrity_ok` alone. That can label a blocked migration complete - even when `completed_at` is absent and errors are reported. The parent owns - updating this interpretation. `MigrationReportSummaries.tsx` already displays - the completed/skipped/error aggregates. The frontend report type already - allows null `completed_at`, and migration item actions are strings, so the - blocked action requires no schema expansion. - -These integration findings remain acceptance requirements for the combined -change; this source slice does not claim the unchanged UI presents them fully. - -## Evidence and qualification - -Regression source was added before implementation in `library/review_tests.rs`. -Every new case matches the existing native `--lib copied_import` filter: - -- `copied_import_cleanup_skips_only_eligible_blocked_models` -- `copied_import_cleanup_preserves_unexpected_metadata_errors` -- `copied_import_record_observation_preserves_raw_projection_fields` -- `copied_import_malformed_index_identity_is_diagnostic_not_collection_failure` -- `copied_import_record_observation_preserves_io_and_database_errors` -- `copied_import_rebuild_prunes_invalid_legacy_paths_and_retains_protocol_evidence` -- `copied_import_migration_resume_retains_source_and_conversion_blocks` -- `copied_import_migration_preserves_unexpected_error_and_checkpoint` - -Fixtures use isolated temporary roots and synthetic retained Pending evidence. -They do not represent live-store repair or supported Pending recovery. The -resume case asserts unchanged source/conversion receipt bytes, retained blocked -checkpoint results, accurate counts, and an independently completed move across -two explicit executions. The stale-row case also observes WAL truncation. - -Local qualification is limited to Rust formatting, source/callsite inspection, -and Git whitespace/diff review. No Rust compilation, test execution, native -filesystem qualification, real store/model operations, or remote writes are -performed in this slice. Independent source review and fresh hosted Linux, -macOS, and Windows gates remain mandatory before acceptance. - - -## Combined review follow-up - -The caller corrections identified above are included in the combined branch: -API recounting preserves skipped plus error counts, and the panel requires -completed checkpoint evidence and zero outstanding/skipped/error work before its -completion message. See the adjacent import-copy review correction record for -local frontend results. This supersedes the caller-pending disposition of the -isolated source milestone. - -Independent review added three record-observation edge regressions. Bounded -canonical metadata/receipt overflow now has the specific typed field -`import_publication.evidence_size`; only that known invalid-evidence outcome is -converted to per-model unavailability. Other operational failures retain their -errors. Receipt-only malformed gates receive a diagnostic non-confirmed identity -if none existed, so downstream projection cannot reinterpret them as legacy. -Receipt-backed non-object index values are retained under the diagnostic-only -`unparsed_index_metadata` member; the stored row is not rewritten by list/get/ -search. All three public query paths are covered, including scalar, array and -null evidence. Unknown object members remain in place. - -The new retained-publication refresh uses the same awaited blocking-task pattern -as adjacent library metadata observations. Its original complete row snapshot is -cloned into the closure and remains the CAS precondition. This does not add a new -mutation owner or extend the broader library read/projection lifecycle contract. - -A retained empty `pending_moves` checkpoint represents **one frozen incomplete -migration plan**. Later Execute calls preserve its results; they do not retry -blocked publications or discover newly eligible moves. There is no supported -checkpoint reset/replan or Pending reconciliation API in this bounded repair. -Operators must retain the evidence and diagnose the blocked publication; ordinary -retries cannot advertise completion or manufacture a new plan. Independent moves -already in the admitted plan still complete. This limitation is explicit, not a -claim that retained publication recovery has been implemented. diff --git a/docs/audits/ipc-fixture-readiness-2026-10-03.md b/docs/audits/ipc-fixture-readiness-2026-10-03.md deleted file mode 100644 index 461f99c01..000000000 --- a/docs/audits/ipc-fixture-readiness-2026-10-03.md +++ /dev/null @@ -1,24 +0,0 @@ -# Intent IPC fixture readiness publication - -The B1 current-main qualification at `8b260b230917057f8ca189e97b8065241168f5a5` -failed Rust quality in [run 37116185871](https://github.com/MrScripty/Pumas-Library/actions/runs/37116185871), -job 111183460501. `intent_ipc_tests.rs:192` parsed an empty readiness file and -reported `EOF while parsing a value`. This was the parent fixture's JSON file, -not an IPC response. The test source was unchanged from qualified main. - -The child created the final readiness filename before writing its bytes, while -the parent used file existence as its signal. The repair writes and syncs a -private same-directory temporary, then publishes it with no-clobber semantics. -A deterministic checkpoint asserts that the final path remains absent before -publication; an existing target must retain its original bytes. - -A startup guard owns the exact child immediately after spawn, before readiness -read/parse can fail. Ownership transfers to the existing running-fixture owner -only after parsing succeeds. The failure regression launches a test-only -parked child with no Pumas instance or network activity, then proves failed -readiness parsing still observes that child's exit through its retained handle. -The receipt is never inferred from a PID lookup. - -This changes fixture code only. No production IPC, registry, model, or process -ownership behavior changes. Formatting and whitespace checks passed locally; -Rust compilation and native fixture execution remain hosted qualification gates. diff --git a/docs/audits/linux-process-observation-2026-10-03.md b/docs/audits/linux-process-observation-2026-10-03.md deleted file mode 100644 index 83ade6c3f..000000000 --- a/docs/audits/linux-process-observation-2026-10-03.md +++ /dev/null @@ -1,28 +0,0 @@ -# Bounded retry of incomplete Linux process observations - -A hosted router-lifecycle test failed during owned shutdown when `/proc` task -entries disappeared after enumeration while the unreaped zombie leader was -still present. The existing scanner correctly refused to call this an empty -process group, but the managed child propagated the first incomplete observation -immediately rather than using the caller's remaining drain budget. - -Only the two structured missing-task visibility cases now return `WouldBlock`: -a missing task directory with a still-present leader, or an incomplete/empty task -observation while that leader remains. Malformed data, permission errors, other -I/O errors, and group-signal errors remain explicit failures. No diagnostic-string -matching or false-empty fallback is used. - -The existing drain loop may retry `WouldBlock` within its original deadline and -poll interval. It retains the unreaped leader/PGID pin and custody throughout. -Exhaustion reports `TimedOut` with the last incomplete observation and leaves the -owner available for retry; only a complete no-live-members observation permits -reaping and custody release. This does not expand the cooperating-process-group -contract to escaped processes, hostile namespaces or external reapers. - -Evidence includes a bounded standalone copy of the scanner (only libc's Linux -ESRCH constant shimmed) failing before the classification repair and passing after. -Repository fixtures exercise transient-then-complete drain, zero-budget persistent -uncertainty with retained identity/custody, and malformed-stat refusal. Existing -real process-group tests and the affected router-lifecycle test remain native -Linux CI gates. Full local Rust builds were not attempted; exact-head hosted -qualification and independent review are still required. diff --git a/docs/audits/namespace-instance-custody-2026-10-03.md b/docs/audits/namespace-instance-custody-2026-10-03.md deleted file mode 100644 index 1841fcbcf..000000000 --- a/docs/audits/namespace-instance-custody-2026-10-03.md +++ /dev/null @@ -1,40 +0,0 @@ -# Instance custody across process and network namespaces - -Status: confirmed unsupported ownership boundary; repair required before shared-store or networked deployment. This is a separate finding from the corrected GGUF enum/cache issue. No existing library was reclaimed or modified to establish this finding. - -## Observed limitation - -An approved Pumas-managed model acquisition finished transferring the expected bytes, but its enclosing execution ended before the supervisor wrote an observed child-exit receipt. The persistent instance row still identified that acquisition's owner. A later execution had a different process/network namespace. The earlier cleanup receipt belonged to a different startup attempt and could not prove this owner's cessation. - -The current implementation cannot safely answer whether that historical owner has exited from the new namespace. A numeric PID may identify another process or no visible process there. Loopback identifies the observer's network namespace; an unreachable endpoint does not prove the old process is gone. A failed observer is not an empty ownership domain. - -The original store remains preserved with ownership unresolved. A newly repaired binary cannot retrospectively prove the old process exited. The approved model's byte identity, the new inspector's source/native test qualification, and the old store's owner cessation are distinct evidence. - -## Source trace - -Reviewed main `dfc3d0f81f1a28db025bb776f66e3e9f5c6e9d55` and the PR25 qualification tree `e025953b16178f5d953780171fc43fe953b22526`: - -- `rust/crates/pumas-core/src/registry/library_registry.rs`, `InstanceEntry`: PID, endpoint, connection token and wall-clock start time are stored; no independently verifiable creator/process-lifetime custody is retained in this record. -- `LibraryRegistry::try_claim_instance` observes `platform::is_process_alive(existing.pid)` inside the SQLite claim transaction. Atomic claim serialization prevents same-registry writers from both winning the transaction, but does not make a namespace-local PID observation globally authoritative. -- `rust/crates/pumas-core/src/platform/process.rs`, `is_process_alive`: Unix uses `kill(pid, 0)`. Its boolean result also collapses observation failures; it is not an identity- or namespace-scoped exit receipt. -- `LibraryRegistry::cleanup_stale` uses the same PID observation and pathname existence to remove instance records. It is invoked by local client/instance discovery. It must not be used as a diagnostic probe against this unresolved historical store. -- `rust/crates/pumas-core/src/model_library/download_recovery.rs`, `RootExecutionGrant`: the existing held-filesystem exclusion protects active mutations. Its documentation explicitly distinguishes an active grant from a configured root. It is not proof that a primary instance has retained an exclusive store lease throughout its complete lifetime. - -## Required repair boundary - -1. Design independently verifiable lifetime custody for a primary store owner, such as a supported held store lease bound to the physical store plus creator identity. Additional PID fields or failed namespace-local probes alone are insufficient. -2. Keep primary lifetime ownership distinct from finite mutation grants so composing the two cannot deadlock normal work or accidentally release the primary lease while a child still uses the store. Define inherited-handle, owner crash, dropped supervisor, process namespace and filesystem replacement behavior explicitly. -3. Observation permission/error/unknown identity must remain unknown, rather than authorize reclamation. Discovery must be read-only unless it holds the authority needed for the exact cleanup transition. -4. Fence any removal or replacement against the exact observed owner generation. Preserve startup-claim and ready-instance distinctions and do not delete a successor from a stale observation. -5. Legacy rows without independently verifiable custody require explicit reconciliation. New software must neither fabricate a historical exit receipt nor silently migrate/reclaim an unknown live store. -6. State supported filesystem/host boundaries. A local advisory lock is not automatically a safe distributed lease on every shared filesystem. No real-cluster qualification is available or claimed. - -## Acceptance evidence required - -- Deterministic competing-owner tests, including stale observer versus successor generation. -- Creator/observer namespace mismatch, reused numeric PID, inaccessible owner and failed endpoint observation, all without false reclamation. -- Lifetime lease retained through startup, finite effects, shutdown and observed child cessation; crash recovery only when the supported lease semantics prove the predecessor cannot continue. -- Physical-store/lock replacement refusal and explicit legacy unknown-owner behavior. -- Native Linux/macOS/Windows coverage for each claimed lifetime mechanism. Multiprocess or synthetic namespace evidence must be identified separately from a real networked/shared-filesystem deployment. - -This audit does not authorize another process to start against the unresolved historical root, PID-based signalling, stale-row deletion, metadata overrides, or a claim that the approved real-model readiness test has completed. The narrow GGUF source fix can be accepted on its own qualified evidence while old-store reinspection remains blocked. diff --git a/docs/breif/agent-interaction-mcp.md b/docs/breif/agent-interaction-mcp.md index e5a0efaae..a29c7b109 100644 --- a/docs/breif/agent-interaction-mcp.md +++ b/docs/breif/agent-interaction-mcp.md @@ -1,5 +1,11 @@ # Pumas Library — Agent Interaction and MCP Layer Brief +**Status:** Architectural direction; not started and not authorized. Pumas has no +MCP adapter or agent skill as of 0.8.0. The local intent service it would project +(`query_models`, `get_model`, `get_model_status`, `ensure_model`, +`release_model`) exists; see the +[core README](../../rust/crates/pumas-core/README.md#local-intent-interface). + ## Purpose Pumas should expose an explicit **agent interaction layer** that allows coding agents and autonomous systems to use Pumas through a small, stable, intent-oriented interface. diff --git a/docs/breif/capability-discovery-fabric.md b/docs/breif/capability-discovery-fabric.md index 829edc7ea..8361b71f9 100644 --- a/docs/breif/capability-discovery-fabric.md +++ b/docs/breif/capability-discovery-fabric.md @@ -1,5 +1,15 @@ # Pumas Library — Capability Discovery and Resolution Fabric +**Status:** Architectural direction; it does not authorize implementation. As of +0.8.0 only local pieces exist: the machine-level library registry (section 26) +backs `pumas-rpc --discover-local` and explicit attach/retain of an existing +owner, and the gateway's `GET /v1/served-models` and `GET /v1/capabilities` +return typed capability descriptors that separate capability from availability +(sections 7–8, for the local gateway only; see the +[model operations contract](../contracts/model-operations-v1.md)). LAN, cluster, +Kubernetes and fleet discovery, node identity, leases, capability handles and +subscriptions are not started. + ## Purpose Pumas should provide a unified mechanism for discovering both **Pumas itself** and the **capabilities available through Pumas**, regardless of whether those capabilities are provided by: diff --git a/docs/breif/hf-cache.md b/docs/breif/hf-cache.md index b23195d56..9005e0310 100644 --- a/docs/breif/hf-cache.md +++ b/docs/breif/hf-cache.md @@ -1,5 +1,11 @@ # Hugging Face Discovery Cache Brief +**Status:** Direction. The local parts below are partly implemented as of 0.8.0 +(explicit `cache:` browse of retained details and search without detail +hydration; see [Existing Local Cache](#existing-local-cache)). The shared online +cache, bulk index, other catalog sources and peer sharing are not started and +not authorized. + ## Purpose Pumas Library currently uses the Hugging Face Hub API for model discovery and repository metadata. Although Pumas already maintains a local SQLite cache for search results and repository details, normal interactive use can still generate enough upstream API traffic to encounter Hugging Face rate limits. @@ -33,6 +39,13 @@ The current search cache is primarily an **exact request cache**. Query text, fi Cached search results may also be re-enriched with repository/download information, which can still cause Hugging Face API traffic when repository-detail cache entries are unavailable, stale, or considered incomplete. +Implemented in 0.8.0: + +* a query prefixed `cache:` (for example `cache:acme multilingual`) passed to the existing `search_hf_models` API browses or searches retained anonymous public repository details with zero upstream requests. Results carry reserved `model_card.pumas_discovery` provenance (source URL, observation time, freshness) and no download options; the desktop exposes this as an explicit cached-search source; +* ordinary desktop search requests no detail hydration (`hydrate_limit = 0`); opening one repository's download menu fetches that repository's missing details. + +This is bounded browse/search of retained detail records, not the FTS-backed local discovery catalog proposed below, and records learned only from search are not included. + The local cache should remain the fastest and most private cache layer, but its role should expand from exact-request reuse toward a local discovery catalog. ## Local Discovery Catalog @@ -228,6 +241,5 @@ A future implementation plan should determine: ## Deferred Service Readiness The [service readiness checklist](../plans/hf-discovery-cache/readiness.md) -records dependencies and decisions for the later discovery phase. Current work -remains baseline repairs, S3 acquisition and restricted networking; no external +records dependencies and decisions for the later discovery phase. No external service provisioning or search implementation is authorized by that checklist. diff --git a/docs/breif/intent-discovery-distribution.md b/docs/breif/intent-discovery-distribution.md index dbdb54886..66a64a594 100644 --- a/docs/breif/intent-discovery-distribution.md +++ b/docs/breif/intent-discovery-distribution.md @@ -1,5 +1,18 @@ # Pumas Library — Intent, Discovery, and Distributed Model Management Brief +**Status:** Architectural direction; it does not authorize implementation. As of +0.8.0, sections 1–2 exist as a local, single-library intent service +(`query_models`, `get_model`, `get_model_status`, `ensure_model`, +`release_model`, plus ensure status and declaration listing) through +`PumasApi::intent()`, `PumasLocalClient::intent()` and seven `intent_` JSON-RPC +methods; the [core README](../../rust/crates/pumas-core/README.md#local-intent-interface) +owns that behavior. Locally, sections 8–10 are partly met: `pumas-rpc +--discover-local` lists registered library roots without starting or contacting +owners, and consumers attach to or retain an existing owner explicitly (see the +[local HTTP consumer workflow](../contracts/local-http-consumer.md)). Nodes, +fleets, peer transfer, a host daemon, managed-environment adapters and the +`network` module rename (sections 5–7, 12–14 and 16) are not started. + ## Purpose Pumas should evolve from primarily exposing low-level model-management operations into a **model-management authority** that accepts high-level requirements and determines how to satisfy them. diff --git a/docs/breif/s3-model-fetch.md b/docs/breif/s3-model-fetch.md index a8e3211cb..f2d3fcd03 100644 --- a/docs/breif/s3-model-fetch.md +++ b/docs/breif/s3-model-fetch.md @@ -1,5 +1,7 @@ Generic Model Fetching Backend +Status: Direction, partly implemented. The resolution / acquisition / consumption split and the shared acquisition owner are specified by the [artifact acquisition contract](../contracts/artifact-acquisition.md), which owns implemented behavior. As of 0.8.0, Hugging Face selections map into the source-neutral `ArtifactManifest` consumed by the shared acquisition owner in `pumas-core` (`acquisition/`, `model_library/hf/acquisition_source.rs`), covering much of Phases 1 and 3. Conditional S3 single-object and authored-bundle GGUF import ships behind the `s3` Cargo feature, verified against controlled HTTPS fixtures only; the AWS S3, non-AWS compatible service and MinIO validation required by Phase 2 is not certified. Arbitrary ONNX/Safetensors/Diffusers S3 import, Xet reconstruction, multi-source acquisition, chunk CAS and cluster distribution (Phases 4–7) are not started. + Purpose Pumas should separate model source resolution from artifact transfer so that Hugging Face is no longer a special-purpose download path. @@ -810,4 +812,4 @@ GGUF / safetensors / model directory The important architectural outcome is that Pumas becomes responsible for obtaining model content rather than downloading models from specific websites. -Hugging Face then becomes one discovery and resolution provider among several, S3 becomes a broadly reusable storage backend, and a future Xet/chunk-CAS layer can provide deduplication and cluster-efficient content acquisition without changing how applications consume models. \ No newline at end of file +Hugging Face then becomes one discovery and resolution provider among several, S3 becomes a broadly reusable storage backend, and a future Xet/chunk-CAS layer can provide deduplication and cluster-efficient content acquisition without changing how applications consume models. diff --git a/docs/breif/torch-diffusion-runtime.md b/docs/breif/torch-diffusion-runtime.md deleted file mode 100644 index be8a16f20..000000000 --- a/docs/breif/torch-diffusion-runtime.md +++ /dev/null @@ -1,103 +0,0 @@ -# Torch Diffusion Serving Brief - -**Status:** Implementation active. Real Nunchaku and FLUX.2/FP8 generation, Tuldok display/save, and general Pumas FP8/NVFP4 Safetensors conversion have passed within their recorded verification scope. NVFP4 conversion is available; the current FLUX encoder runtime continues using FP8. Shared public runtime distribution acceptance remains pending. - -**Implementation plan:** [Torch diffusion serving](../plans/torch-diffusion-serving/plan.md) - -## Intended outcome - -A user in Tuldok configures the Pumas endpoint, selects a served image-generation -model, enters a prompt, and receives an image that Tuldok displays and can save -for synthetic-dataset work. Installation and serving are managed through Pumas. -The existing VLM corner-detection workflow remains available as a separate task. - -The first supported path is Nunchaku Z-Image-Turbo, followed by the downloaded -FLUX.2 Klein model. Success requires the actual Tuldok workflow against a release -build, not only a direct request to the Torch sidecar. - -## Client contract - -Use the Pumas gateway URL, not the llama.cpp router URL. Extend the existing -model-discovery response with image-generation capabilities and serve requests -at `POST /v1/images/generations`. The initial request supplies a model ID, prompt, -size, and optionally a seed; the response contains one base64-encoded PNG. -Tuldok decodes and displays it, with actionable loading, generation, and failure -states. Document the precise supported request and response fields during -implementation; do not imply full compatibility with every image API option. - -Initially the user loads the model in Pumas before selecting it in Tuldok. -Preserve the gateway's loaded-model discovery policy. Broad on-demand loading -and catalog redesign remain outside this effort, as described in the separate -[unified gateway brief](unified-inference-gateway.md). - -## Shared runtime management - -Torch must use the existing runtime version-management system used by llama.cpp. -Release discovery, download progress and cancellation, installed-version state, -active-version selection, removal, and update UI belong to that shared system. -Do not introduce a second Torch updater or separate installation-state store. - -Backend-specific installation strategies remain appropriate: llama.cpp installs -native artifacts, while Torch installs a managed Python environment and compatible -wheels. Extend the shared manager where necessary rather than duplicating its -lifecycle orchestration. - -The existing Torch entry points already use `VersionManager`, but their -`pytorch/pytorch` source-release installation recipe does not supply a complete -Pumas serving runtime. Replace that recipe with a versioned compatibility manifest -covering the Pumas sidecar, Python, PyTorch/CUDA, Diffusers, Nunchaku, and their -dependencies. Resolve platform and GPU compatibility before installation. Keep -the environment isolated from system Python. - -Install into staging, validate the environment and sidecar startup, then publish -the installed version through the shared manager. A failed or cancelled update -must preserve the previously usable version. Activation must respect running -inference rather than replacing its environment underneath it. - -Model weights, text encoders, VAEs, and tokenizers remain library-managed model -assets. The runtime manifest specifies supported formats and compatibility; -runtime updates must not become a second model-download system. - -## Optional inference build - -Use the existing `pumas-rpc` Cargo feature `inference-plugins`, the same gate as -llama.cpp. Do not add an independently enabled Torch feature that bypasses it. -Torch management, process startup, RPC and image-serving routes must be absent -when this gate is disabled. Corresponding frontend controls must follow the -existing launcher build setting `PUMAS_INFERENCE_PLUGINS=false`. - -PyTorch executes in the managed external runtime; its wheels and model weights -are not embedded into the Rust executable. A library-only build must not install -or start that runtime as a side effect. This requirement concerns optional -llama.cpp/Torch serving integration; it does not assert that all existing core -inference dependencies have already been removed. - -## Serving scope - -Prioritize Nunchaku Z-Image-Turbo, then the local FLUX.2 Klein checkpoint. -LLaDA-Image-Turbo-FP8 is deferred. Each adapter must validate its exact checkpoint -format and required pipeline assets before offering a model for serving. - -Integrate Torch with Pumas model discovery and serving lifecycle and provide an -image-generation endpoint. Serialize GPU work initially, support cancellation, -protect active jobs from unloading, and expose any CPU-offload policy explicitly. -Use Pumas hardware telemetry for compatibility and memory decisions. The current -machine has an RTX 5090 Laptop GPU with approximately 24 GB VRAM; successful -installation alone does not establish that an entire pipeline fits in VRAM. - -## Acceptance evidence needed - -- Shared UI discovers, installs, activates, updates, and removes a Torch runtime. -- Failed and cancelled installations leave the previous runtime usable. -- Compatibility checks reject unsupported wheel/platform combinations before - publishing an installation. -- Tuldok sends a prompt to a complete local Nunchaku model through Pumas and - displays and saves the returned image, - with measured latency, peak memory, and cancellation behavior. -- FLUX.2 loads through an adapter verified against its actual checkpoint format. -- Enabled and disabled inference builds pass their relevant checks; the disabled - build exposes neither Torch serving routes nor installation/startup actions. - -Existing baseline verification: `cargo check --manifest-path rust/Cargo.toml --p pumas-rpc --no-default-features --offline` passed on 2026-09-13. This verifies -the current disabled-feature build, not the proposed diffusion implementation. diff --git a/docs/breif/unified-inference-gateway.md b/docs/breif/unified-inference-gateway.md index 53cfc240a..1975574d6 100644 --- a/docs/breif/unified-inference-gateway.md +++ b/docs/breif/unified-inference-gateway.md @@ -1,9 +1,11 @@ # Unified Pumas Inference Gateway -**Status:** Deferred until after the next release, per user decision on -2026-09-12. This brief records direction only; it does not authorize further -feature development or add a requirement for the next release. Revisit scope and -acceptance after that release. +**Status:** Direction only, deferred past 0.8.0 (user decision of 2026-09-12). +It does not authorize feature development. 0.8.0 shipped typed served-model and +capability discovery (see the +[model operations contract](../contracts/model-operations-v1.md)), but not the +unloaded-model advertisement or on-demand loading proposed here. Settle scope and +acceptance before any implementation plan. ## Intent @@ -20,8 +22,10 @@ Clients → Pumas API gateway → Provider adapters → Inference backends ## Current Behavior Pumas's `/v1/models` advertises currently loaded models with usable serving -observations. Requests for unloaded models are rejected; gateway requests do not -currently trigger loading. The llama.cpp router separately advertises the +observations, each ID once with its serving profiles. `GET /v1/served-models` +lists every served (model, profile) pair with its `load_state` and typed +capabilities. Requests for unloaded models are rejected; gateway requests do not +trigger loading. The llama.cpp router separately advertises the Pumas-generated GGUF catalog and can load models requested directly by clients. Pumas observes those external loads and unloads in the library UI. @@ -51,7 +55,7 @@ optional. Uncertain loading outcomes must not trigger automatic mutation retries New llama.cpp catalog entries may be added live, while removals and changed paths remain pending until profile restart, as explicitly approved by the user. -After the next release, settle discovery eligibility, stable model identities, +Before implementation, settle discovery eligibility, stable model identities, backend routing, cold-start behavior, resource/eviction policy and the required -access-isolation boundary before implementation. No release version or delivery +access-isolation boundary. No release version or delivery date is committed by this brief. diff --git a/docs/contracts/artifact-acquisition.md b/docs/contracts/artifact-acquisition.md index d2cb37a09..527242a74 100644 --- a/docs/contracts/artifact-acquisition.md +++ b/docs/contracts/artifact-acquisition.md @@ -1,6 +1,6 @@ # Artifact acquisition contract -**Status:** Q1 implementation contract; its public API and acceptance remain pending. +**Status:** Q1 (shared HTTP) and Q3 (S3) are implemented and ship in 0.8.0. Their acceptance gates (AQ-HTTP, AQ-S3) are not yet accepted; Q2 (runtime packages) has not started. **Canonical owner:** Pumas acquisition integration. **Implementation authority:** [Acquisition plan](../plans/artifact-acquisition/plan.md). **Consumer:** [Runtime installation and model-adapter plan](../plans/runtime-installations-and-model-adapters/plan.md), plus the existing model-library and native/package integrations. diff --git a/docs/contracts/generation-lifetime.md b/docs/contracts/generation-lifetime.md index 0c1a2d4b2..ce5816fe0 100644 --- a/docs/contracts/generation-lifetime.md +++ b/docs/contracts/generation-lifetime.md @@ -33,6 +33,10 @@ generation transport: models listing, embeddings, health, startup, model loading, installation, non-generation inference, cancellation cleanup, and shutdown. Those budgets must never become a maximum generation duration. +The evidence proves that Pumas propagates a client disconnect to its provider +connection. It does not prove that an Ollama or llama.cpp worker stops +generating after that disconnect. + ## Cancellation, custody, and uncertainty - Bounded admission, busy rejection, retained resource ownership, explicit diff --git a/docs/contracts/hf-model-detail-cache.md b/docs/contracts/hf-model-detail-cache.md new file mode 100644 index 000000000..c903d29a9 --- /dev/null +++ b/docs/contracts/hf-model-detail-cache.md @@ -0,0 +1,96 @@ +# Hugging Face model-detail cache + +**Status:** implemented in 0.8.0. Owner: +`rust/crates/pumas-core/src/model_library/hf/metadata/model_info_cache.rs` and +its `budget` and `local_discovery` modules. Direction and the parts not yet +built (shared online cache, bulk index, other catalogs) live in the +[HF cache brief](../breif/hf-cache.md). + +Pumas keeps anonymous Hugging Face model-detail responses on disk so repeated +lookups and offline browsing do not have to call the Hub. A cached detail is a +dated observation, never authority: download revision, file selection, +package admission and inference compatibility keep their own live checks. + +## Entry points + +| Entry point | Behavior | +| --- | --- | +| `HuggingFaceClient::get_model_info_cached(repo_id)` | Advisory. A fresh anonymous observation returns without HTTP, also after reopening the client. A stale one is revalidated. | +| `HuggingFaceClient::get_model_info(repo_id)` | Always revalidates upstream (metadata **Refetch**), using stored validators when present. | +| `PumasApi::lookup_hf_metadata_for_file` | Hydrates only the selected match through `get_model_info_cached`. Other candidates get no detail request. | +| `PumasApi::search_hf_models[_with_hydration]` with a `cache:` query | Browses (`cache:`) or searches (`cache:acme multilingual`) retained details with no HTTP. Native `search_cached_model_details` also takes an offset and a format filter. | +| `HuggingFaceClient::model_detail_cache_usage()` | `(record_count, logical_bytes)` without HTTP. Limits: `MODEL_DETAIL_CACHE_RECORD_LIMIT`, `MODEL_DETAIL_CACHE_BYTE_LIMIT`. | + +Ordinary interactive search passes `hydrate_limit = 0`; opening one result's +download menu requests that repository's details. + +## Storage and freshness + +- One versioned JSON envelope per exact anonymous model API URL, named + `hf_<64 lowercase hex>_metadata_v1.json` after the URL hash. It holds the + bounded response body, ETag/Last-Modified, validation time, freshness and any + cooldown deadline. +- Body at most 4 MiB; envelope read at most 4 MiB + 64 KiB. Only regular + files are read. Reads refuse symlinks on Unix; the Windows reader can follow + a symlink to a regular file. +- Freshness is at most 24 hours. `Cache-Control` can shorten it; `no-cache` + forces revalidation; `private`/`no-store`, `Authorization` in `Vary` or a + wildcard `Vary` prevent storage; `Age` reduces freshness. `Expires` is not + used. +- Stale records revalidate with `If-None-Match`, else `If-Modified-Since`. A + 304 refreshes only the matching stored representation at the same URL; + redirected responses are never stored. +- HTTP 401/403/404 delete the record. Other failures keep it but never return + it as a fresh success; a failed stale refresh in file lookup is an error. +- Corrupt, oversized, wrong-source, future-version or future-dated records are + misses and are left untouched. + +## Rate limits and admission + +- HTTP 429 returns `RateLimited` and stores a cooldown for that source and + repository: `Retry-After` (seconds or HTTP date), else the HF rate-limit + reset, else 5 minutes; capped at 24 hours. During a cooldown, calls that need + revalidation return the remaining wait without HTTP; a fresh record is still + served. There are no automatic retries. +- Concurrent anonymous refreshes of the same record are serialized and recheck + freshness after admission. At most 64 distinct records and 32 participants + per record are in flight; beyond that, `RateLimited` with service + `hf-metadata-local-admission` and a 1-second retry hint. +- Authenticated calls never read or write this cache. + +## Budget + +- At most 256 records and 64 MiB of final-file bytes. A write evicts the + oldest observations (by validation time, then filename) to fit; this is not + access-order LRU, and reads never touch timestamps. +- Records in an active cooldown and records that cannot be classified are + never evicted. If they leave no room, the new record is not stored and the + live result is still returned. +- A scan covers at most 4096 directory entries; an incomplete scan refuses new + persistence rather than evicting from a partial view. +- Coordination is per process and per lexical directory path; separate + processes and path aliases are not coordinated. + +## Offline discovery (`cache:`) + +- Only records from the current HF API source whose body states + `private: false` and `gated: false` (and not `disabled: true`) appear. + Visibility is as observed, not as it is now. +- Query at most 256 bytes, kind and format at most 128 bytes each, limit at + most 100, native offset at most 256. Results sort by repository ID; all query + tokens must match. +- Each result's `model_card.pumas_discovery` is set by Pumas: `source`, + `source_url`, `observed_at`, `freshness` (`fresh`/`stale`), `fresh_until`, + optional `revision_observed`, `visibility_observed`, `discovery_only: true`. + Download options are empty and compatibility hints are cleared. +- The desktop shows this as **Cached details (offline)** in Model Manager + search, with source, observation time, freshness and revision on each row, + and offers no download choices from it. Ordinary search never falls back to + cached results. +- Discovery makes no HTTP request and writes nothing. + +## Verification + +Owned loopback HTTP tests in the `model_info_cache` modules and the public HF +metadata tests; the desktop path is covered by +`scripts/tests/qualify-hf-cached-search-ui.py` against a launched `pumas-rpc`. diff --git a/docs/contracts/image-generation.md b/docs/contracts/image-generation.md index c3bf3d16d..a3ed97027 100644 --- a/docs/contracts/image-generation.md +++ b/docs/contracts/image-generation.md @@ -17,10 +17,13 @@ Only the concrete adapters below are supported. Use the Pumas gateway address reported by the running RPC server. The llama.cpp router and the internal Torch listener are different endpoints. -`GET /v1/models` lists served models. Image models add -`"capabilities": ["image_generation"]` only when their Torch slot is ready. -Existing text entries retain their response shape. Clients should offer only -models with that capability for image generation. +`GET /v1/models` lists each served model ID once, with its serving `profiles`. +Image models add `"capabilities": ["image_generation"]` only when their Torch +slot is ready. Existing text entries retain their response shape. Clients should +offer only models with that capability for image generation. Typed consumers can +instead discover models through `GET /v1/served-models` and request the +`image_generation` capability through the +[model operations contract](model-operations-v1.md). `POST /v1/images/generations` accepts a JSON object: diff --git a/docs/contracts/image-to-text-native-qualification.md b/docs/contracts/image-to-text-native-qualification.md index f59b59453..0f657fa0e 100644 --- a/docs/contracts/image-to-text-native-qualification.md +++ b/docs/contracts/image-to-text-native-qualification.md @@ -1,7 +1,6 @@ # Native Image-to-Text qualification -Status: candidate selected; acquisition, import extension and native execution -are pending. This is the next qualification slice for the +Status: candidate selected; acquisition and native execution are pending. This is the next qualification slice for the [existing adapter](image-to-text-v0.8.md), not a shipping runtime policy or a receipt that model bytes have been read. The machine-readable [cohort selection](image-to-text-native-cohort.json) contains publisher pins and @@ -39,52 +38,13 @@ measured peak usage. Use one slot, four CPU threads, a 2048-token context and at most 128 generated tokens initially. Use `--n-gpu-layers 0` and `--no-mmproj-offload`; no GPU or paid service is required. -## Acquisition owner integration proposal +## Import roles -The acquisition integration lead owns the changing generic importer. Keep this -extension separate from its unrelated format and transport edits. The proposed -new helper is `model_library/importer/acquired_vision.rs`; reserve its write -ownership before implementation. Required wiring remains with the importer -owner. Do not simply add `gguf` to the inert auxiliary extension allowlist. - -1. Add an explicit closed vision-pair selection with a primary import spec, - projector logical path, and `image_to_text` semantic task. Initial admission - is exactly two distinct, same-directory, digest-pinned GGUF members. The - primary must not be a projector and the secondary must be the one selected - projector. Refuse extra GGUFs, missing roles, equal paths, ambiguous pairs, - nested placement that breaks sibling association and unverified members. -2. Bind that complete selection to the existing consumer receipt payload. - Validate and copy both through `AcquiredArtifactUse` held descriptors and - the existing owned publication path. Preserve checksum verification, - mutation exclusion, caller-loss custody and recovery/no-replay behavior. - Qualification must inspect projector structure/role through held readers; - a `.gguf` extension or `mmproj` substring is not sufficient. A deliberately - narrower exact-publisher-digest cohort is an alternative to broad format - admission, but must remain explicitly scoped to that cohort. -3. Carry the primary identity through `CopyPlan`, metadata and reconciliation. - Both current main and the old development branch choose the largest copied - model file when calculating primary hashes in `importer/staging.rs`. - The selected projector is **190,031,616 bytes**, larger than the primary's - **175,054,528 bytes**. This candidate therefore requires replacing that - heuristic for acquired sets with the explicitly selected primary. Do not - change ordinary unrelated import selection as a side effect. -4. Bind the canonical runtime load path and selected artifact to the primary; - expose the projector as its companion, not an independently interchangeable - model. Keep the exact two-file manifest and primary/projector roles in - the publication/reconciliation proof. Populate task metadata from the - explicit vision-pair operation; imported `llama` architecture or a `vlm` - modality label alone must not grant image-to-text availability. -5. Preserve the generic acquired-model operation's existing behavior when no - explicit vision-pair selection is supplied. Coordinate any public DTO or - generated schema addition with the integration lead before changing it. - -Required regression oracles: a projector larger than its primary retains the -primary hashes/load target; reordered manifest members do not change roles; -missing/extra/duplicate/misplaced/wrong-role members refuse before publication; -changed source bytes fail digest verification; output receipts bind both files; -caller loss retains admitted work; reconciliation observes the exact existing -pair without replaying import. Synthetic GGUF test files establish only these -boundaries, never runtime compatibility or inference. +The receipt-bound two-GGUF import this cohort needs is implemented; the +[adapter contract](image-to-text-v0.8.md#receipt-bound-acquired-modelprojector-roles) +owns its behavior. This cohort's projector (**190,031,616 bytes**) is larger +than its primary (**175,054,528 bytes**), so qualification must confirm that +the explicitly selected primary keeps the model hashes and load target. ## Real execution sequence @@ -94,7 +54,7 @@ metadata, compare publisher size/SHA-256 to streamed bytes, and retain all owner-issued receipts. Do not use llama.cpp's `-hf` auto-download, a new ad-hoc downloader, ambient cache discovery, or hand-edited model-index rows. -After the bounded importer extension is composed, publish the selected pair +Publish the selected pair through that owner and launch a managed `LlamaCppDedicated` CPU profile through Pumas. Record the canonical model ID, profile, process generation, runtime executable/dependent-library identities and model/projector hashes. Require the @@ -113,20 +73,3 @@ there is no replay, the exact managed child/session drains, no runtime process remains, and a subsequent owned launch can complete another real request. HTTP closure alone cannot pass native teardown. Tuldok application acceptance is owned separately and must pin the final combined Pumas source/schema. - -## Current execution blocker - -On 2026-10-09 this cloud executor returned `Tunnel connection failed: 403 -Forbidden` for the public Hugging Face model metadata and GitHub release API. -An approved escalated HF metadata read encountered the same proxy response. -Web/GitHub integration reads resolved the official pins, but do not provide -binary assets to the native acquisition owner. No weights/runtime download or -model execution was attempted, and no additional account terms were accepted. - -Required resource change: permit the existing native acquisition owner to reach -`huggingface.co` and `api.github.com`, the exact pinned GitHub asset URL and the -asset hosts in their validated download redirects, or supply equivalent -already verified owner-managed resources in the qualification environment. -Do not disable the proxy, weaken TLS or substitute mutable/unverified assets. -The import-role wiring above is a separate engineering prerequisite; restoring -network access does not complete it or grant inference readiness. diff --git a/docs/contracts/image-to-text-v0.8.md b/docs/contracts/image-to-text-v0.8.md index 5d22f5792..7eebac3ff 100644 --- a/docs/contracts/image-to-text-v0.8.md +++ b/docs/contracts/image-to-text-v0.8.md @@ -8,13 +8,14 @@ and from controlled backend tests. ## Consumer parser update -`contract_version` remains `1`. The closed `Capability` enum gains -`image_to_text`, making seven descriptor variants. Named operation input gains -`image` and `image_messages`; input formats gain `png_base64`, `jpeg_base64`, and -`messages_image`. Descriptor option names gain `image_bytes`, `image_pixels`, and -`image_count`. Consumers with closed enums must update their parser and pin the -adapter cohort before consuming these descriptors. Existing capability formats -remain present. Discovery's shared `PumasBuildInfo` advertises +`contract_version` remains `1`. Image to text adds the `image_to_text` +capability, the `image` and `image_messages` input kinds, the `png_base64`, +`jpeg_base64` and `messages_image` input formats, and the `image_bytes`, +`image_pixels` and `image_count` option names. Later capabilities +(`multimodal_embedding`, `decision`) were added the same way. Under the +[compatibility rules](model-operations-v1.md#compatibility-rules) consumers +ignore capabilities and enum values they do not use rather than pinning a closed +set. Existing capability formats remain present. Discovery's shared `PumasBuildInfo` advertises `pumas.model-operations.image-to-text` schema version `1` when inference plugins are compiled. This is a protocol advertisement, not model readiness. @@ -30,7 +31,8 @@ cargo test --locked --offline --manifest-path rust/Cargo.toml \ handlers::model_operations::types::image_to_text_schema_tests::image_to_text_actual_dto_schema_export ``` -This emits `operation-request`, `modality-request`, `capabilities-response`, +This emits `operation-request` (the internal resolved operation), `modality-request` +(the public request grammar), `capabilities-response`, `capability-descriptor`, `operation-response`, and `error-response` schema JSON files. Schemas describe serialization. The bounds and readiness rules below also apply at runtime; JSON Schema alone does not prove admission or execution. @@ -41,13 +43,13 @@ The Tuldok repository owner must update its closed parser before pinning this Pumas cohort. No Tuldok source or application acceptance is supplied by this Pumas change. In addition to the discriminants above: -- Preserve all seven capabilities: `chat_generation`, `text_generation`, - `text_embedding`, `image_generation`, `image_to_text`, `audio_transcription`, - and `audio_classification`. Preserve the existing unavailable reasons; - `available` is a live observation, not a durable model qualification receipt. +- Ignore capabilities, unavailable reasons and other enum values it does not + use. `available` is a live observation, not a durable model qualification + receipt. - Require the `pumas.model-operations.image-to-text:1` build advertisement and select the explicit model/profile with an available Image→Text descriptor. - Pass `semantic_task:"image_to_text"` in facade requests and `stream:false`. + `capability:"image_to_text"` or `semantic_task:"image_to_text"` may be sent + to make the selection explicit; `stream` must be false. - Preserve ordered role/parts, encode only PNG/JPEG bytes, and apply all bounds below, including aggregate compressed bytes and total message parts. Images belong only to user messages. Never convert paths or URLs into input authority. @@ -63,12 +65,10 @@ Pumas change. In addition to the discriminants above: The production DTO export and controlled HTTP tests are the Pumas-side oracle. They do not validate Tuldok's parser implementation or its process lifecycle. -The integration lead must regenerate any combined desktop contract after the -provider task enum and other branches have been composed. ## Requests and results -An image-only facade request is: +An image-only request is: ```json { @@ -101,9 +101,10 @@ For annotation, retain role and part order: } ``` -Named requests use `capability: "image_to_text"`, mandatory -`options: {"kind":"text_generation"}`, and `input.kind: "image_messages"` -instead of the facade's `messages` for image-bearing histories. Only user +`capability`, `semantic_task` and `options` are optional; when present they must +select `image_to_text` and `text_generation` options (default `max_tokens` 512). +Image-bearing histories use `input.kind: "messages"` with image parts or the +equivalent `image_messages`. Only user messages may contain images. System and assistant messages may contain text. At least one user image is required. Text parts must contain non-whitespace text. The image-only form inserts `Describe this image.` before the image. Text and @@ -123,13 +124,14 @@ public typed result. ## Admission and supported runtime -The selected record must explicitly declare the image-to-text task using -`image-to-text`, `image_to_text`, or `image->text` in existing pipeline/primary task -metadata. Modality labels alone do not enable inference. Existing model/profile +The selected record must explicitly declare an image-to-text task in existing +pipeline/primary task metadata: `image-to-text`, `image_to_text`, or `image->text`, +or a vision-language task (`image-text-to-text`, `image_text_to_text`, +`text+image->text`, `any-to-any`), which also offers chat and text generation. Modality labels alone do not enable inference. Existing model/profile selection and semantic ambiguity errors still apply; an options kind does not choose a semantic task. -Only enabled `LlamaCppDedicated` profiles are supported initially. Router, +Only enabled `LlamaCppDedicated` profiles are supported. Router, Ollama, Torch, and ONNX vision adapters are unavailable. Endpoint bases with queries or fragments are refused. A read-only query to `/props?model=&autoload=false` must declare `modalities.vision:true`, @@ -155,7 +157,7 @@ fence the bound managed process; this adapter adds no recovery attestation. ## Decoding and resource bounds -Both facade and named requests validate options, strict canonical standard +Every image request validates options, strict canonical standard base64, complete PNG/JPEG containers, and full raster decoding before any backend GET or POST. The declared encoding must match actual bytes. Corruption, truncation, trailing container data, APNG, and multi-picture JPEG are rejected. @@ -201,7 +203,7 @@ provider request through the existing generation owner. The admission marker is set immediately before a possible inference POST. Pre-admission errors report `not_admitted`; after possible provider effects, loss/failure is `unknown` and never replayed. Format limits use HTTP 413; malformed inputs use HTTP 400; -unsupported facade pairings use HTTP 422; unavailable capabilities use HTTP 503. +unsupported input/output pairings use HTTP 422; unavailable capabilities use HTTP 503. The cohort includes real PNG/JPEG decoding and controlled HTTP backend tests. Those tests are not pretrained model inference. Tiny numerical vision forward @@ -212,8 +214,8 @@ synthetic text replies. Acquire and verify the exact runtime/model/projector cohort through the existing acquisition and runtime controls before real-model qualification. -The next native qualification candidate, explicit two-GGUF import proposal, -resource budget and current execution blocker are recorded in the +The selected native qualification cohort, resource budget and real execution +sequence are recorded in the [native qualification contract](image-to-text-native-qualification.md). ## Receipt-bound acquired model/projector roles diff --git a/docs/contracts/local-http-consumer.md b/docs/contracts/local-http-consumer.md index f8ecb4246..4ee2748d7 100644 --- a/docs/contracts/local-http-consumer.md +++ b/docs/contracts/local-http-consumer.md @@ -24,9 +24,8 @@ inputs. HTTP readiness does not grant model or runtime readiness. The accepted [release/host decision](../plans/current-standards-remediation-2026-09-03/desktop-release-bindings-and-torch/reports/release-and-host-contract-decision.md) selects immutable Rust source consumers and removes unsupported host-binding -publication. The [v0.8 distribution plan](../plans/headless-inference-distribution-v0.8.md) -adds headless RPC candidates and consumes the shared discovery/build contracts; -it does not admit a Python SDK. Existing native generator scripts and their older +publication. Releases add headless RPC archives (see [Releasing](../../RELEASING.md)) +that consume the shared discovery/build contracts; they do not admit a Python SDK. Existing native generator scripts and their older experimental documentation are inventory, not an accepted support tuple. This module therefore stays a Pumas-owned, source-exported CLI example under diff --git a/docs/contracts/model-lookup-v1.md b/docs/contracts/model-lookup-v1.md index b5af49857..e909b3493 100644 --- a/docs/contracts/model-lookup-v1.md +++ b/docs/contracts/model-lookup-v1.md @@ -9,13 +9,13 @@ The response has `contract_version: 1`, `requested_model_id`, and a tagged `reso | Resolution | Meaning | Consumer action | | --- | --- | --- | | `{ "status": "found" }` | An indexed record exists at the requested ID after this read's reconciliation. This is not an inference or readiness assertion. | Read the selected record through the existing API. | -| `{ "status": "reclassified", "replacement_model_id": "unknown/family/name" }` | This read's admitted model reconciliation returned that exact replacement after a legitimate reclassification. | Refresh the catalog and deliberately select the replacement, subject to its current availability/readiness. | +| `{ "status": "reclassified", "replacement_model_id": "llm/new-family/name" }` | This read's admitted model reconciliation returned that exact replacement after a legitimate family change. | Refresh the catalog and deliberately select the replacement, subject to its current availability/readiness. | | `{ "status": "missing" }` | No indexed record exists at the requested ID. | Refresh the catalog or clear the selection. Earlier moves are not reconstructed. | -For example, a container without LLM architecture evidence may legitimately move from `llm/fixture/model` to `unknown/fixture/model`. The reporting read returns the actual replacement. A later lookup of the original path returns `missing`, and the legacy `get_model` still returns `None`; no alias or redirect history is persisted. +A model's category is metadata: re-detecting it never changes the ID, so the first segment (storage bucket) stays fixed. Only a family change moves a model within its bucket, for example from `llm/old-family/model` to `llm/fixture/model` when its metadata records family `fixture`. The reporting read returns the actual replacement. A later lookup of the original path returns `missing`, and the legacy `get_model` still returns `None`; no alias or redirect history is persisted. The read uses forced admission through the existing runtime-owned model reconciliation. Current payload projections can still skip reclassification internally. Overlapping model/full reconciliation and busy download custody return the existing typed conflict (`-32011`) rather than a misleading missing outcome. Other model scopes can run concurrently. The admitted reconciliation retains existing intent-service reconciliation side effects, nested-effect drain, error handling, and shutdown ownership. -Migration facts are confined to this owned run. Scheduled dirty-event and desired-state followups are excluded. A replacement is a historical operation observation, not a guarantee the path remains available after the response. No successor record is fetched implicitly, and canonical path-based identity and classification rules are unchanged. +Migration facts are confined to this owned run. Scheduled dirty-event and desired-state followups are excluded. A replacement is a historical operation observation, not a guarantee the path remains available after the response. No successor record is fetched implicitly, and canonical path-based identity is unchanged. Generated consumers export `ModelLookupParams`, `ModelLookupOutcome`, and `decodeModelLookupOutcome`. When composing this source with another contract change, regenerate from the combined producer schemas; do not replace a generated client with either branch's snapshot. diff --git a/docs/contracts/model-operations-v1.md b/docs/contracts/model-operations-v1.md index d376121e9..f09318db1 100644 --- a/docs/contracts/model-operations-v1.md +++ b/docs/contracts/model-operations-v1.md @@ -4,24 +4,14 @@ This is the additive v0.8 HTTP contract. Existing `/v1` OpenAI-compatible routes and model identities remain supported. Capability availability describes the selected served model and exact runtime, not the mere presence of a loader. -`GET /v1/capabilities` returns supported contract versions and selected-model -capabilities: semantic task, typed input and output formats, streaming support, -closed option bounds, and availability. Audio transcription and audio -classification are different capabilities even when both produce text. -Protocol/build identity uses the single shared type owned by the release -integration lane; discovery and operation APIs must not define competing types. - -`POST /v1/model-operations` accepts `contract_version`, `request_id`, a nonempty -served model alias (and an exact profile where selection is ambiguous), a -capability identifier, tagged input/output, and closed typed options. A finite -response contains the correlated typed result. A text stream contains typed -`started`, `delta`, `completed`, or `failed` SSE events. Request IDs correlate -responses; they do not authorize retries or imply idempotency. - -Errors use fixed public codes and distinguish `not_admitted` from an admitted -operation whose outcome is `unknown`. Unsupported or unqualified capabilities -fail before provider admission. Never replay generation after caller loss, -transport failure, redirects, or ambiguous provider completion. +The routes are `GET /v1/served-models` (discovery), `GET /v1/capabilities` +(one selected serving identity) and `POST /v1/model-operations` (typed finite +or streamed operations). Request IDs correlate responses; they do not authorize +retries or imply idempotency. Errors use fixed public codes and distinguish +`not_admitted` from an admitted operation whose outcome is `unknown`. +Unsupported or unqualified capabilities fail before provider admission. Never +replay generation after caller loss, transport failure, redirects, or ambiguous +provider completion. Existing chat/completion `stream: true` requests progressively forward provider SSE bytes. They retain the upstream transport and an admission permit until @@ -36,28 +26,6 @@ Closure requests cancellation without establishing provider cessation. A fault after headers ends the body with a transport error, rather than a successful terminal result. -Audio transcription accepts declared encoding, channel count, and sample rate. -The adapter validates these and actually converts supported input to mono -16 kHz PCM16LE; it must not relabel samples. Finite operations expose their exact -runtime/slot/operation reference for status and cancellation. Language and input, -output, and generation bounds are closed and validated before admission. - -Production audio requires trusted selected-byte custody before loading: a -separate SHA-256 manifest, an owner-controlled copied read source, verified -installed recipe/code identity, and an exact managed process and slot generation. -The package observation fingerprint is not byte attestation. Custody survives -caller loss and uncertain load/unload outcomes. Release requires confirmed -native/device cessation with no outstanding operation borrows, or complete -exact-generation process-tree drainage. Legacy arbitrary-path slots remain -unattested. Packaging supplies runtime qualification; discovery supplies the -compatible existing owner and its public HTTP endpoint. - -Implementation is qualified and integrated in small slices: progressive legacy -streaming first, generic typed capabilities/operations second, and attested -production audio third. This document freezes the contract direction; endpoint -availability must reflect the slice actually installed. No scheduler, model -downloads, acquisition policy, or consumer UI is introduced here. - ## Compatibility rules These rules apply to every route in this contract. @@ -85,8 +53,8 @@ These rules apply to every route in this contract. | `request_id` | yes | Caller correlation ID, 1–128 of `A-Za-z0-9-_.:`. Echoed in every response. | | `model` | yes | Served model alias. | | `profile` | no | Exact serving profile; needed only when the alias is served by more than one profile. | -| `input` | yes | Tagged by `kind`: `text`, `text_batch`, `messages`, `image_messages`, `image`, `audio`. | -| `output` | yes | `text`, `embeddings_float32`, `png_base64`, `labels`. | +| `input` | yes | Tagged by `kind`: `text`, `text_batch`, `messages`, `image_messages`, `image`, `content_batch`, `decision`, or the reserved `audio`. | +| `output` | yes | `text`, `embeddings_float32`, `png_base64`, `decisions`, or the reserved `labels`, `pcm_s16le`, `pcm_f32le`. | | `capability` | no | Selects one capability explicitly. | | `semantic_task` | no | Narrows resolution to one semantic task. | | `options` | no | Tagged options; defaults apply per capability. `image_generation` requires width and height. | @@ -132,7 +100,7 @@ The HTTP status matches the code: `invalid_request`, `unsupported_contract` → → 503; `provider_failure`, `invalid_provider_result`, `response_limit`, `transport_lost` → 502. -## Typed HTTP slice +## Endpoints `GET /v1/served-models` is the discovery entry point. It returns `supported_contract_versions`, the byte bounds, and `models`: one entry per @@ -166,8 +134,8 @@ text generation and image-to-text. `multimodal_embedding` and image input to decision model (`decisions` output modality); such models offer no text generation. `audio_transcription` and `audio_classification` are explicitly unavailable with `unqualified_audio_runtime` until the production custody -bridge and installed runtime are qualified. The shared build/protocol identity is a separate -integration dependency; this endpoint does not invent an identity DTO. +bridge and installed runtime are qualified. Build/protocol identity is reported by +`pumas-rpc --build-info`; these endpoints define no competing identity type. For example, a finite text operation is: @@ -237,7 +205,7 @@ calibrated for any particular data. A finite success has `contract_version`, the original `request_id`, and a tagged `result`: `text` with `text` and `finish_reason`; `embeddings` with finite -float32 `vectors`; or `image` with `png_base64` and `seed`. Only recognized text +float32 `vectors`; `image` with `png_base64` and `seed`; or `decisions` as above. Only recognized text finish reasons (`stop`, `length`, `content_filter`) are accepted. The projection checks a single text choice, embedding count/index/dimension coherence, and rejects incoherent provider results. Provider envelopes and internal errors are @@ -259,11 +227,25 @@ comments, and multiline data are handled within a 256 KiB event bound and the on each downstream body poll. A silent or hung provider has no invented idle or drain deadline; disposing the body closes the retained transport. +## Reserved audio + +Audio transcription and audio classification are different capabilities even +when both produce text. Both are reserved and unavailable in this release. + The audio declaration reserves `kind: "audio"`, `encoding` (`pcm_s16le` or `pcm_f32le`), `sample_rate_hz`, `channels`, `sample_count` (frames per channel), and `data_base64`. Supported conversion is 8–192 kHz, one or two channels, and -at most 30 seconds; float32 samples must be finite and in [-1, 1]. Audio options -reserve the existing closed language vocabulary and optional positive -`max_output_tokens`. These declarations do not admit audio in this slice. -Production finite-audio status/cancel routes and runtime/slot references remain -part of the following custody slice, and are not present in this implementation. +at most 30 seconds; float32 samples must be finite and in [-1, 1]. The adapter +converts supported input to mono 16 kHz PCM16LE; it must not relabel samples. +Audio options reserve the existing closed language vocabulary and optional +positive `max_output_tokens`. These declarations do not admit audio. + +Production audio requires trusted selected-byte custody before loading: a +separate SHA-256 manifest, an owner-controlled copied read source, verified +installed recipe/code identity, and an exact managed process and slot generation. +The package observation fingerprint is not byte attestation. Custody survives +caller loss and uncertain load/unload outcomes. Release requires confirmed +native/device cessation with no outstanding operation borrows, or complete +exact-generation process-tree drainage. Finite-audio status/cancel routes and +runtime/slot references are not present until that custody is qualified; see +[installed audio session](installed-audio-session.md). diff --git a/docs/contracts/owned-audio-lifecycle.md b/docs/contracts/owned-audio-lifecycle.md index 60dab8fe0..bd8273928 100644 --- a/docs/contracts/owned-audio-lifecycle.md +++ b/docs/contracts/owned-audio-lifecycle.md @@ -1,7 +1,7 @@ # Bounded owned audio lifecycle -This slice extends PR55's selected-byte and PCM foundations with private -ownership primitives. Production native audio admission and the public generic +This extends the [selected-byte and PCM foundations](audio-custody-foundation.md) +with private ownership primitives. Production native audio admission and the public generic endpoint remain unavailable. Controlled workers establish the ownership state machine; they do not establish that an installed model consumed selected bytes. diff --git a/docs/contracts/owned-audio-transport.md b/docs/contracts/owned-audio-transport.md index f129430f5..48eaba030 100644 --- a/docs/contracts/owned-audio-transport.md +++ b/docs/contracts/owned-audio-transport.md @@ -135,40 +135,28 @@ native `stop`/`length` evidence. Missing or ambiguous terminal evidence is a confirmed typed failure, never a fabricated stop. Fixtures exercise EOS, the 512-token bound and missing evidence; a real model remains unvalidated. -## Upstream integration and remaining gates - -Import the private candidate over PR55 head `9e9ba63c022bce52c00256cd42f4a33afb0e6731` -and its private lifecycle parent `4e40ea0c0493547104dfd2c9985edd9ca3613596`. -The public PR55 author/committer is connector identity Puma; the separate local -format candidate used MrScripty and has the same source tree. Do not rewrite -published author history. Coordinate public changes with the root/integration -worker; this candidate is not published or merged. +## Remaining gates Before making shipping audio available through the existing generic endpoint, the owning runtime must qualify and retain the installed interpreter and complete immutable dependency/loader code, materialize all imported modules in the runtime recipe, and prove the real loader's full selected-model read set. -The bundled Transformers 4.57.6 recipe is not sufficient for this loader. Bind +The bundled Transformers 4.57.6 recipe is not sufficient for this loader, which +requires Transformers >=5.4. Bind the client and stop callback to that exact process generation, register its private slot owner through the existing model-operation boundary, and derive availability from this qualification rather than a reply or flag. Validate a -real model acquired through Pumas under the user's download/terms authorization; -no model acquisition or inference occurred for this candidate. - -Use the recorded offline focused, aggregate and strict lint commands in the -private handoff. Pantograph consumers should continue using the existing generic -typed modality contract, retain caller correlation IDs and accept audio refusal -until the owning runtime gate is satisfied. No authorized real model was present -in this execution environment: a Pumas-indexed canonical Cohere ASR package with -all required selected files is missing. The subsequent public-source audit pins -the proposed official repository revision and documents access terms, -verification and compatible runtime requirements in +real model acquired through Pumas under the user's download/terms authorization. + +Pantograph consumers should continue using the existing generic typed modality +contract, retain caller correlation IDs and accept audio refusal until the owning +runtime gate is satisfied. The selected official repository revision, access +terms, verification and compatible runtime requirements are recorded in [Cohere qualification](cohere-native-qualification.md). Gated member bytes, -digests and accepted access consent remain missing. The bundled runtime remains -Transformers 4.57.6; the native adapter requires >=5.4. Do not download gated -assets to bridge those gaps without the user's authorization. -Do not substitute HTTP status/cancel, -public paths, manifests or automatic retries for the private custody channel. +digests and accepted access consent remain missing. Do not download gated +assets to bridge those gaps without the user's authorization. Do not substitute +HTTP status/cancel, public paths, manifests or automatic retries for the private +custody channel. ## Hung-peer and disposal limits diff --git a/docs/contracts/torch-provider-protocol.md b/docs/contracts/torch-provider-protocol.md index ffe5d2411..759f2a220 100644 --- a/docs/contracts/torch-provider-protocol.md +++ b/docs/contracts/torch-provider-protocol.md @@ -142,5 +142,6 @@ recipe and the bundled live sidecar agree exactly on both values. `rust/crates/pumas-rpc/src/handlers/openai_gateway.rs`, `openai_gateway_images.rs`, and `openai_gateway_tests.rs` - Protocol/recipe agreement: `torch-server/validate_runtime.py` -- Real GPU and browser evidence: `docs/plans/torch-diffusion-serving/reports/` - (`nunchaku.md`, `flux2.md`, `tuldok.md`, `release-acceptance.md`) +- Real GPU and browser evidence: the completed diffusion serving plan's + reports (`nunchaku.md`, `flux2.md`, `tuldok.md`, `release-acceptance.md`), + kept in Git history: `git show 78c52fcf:docs/plans/torch-diffusion-serving/reports/` diff --git a/docs/dependency-review-0.7.0.md b/docs/dependency-review-0.7.0.md deleted file mode 100644 index 6564a7bcc..000000000 --- a/docs/dependency-review-0.7.0.md +++ /dev/null @@ -1,239 +0,0 @@ -# Dependency review for 0.7.0 - -## Node build dependency maintenance (2026-10-06) - -This candidate refreshes only transitive build/dev dependencies from main -`1c1c7875ff8fc43b3ad1957fb2a94d44c850716c`, using pnpm 10.33.0. Importers, -direct dependencies, package majors, public APIs and the Rust tree are unchanged. -The five reviewed package names are absent from the production dependency closure -of both workspaces; this does not exempt the build machine from their risks. - -| Package | Previous lock resolution | Candidate resolution | Advisory disposition | -| --- | --- | --- | --- | -| `brace-expansion` | 1.1.18 / 2.1.4 / 5.0.9 | 1.1.21 / 2.1.7 / 5.0.12 | Meets the patched branches for [GHSA-q2hr-2g5m-vwhr](https://github.com/advisories/GHSA-q2hr-2g5m-vwhr), [GHSA-qhr7-859c-m2p7](https://github.com/advisories/GHSA-qhr7-859c-m2p7), and [GHSA-6j4f-fj2g-mc7p](https://github.com/advisories/GHSA-6j4f-fj2g-mc7p). | -| `fast-uri` | 3.1.7 | 3.1.8 | Meets the patched 3.x branch for [GHSA-hrr3-gc8f-f4qj](https://github.com/advisories/GHSA-hrr3-gc8f-f4qj). | -| `source-map-js` | 1.2.1 | 1.2.2 | Patched version for [GHSA-68fv-2mgg-jv7q](https://github.com/advisories/GHSA-68fv-2mgg-jv7q). | -| `http-cache-semantics` | 4.2.0 | 4.3.0 | Includes the separate [Vary wildcard/inherited-header fix](https://github.com/kornelski/http-cache-semantics/commit/9fb520be70eff3ff502fe965d9c3265ca2c64e26). | -| `sprintf-js` | 1.1.3 | 1.1.3 retained | [GHSA-hp3w-g68c-fv3c](https://github.com/advisories/GHSA-hp3w-g68c-fv3c) has no patched version. | - -[GHSA-ch52-4w7c-c8xp](https://github.com/advisories/GHSA-ch52-4w7c-c8xp) -for http-cache-semantics lists no confirmed patched version. Its maintainer -[disputes the max-stale report](https://github.com/kornelski/http-cache-semantics/issues/56#issuecomment-5975759591). -The candidate's 4.3.0 resolution falls outside the database's current `<=4.2.0` -range, but that scanner result does not prove remediation of the disputed issue. -Its checked path is Electron build tooling through `cacheable-request`/`got`. - -The remaining sprintf-js path is -`electron-builder -> app-builder-lib -> @electron/get -> global-agent@3.0.0 -> roarr@2.15.4 -> sprintf-js@1.1.3`. -The current compatible roarr 2.x/global-agent 3.x releases retain that dependency. -No minimal compatible removal was established; retain this build-only advisory -for upstream follow-up instead of forcing a major parent upgrade or suppressing it. - -The root npm-style `overrides` entry for brace-expansion 1.1.18 does not constrain -this pnpm workspace: no `pnpm.overrides`, workspace `overrides`, or lockfile override -policy is configured. The targeted update selected 1.1.21 and a frozen install -accepted it while the manifests remained unchanged. This slice introduces no new -override policy. - -The refresh command was: - -```sh -corepack pnpm -r update brace-expansion fast-uri source-map-js http-cache-semantics --depth Infinity --lockfile-only --ignore-scripts --store-dir /workspace/.pumas-tools/pnpm-store -``` - -Every lock delta was reviewed. An incidental optional fs-extra 11.4.1 refresh was -removed, retaining 11.4.0; the final diff contains only the six version/integrity -changes and their dependency references. All six integrities match current npm -registry metadata. Frozen installation used `--ignore-scripts`. - -Fresh `corepack pnpm audit --json` still exits 1: 57 raw findings comprise one -actual resolved sprintf-js advisory and 56 Electron workspace-importer false -positives (`0.7.0` rather than the resolved runtime 43.7.0). The production audit -also exits 1 with those 56 importer findings. No actual production-package -advisory was identified by these audits. The disputed http-cache-semantics finding -remains an unresolved upstream claim despite its absence from the candidate scan. - -The reported Dependabot [run 37442880153, job 112200616213](https://github.com/MrScripty/Pumas-Library/actions/runs/37442880153/job/112200616213) -failed to generate security updates; it was not an application CI failure. -Its exit-0 update commands with unchanged locks match the behavior described in -[dependabot-core issue 15766](https://github.com/dependabot/dependabot-core/issues/15766). -The npm-only missing-lockfile auditor message does not describe this pnpm workspace. - -Verification used Node 24.15.0 and pnpm 10.33.0. Frontend lint/types, all 870 tests, -and both renderer build modes passed. Electron lint/types/build and 242 tests -passed; the optional native Electron preload oracle was skipped. The nine contract -generator tests passed. Both attribution checks and all eight attribution tests -passed after refreshing only the pnpm-lock fingerprint in the default and S3 -inventories. The 21 production JS license records, Electron license, and notice -hashes were verified unchanged; Rust/native attribution was retained unchanged. -The initial Electron test failure for stale attribution is preserved in local -evidence and was resolved by that fingerprint refresh. - -`corepack pnpm --dir electron check:desktop-contract`, -`corepack pnpm --dir electron test:desktop-contract-conformance`, and -`corepack pnpm --dir frontend test:desktop-contract` each exited 1 at the Rust -producer export step. Cargo was absent from the verification PATH; the existing -historical RPC binary rejected `--export-desktop-contract`. These gates require -an exporter-enabled current producer and remain unverified here. No Rust build, -ONNX/ORT download, installer qualification, native Electron oracle, PR, or merge -was performed in this maintenance slice. - -The sections below retain historical release review evidence. - -Current dependency-minimization results and macOS follow-up are tracked in -[the minimization report](release-evidence/0.7.0/dependency-minimization.md). - -Earlier follow-up: `der` is now 0.8.2. The default release RPC/ONNX build and -optimized RPC tests passed, and the final Cargo audit reports zero vulnerabilities, -no yanked versions and the same four maintenance notices. Attribution is now -collected and embedded; see [the attribution report](release-attribution/0.7.0/README.md). -The findings below preserve the earlier review baseline. - -The dependency review below records the Electron 39 baseline from 2026-09-14. -**Electron has since been upgraded to 43.7.0 and reverified on Linux.** The old -`extract-zip` dependency is absent from the new lockfile. Fresh pnpm audit reports -no advisories against actual installed dependency versions; its workspace-importer -false positives remain visible. See [upgrade evidence](release-evidence/0.7.0/electron-upgrade.json). - -All 172 desktop tests pass, including the real sandboxed preload oracle, along -with type/lint, contract, launcher, and extracted Linux installer checks. CI now -installs Electron explicitly with a timeout before native tests and launcher -smoke. Skipped native tests no longer trigger a download during test discovery. -Native macOS/Windows validation remains outstanding. - -The remaining dependency work is the precise `der` update, complete third-party -attribution, and final per-installer SBOMs. The baseline audit and inventory files -below remain historical evidence for the older installers, not the new cohort. - -## Electron 39 baseline: support and the ZIP extractor - -The candidate uses Electron 39.8.10. Electron 39 reached end of life on -2026-05-05; supported majors on this review date are 42, 43, and 44. The earlier -patch-only upgrade did not resolve this support problem. -[Electron support schedule](https://releases.electronjs.org/schedule), -[support policy](https://www.electronjs.org/docs/latest/tutorial/electron-timelines). - -**Completed fix: upgraded to Electron 43.7.0 and requalified locally.** This is -a currently supported release, published September 10, with support scheduled -through January 5, 2027. It uses the newer Electron-maintained native ZIP extractor -in its installation script. This also removes the specific legacy extractor path -in the current Electron dependency tree, subject to checking the resolved new -lockfile. It is not an assertion that every dependency of the new version is free -of advisories. [43.7.0 release](https://releases.electronjs.org/release/v43.7.0), -[installation source](https://raw.githubusercontent.com/electron/electron/v43.7.0/npm/install.js). - -The current chain `electron@39.8.10 -> extract-zip@2.0.1` has two high-severity -advisories with no patched release of that old package: - -- [GHSA-jmr9-qjv8-65gv](https://github.com/advisories/GHSA-jmr9-qjv8-65gv): unvalidated archive symlinks can point outside extraction destinations. -- [GHSA-7pqw-9j4j-h8q3](https://github.com/advisories/GHSA-7pqw-9j4j-h8q3): archive symlinks can enable writes outside extraction destinations. - -I reproduced the overwrite with the installed package: a ZIP containing a -symlink followed by a regular entry with the same name overwrote a sibling -sentinel. All files were inside a newly created temporary test directory. The -[result](release-evidence/0.7.0/extractor-reproduction.json) confirms that this is -an actual vulnerable dependency, not just a scanner label. - -The current build has useful mitigations: Electron's installed script passes -bundled checksums to its downloader, and the locally cached Linux Electron ZIP -matches its bundled SHA-256 exactly. No Electron mirror, remote-checksum, -skip-download, or distribution-override variables were present during the review; -the checked-in workflow does not configure such overrides. This is local evidence, -not inspection of future remote runner configuration. The archive SHA-256 is -`92e8b031fa5327c78a972279fd75fc8503fcd1773401809f4557e4de583eabd1`. - -`extract-zip` is absent from the extracted application's `app.asar`; its only -packaged Node dependency is `electron-log`. The old extractor is an installation -and build-machine exposure, not a demonstrated AI-model import path. These -mitigations do not justify selecting an end-of-life Electron version when a -supported migration path exists. No exception or audit suppression was added. - -Fresh pnpm audit still reports the two real extractor advisories. Its other -findings use workspace importer version `0.7.0` as if it were the Electron runtime -version; the installed runtime is 39.8.10. The -[triaged results](release-evidence/0.7.0/pnpm-audit.json) retain the raw counts and -separate those importer false positives from actual installed dependencies. - -## Rust findings - -A fresh [Cargo audit](release-evidence/0.7.0/cargo-audit.json) reports **zero -vulnerabilities and no unsoundness warnings**, with four maintenance notices and -one yanked version. - -`der 0.8.0` was yanked to fix RustCrypto's minimal-version CI, not because of a -security incident identified in the changelog. The non-yanked 0.8.2 patch fits -`ureq`'s dependency constraint and this repository's Rust compiler. Recommend a -precise update and a rebuild of the RPC/ONNX path. The active path is through the -ONNX build script, not a demonstrated DER parser in the shipped RPC executable. -The compatible-range assessment is not a completed rebuild. -[RustCrypto changelog](https://github.com/RustCrypto/formats/blob/master/der/CHANGELOG.md). - -The four maintenance notices can remain for 0.7.0 with tracked upstream follow-up; -they do not report a specific exploitable flaw: - -| Dependency | Checked scope and disposition | -| --- | --- | -| `instant 0.1.13` | Native timestamp alias to `std::time::Instant`, through `notify`; retain, update the notification dependency graph in a separately tested change. | -| `paste 1.0.15` | Procedural macro in tokenizer/tooling paths; retain, follow upstream migration. | -| `proc-macro-error2 2.0.1` | Compile-time diagnostics through `getset -> lnk`; retain, follow upstream migration. | -| `bincode 1.3.3` | UniFFI macro tooling, absent from standalone default RPC resolution; retain, address with binding-tooling updates. | - -The [Rust source review](dependency-review-rust-0.7.0.md) contains primary-source -citations and detailed scope. Build-time code can still affect build machines and -generated output; this classification is not a blanket exemption. - -## Installer attribution and dependency inventory - -The [review inventory](release-evidence/0.7.0/dependency-inventory.json) records -input and installer hashes, package versions, declared licenses, and notice -presence. **It is not a final SPDX SBOM or a certification of the complete native -dependency closure.** - -A separate renderer build instrumented Rollup's rendered-module inventory and -reproduced every `frontend/dist` file byte-for-byte. Its ten included package -identities are React, React DOM, scheduler, react-aria, react-stately, -framer-motion, motion-dom, motion-utils, loglevel, and lucide-react. Their installed -packages contain license text, with declared MIT, Apache-2.0, or ISC licensing. -The Electron main archive also preserves `electron-log`'s MIT license. - -For the native RPC, the selected Linux normal/build dependency graph contains -342 package identities. This includes build dependencies and procedural macros, -not 342 proven runtime libraries. All have declared licenses; declarations alone -do not establish complete notices. The selected graph includes MPL-2.0 -`option-ext`, so the release notice needs a source-availability reference for -that covered code. Mozilla describes this requirement for executables compiled -from unchanged MPL source. [MPL FAQ, Q8](https://www.mozilla.org/en-US/MPL/2.0/FAQ/). - -Both actual Linux installers contain the project license, `LICENSE.electron.txt`, -and `LICENSES.chromium.html`. Both **lack `resources/THIRD-PARTY-NOTICES.txt`**, and -neither candidate has its required per-installer SPDX sidecar. Existing Chromium -notices are not proof of coverage for Pumas's renderer or Rust/ONNX components. - -The ONNX build uses the pinned Pyke static ONNX Runtime 1.24.2 archive. Its cached -payload contains `libonnxruntime.a` without adjacent notices. The download-table -hash and version are recorded in the inventory. Microsoft publishes -[1.24.2 third-party notices](https://raw.githubusercontent.com/microsoft/onnxruntime/v1.24.2/ThirdPartyNotices.txt), -but their coverage must be reconciled with the Pyke-built native archive rather -than assumed identical. Some Rust packages also lack top-level license files -(`binrw`, `binrw_derive`, `governor`); their source notices/upstream texts need -collection. `crc-catalog` stores its license texts in `LICENSES/` instead. - -## Concrete remaining work - -1. Completed locally: Electron 43.7.0 installation, desktop tests, launcher smoke, - packaging and extracted-installer verification. Native macOS/Windows checks - still run through the release workflow. -2. Update `der` precisely to 0.8.2, inspect the lockfile delta, rebuild the RPC/ONNX - path, and rerun audit. Retain the four maintenance warnings with the follow-up - above; do not suppress all future warnings. -3. Generate the combined notice file from the verified renderer, Rust and native - component inventories, including relevant source references; embed it in every - candidate and recheck extracted contents. Preserve Electron/Chromium notices. -4. Produce per-installer SPDX files from the final artifacts, then regenerate - checksums. Reconcile native component coverage before calling the SBOM complete. - -These are release-preparation tasks, not a request for a general legal review or -an assumption that every audit warning must block publication. Native Windows -and macOS behavior remains outside this Linux review. No push, tag, or -publication was performed. The follow-up Electron upgrade and Linux installer -rebuild are recorded separately above. diff --git a/docs/dependency-review-rust-0.7.0.md b/docs/dependency-review-rust-0.7.0.md deleted file mode 100644 index 1925cfacd..000000000 --- a/docs/dependency-review-rust-0.7.0.md +++ /dev/null @@ -1,69 +0,0 @@ -# Rust dependency findings for 0.7.0 - -Current dependency-minimization results and macOS follow-up are tracked in -[the minimization report](release-evidence/0.7.0/dependency-minimization.md). - -Earlier follow-up: `der` was updated precisely to 0.8.2; release RPC/ONNX -build and optimized RPC tests passed. [Final Cargo audit](release-evidence/0.7.0/cargo-audit-final.json) -reports no vulnerabilities or yanks and retains four maintenance notices. -The research below records the pre-update assessment. - -Reviewed on 2026-09-14 against upstream sources and the current local lockfile. -This review changes no dependency versions and does not approve publication. - -## Yanked `der 0.8.0` - -The yank reason is established: RustCrypto says the release was yanked to repair -its minimal-version CI check. The changelog does not attribute the yank to a -security incident. Its subsequent releases also improve parsing: 0.8.1 limits -nesting to 64 messages, and 0.8.2 rejects trailing data within nested messages. -[RustCrypto changelog](https://github.com/RustCrypto/formats/blob/master/der/CHANGELOG.md) - -The crates.io API reports 0.8.2 as non-yanked with Rust 1.85 as its minimum compiler -version. The repository pins Rust 1.92.0. `ureq 3.3.0` requests `der = "0.8.0"`, -which permits the 0.8.2 patch release. These facts make **a precise update to -0.8.2 the recommended disposition**, rather than retaining a yank exception. -[Registry metadata](https://crates.io/api/v1/crates/der), -[ureq 3.3.0 manifest](https://github.com/algesten/ureq/blob/3.3.0/Cargo.toml) - -Locally, `cargo tree --locked --offline -i der` resolves only through -`ureq -> ort-sys` build dependencies. This finding concerns the ONNX build -dependency graph, not a demonstrated DER parser in the shipped RPC executable. -Compatibility is inferred from the declared version range and compiler floor; -this research has not rebuilt with 0.8.2. Apply the precise update, inspect the -lockfile delta, rerun Cargo audit, and rebuild the default RPC/ONNX path before -calling it verified. - -## Maintenance warnings - -These four RustSec entries are informational unmaintained-package notices. They -do not identify a specific exploitable flaw or a patched version. The recommended -0.7.0 disposition is to retain the tested versions with the follow-up recorded -below, without suppressing the warnings globally. This recommendation is a -release engineering assessment, not a claim that abandoned code cannot contain -undiscovered defects. - -| Locked dependency | Verified local scope | Assessment and follow-up | -| --- | --- | --- | -| `instant 0.1.13` | `notify-types 1.0.1 -> notify 7.0.0 -> pumas-library` | Native targets select the implementation whose `Instant` is an alias for `std::time::Instant`; `notify-types` uses that type for debounced-event timestamps. Lower urgency for the native desktop release. Move to a maintained `notify` dependency graph in a separately verified update; RustSec recommends `web-time` for direct consumers. [RUSTSEC-2024-0384](https://rustsec.org/advisories/RUSTSEC-2024-0384.html) | -| `paste 1.0.15` | Compile-time procedural macro through tokenizers/macros; also UniFFI tooling in workspace builds | Retain for this release; migrate through tokenizer/UniFFI upstream updates. RustSec lists `pastey` and `with_builtin_macros` as alternatives, but a transitive replacement needs compatibility testing. [RUSTSEC-2024-0436](https://rustsec.org/advisories/RUSTSEC-2024-0436.html) | -| `proc-macro-error2 2.0.1` | `getset 0.1.6` procedural macro through `lnk 0.6.3` | Build-time diagnostic code. Track migration in `getset`/`lnk`. The original package and this fork are both unmaintained; switching back to the original is not a remedy. RustSec recommends considering `manyhow` or `proc-macro2-diagnostics`. [RUSTSEC-2026-0173](https://github.com/RustSec/advisory-db/blob/main/crates/proc-macro-error2/RUSTSEC-2026-0173.md) | -| `bincode 1.3.3` | `uniffi_macros 0.28.3` in workspace builds; absent from the standalone default `pumas-rpc` graph | Retain for the desktop release and review when upgrading binding tooling. RustSec reports development ended and the maintainers consider 1.3.3 complete. Alternative serialization formats are not automatic protocol-compatible replacements. [RUSTSEC-2025-0141](https://rustsec.org/advisories/RUSTSEC-2025-0141.html) | - -Build-time dependencies still execute on build machines and can affect generated -code; the scope distinction is not a supply-chain exemption. - -## Evidence and limits - -Dependency paths were rechecked with locked, offline inverse `cargo tree` queries -for all five packages. A `cargo tree -p pumas-rpc --locked --offline -i bincode` -query reports no matching package. The cached registry source for -`instant-0.1.13/src/{lib,native}.rs` and -`notify-types-1.0.1/src/debouncer_full.rs` establishes the native timestamp path; -it does not make the same assessment for future WebAssembly deployments. - -The recorded post-preparation audit (`/tmp/pumas-070-cargo-audit-updated.json`) -contains zero vulnerabilities, the four maintenance warnings above, and the -`der 0.8.0` yank. This is a recorded result, not a fresh audit of a subsequently -modified lockfile. No lockfile update, build, target-specific runtime test, or -audit suppression was performed by this research task. diff --git a/docs/investigations/model-deletion-feedback-2026-10-11.md b/docs/investigations/model-deletion-feedback-2026-10-11.md deleted file mode 100644 index e92eac659..000000000 --- a/docs/investigations/model-deletion-feedback-2026-10-11.md +++ /dev/null @@ -1,278 +0,0 @@ -# Silent model deletion refusal - -The user held the delete control to completion for the 8.11 GB -`CLM-v0.1-8B-GGUF` entry. The operation left the row visible without an error. -This repair concerns deletion outcome reporting and exact model identity; it -does not change acquisition custody, locking or the reconciliation plan. - -## Observed identities and state - -Read-only SQLite, download-registry and directory observations distinguish two -artifacts at upstream revision `c97b04a092bc76b152faf6b57b522b766e159bec`: - -| Expected payload | Catalog bytes | Artifact identity component | -| --- | --- | --- | -| `Qwen3-8B-Q8_0.gguf` | 8,709,518,976 (8.11 GiB in the current GB-labelled UI) | `files_9ee061e1214b` | -| `Qwen3-8B-Q8_0-outq2.gguf` | 8,252,495,488 (7.69 GiB) | `files_715cae0a2180` | - -Both are recorded separately under `reranker/clm-v0_1/`, despite sharing their -display name and Q8_0 label. At observation, the selected 8.11 GB directory -contained only `metadata.json`; its earlier acquisition was withdrawn and its -queue admission released. The other directory contained a partial payload and -had current acquisition/admission custody. Catalog size is the expected payload -size, not evidence of bytes currently present. - -The live `pumas-rpc` process held the native exclusive lock on the library-root -directory. There were no CLM intent declarations or deletion claims, unsettled -CLM admission attempts, or lifecycle quarantines in the observed stores. Two -nearby log entries reported RPC conflict code `-32011`; their method labels were -generic, so timestamps alone do not prove which requests produced them. -These observations describe a point in time, not current or future file state. -No real model files or metadata were changed, copied, hashed or deleted. - -## Reproduction and cause - -`pnpm exec vitest run src/hooks/useModelLibraryDelete.test.tsx` reproduced the -silent refusal through the real hold control, library-action hook and local -model list: the API received only the selected model ID, but an exception -produced no accessible error. The same-name sibling remained visible. The -minimized fixture uses a partial catalog entry without recovery information, -so an unrelated recovery warning cannot count as deletion feedback. - -Ranked hypotheses were retained cancellation custody, cross-destination -contention and another library mutation. Read-only custody excludes the first -for the observed target. `LibraryMutationAuthority::acquire` requests a native -root-wide execution grant before checking destination custody. An active -transfer retains that grant; deleting another artifact can therefore return -`DownloadRootBusy` even though artifact identities differ. - -A disposable repository-local fixture exercised the actual release RPC. A -native library-root lock produced the exact `-32011` conflict and left both -fixture directories intact. Releasing that lock allowed immediate deletion of -the selected directory while preserving the sibling payload. This proves the -lock precondition and exact-target deletion behavior; it does not exercise an -actual network transfer or mutate the user's library. - -The frontend caught both thrown errors and unsuccessful responses but only -logged them. Separately, RPC projected `DownloadRootBusy` to a generic conflict -message. Both projections prevented useful user feedback. - -## Repair contract - -The existing library-action hook owns deletion state per exact model ID. It -observes each started request, prevents duplicate pending requests for that -ID, clears its error on retry/success and refreshes models only on success. -Independent model requests retain independent state. The row renders a -dedicated accessible deletion alert, separately from partial-recovery errors, -and disables its delete control while pending. No name, repository or quant -label selects a deletion target or cancels another download. - -RPC retains code `-32011`, class `conflict` and the same response shape. The -specific busy-library error uses a bounded public message explaining that the -owning download or operation must finish or be cancelled before retry. Other -conflicts keep their existing generic projection. No private path, credential, -model name or raw internal error is added to that message. - -Root-wide exclusion remains an existing backend constraint. This repair does -not authorize concurrent deletion during transfer, add deferred destructive -work, or relax destination/acquisition protections. It does not satisfy the -separate reconciliation plan's C1–C10 claims. - -## Verification authority - -Coding standards MCP snapshot -`snapshot:v1:1106bd39-e9a8-48d9-897e-8a186918dd48` selected 33 policies with no -unresolved routing categories. Existing policy content was compared with -previous reads; additional TypeScript async and Rust release/dependency -profiles were read. Production edits are limited to frontend deletion state -and projection plus the RPC public-error projection. Dependencies, generated -contracts, persistent formats and mutation authorities remain unchanged. - -Focused tests cover failed responses, exceptions, absent failure detail, -pending controls, duplicate requests, independent exact identities, retries, -successful refresh and clearing errors. Component evidence proves accessible -role/name/state and projected interaction semantics; it does not qualify native -pointer capture, keyboard behavior, foreign platforms or model inference. -Completed suite and candidate evidence belongs in the -[execution ledger](../plans/download-location-reconciliation/execution-ledger.md). - -## Deletion-scope follow-up - -After installing another Debian candidate, the user still observed no deletion -and no visible error for the 8.11 GB entry. Read-only inspection of the installed -frontend found `index-CTIWPst3.js`: its delete handler only logs errors and does -not contain `deletionStateByModelId` or the `Could not delete model:` alert. The -previously qualified resume-policy package contains `index-CThwja8r.js` with -both. Both packages advertise `0.8.0~rc.1`; that version alone cannot establish -which local candidate was installed. No installed file or model payload was -hashed to make this observation. - -At follow-up observation, the selected original-weight directory still contained -only `metadata.json`; its old acquisition was Withdrawn and its queue admission -released. The outq2 sibling retained a 433,061,037-byte partial and current queue -custody. There were no intent deletion claims. The latest app run logged a generic -RPC conflict (`-32011`) near the attempted deletion, but the method label does -not independently identify that request. The backend subsequently was unavailable -at its last reported port and the root execution lock was free. These are point -in time observations, not permission to infer a successful deletion or download. -The user's library, app and installation were not mutated during diagnosis. - -The existing disposable release-RPC probe reproduced exact root-lock refusal, -then successful exact-target deletion after releasing the external lock. The -new minimized command, -`cargo test --locked --offline -p pumas-library --lib deletion_of_other_weight_during_owned_download_root_grant`, -failed before production changes with `DownloadRootBusy` in 0.39 seconds. Its -real primary API shares two same-name model identities with a live HF task -holding the root grant; the selected metadata-only weight must be removed while -the sibling partial, index entry and canonical acquisition remain unchanged. -The final regression also exercises local IPC and exact-sibling custody refusal. - -The earlier repair deliberately retained root-wide exclusion. HF transfers can -share their owner's live root grant, while model deletion previously tried to -acquire a separate exclusive grant before its exact destination checks. The -primary API and IPC now compose deletion with the same HF owner grant and retain -a private, exact-destination deletion execution lease. The library validates -physical root/destination identity, checks durable custody, obtains its existing -intent claim, and retains the lease through all owned deletion and settlement -effects. Foreign/native owners and direct standalone library calls still use -the existing native exclusion. No public caller supplies a grant or bypass. - -Transfer effects and durable admission use separate locks for the same physical -destination identity. Deletion retains both. Admission takes its short gate and -rechecks intent custody before the canonical write, preventing an admission -from racing deletion without forcing ordinary queueing to wait for a transfer. -An added regression caught a policy refusal poisoning background shutdown; the -gate now reports ordinary pre-write refusal as a result while retaining actual -write failures, panics and observation failures. The regression requires clean -shutdown, preserved custody and successful queued admission after lease release. - -No persistent schema, receipt version, checksum policy, successful-download -provenance or frontend behavior changed in this follow-up. The existing deletion -alert is included in the candidate; a distinctly named local installer will -identify this source slice. Other library mutation lock scopes and reconciliation -C1–C10 are not implemented by this repair. Coding standards MCP snapshot -`snapshot:v1:28e650df-0dc6-4f90-9b6d-75377680eebb` selects 33 policies and zero -unresolved categories; all selected content matched the previously read policies. -Final suites and installer qualification are recorded separately when completed. - -### Accepted deletion-scope verification - -The final default core package passed 2,333 tests with 30 existing opt-in skips -(unit suite: 2,105 passed, 14 skipped). The final RPC package passed 438 tests -with 12 existing opt-in skips, including all 410 binary unit tests. Its real -controlled HTTP source now proves that an unrelated metadata-only model can be -deleted while bytes are actively arriving; deletion of the active destination -returns the exact busy refusal, its canonical custody and partial are unchanged, -and the original transfer subsequently resumes and completes durable import. -Headless deletion regressions passed six tests. Strict default core/RPC -all-targets Clippy and formatting passed. Frontend source and dependencies are -unchanged; its earlier deletion-feedback behavior tests remain applicable. - -An earlier RPC run failed an unrelated vision request-count assertion. Its -cause remains unresolved; the focused case, concurrent cohort and final full -run passed. The [separate diagnostic record](vision-request-count-2026-10-11.md) -preserves that limitation and the new request provenance assertion. No vision -validator or expected outcome was weakened. The first core run preceded the -final admission-gate refinement; the complete core package was rerun afterward. -Logs are in ignored original-repository `tmp/pr69-delete-scope-*.log`. - -This local Linux release selects Electron Builder build number `2026101101`, -which its pinned FPM adapter expresses as a Debian package revision. Qualification -must confirm that the actual package version is newer than the observed installed -`0.8.0~rc.1`, and verify a distinctly named installer copy against the qualified -candidate. Project/RPC semantic version and release-attribution inputs remain -`0.8.0-rc.1`; no public release/version/tag or automatic update publication is -selected. Optimized backend and installer checks are pending at this source -commit boundary. No real library deletion or host installation occurred. - -### Link-registry publication follow-up - -Before packaging, review of the newly allowed overlapping deletions found that -`LinkRegistry::save` cloned its shared cache before dispatching an asynchronous -blocking atomic write. Two clones could capture different states and publish -them in reverse order. Atomic replacement of each file did not serialize their -snapshot/publication order. The prior independent native root grant normally -excluded overlapping library deletions; sharing the primary's HF grant makes -this registry boundary relevant to the admitted deletion change. - -`cargo test --locked --offline -p pumas-library --lib overlapping_deletions_cannot_publish_stale_link_snapshots` -was red before serialization: a second cascade removal changed the registry -while the earlier write was deliberately held after snapshot capture. The -verdict took 0.02 seconds. This demonstrates the ordering hole; it is not an -observation of loss in the user's library. A test-only one-shot barrier controls -that exact owned file operation, without sleeps or timing-based ordering guesses. - -The link registry now owns one mutation turn shared by its clones. Load, explicit -save, register, unregister, cascade removal and clear retain it across cache -observation/change and file publication. The blocking writer captures the turn, -so aborting its waiting task cannot admit a successor before the actual write -settles. Loading returns the turn with the file observation and retains it -through cache replacement. The data schema, error propagation and store lifetime -remain unchanged. Transfer work never takes this turn. The existing seven -registry tests, including overlapping cascade removals and an abandoned waiter, -pass; both new tests reload the canonical file and require both deleted model -entries to remain absent. Complete suite/lint evidence is recorded when done. - -The first optimized backend attempt for `896a7e67` was interrupted while adding -this required persistence fix and is not an accepted installer producer. The -replacement candidate must be built from the committed registry follow-up. -No installed app, model payload, registry in the user's real library, or original -tracked checkout was modified by these fixtures. - -The final combined source passed 2,335 default core tests with 30 existing -opt-in skips (2,107/14 unit), 438 default RPC tests with 12 opt-in skips -(all 410 binary tests), and seven headless registry tests. The previously -accepted six headless deletion regressions are retained from the unchanged -deletion implementation. Default core/RPC all-targets Clippy passed with -warnings denied, and formatting passed. The actual controlled HTTP transfer -and unrelated deletion fixture still passes. The earlier unresolved vision -request-count event did not recur; its separate diagnostic record remains -applicable. Logs are in original-repository `tmp/pr69-link-save-*.log`. -The new normal optimized backend and package checks remain pending at this -registry source boundary. - -### Verified deletion installers - -Final committed producer/RPC: -`0ba3b6cb91cbb9bda84c0627172efb1e3cd6a272`, including deletion implementation -`896a7e6791cd1f36f0af5a7550d0df886dfe2959` and the registry follow-up. A new -normal optimized default-feature backend build passed with locked/offline Cargo -inputs; current frontend and Electron production builds passed. The candidate -frontend contains `index-CThwja8r.js` with deletion state and the visible alert. - -Original-repository `electron/release/deletion-scope-20261011/` retains: - -| Artifact | Bytes | SHA-256 for explicit artifact verification | -| --- | ---: | --- | -| `pumas-library-electron_0.8.0-rc.1_amd64.deb` | 125,153,924 | `3376b1f9c0f0334b9478dcb133a299c4c36adf04bc40ce146bcd0c770551a606` | -| `Pumas.Library-0.8.0-rc.1.AppImage` | 160,747,583 | `e288a4bbe51f7d2b9ab85676eeef51009db4a58d4c696d408e3ea32a3c323047` | - -The Debian metadata is `0.8.0~rc.1-2026101101`, confirmed strictly newer than -the observed installed `0.8.0~rc.1`. The distinctly named copy -`electron/release/Pumas-Library-delete-fix-20261011-0ba3b6cb-amd64.deb` in the -original repository was compared byte-for-byte with the qualified Debian file. -Its SHA is the Debian SHA above. `SHA256SUMS` and `local-build-record.json` -beside the candidates record source, toolchain, revision, reuse and limitations. - -Exact extracted Debian/AppImage resource and RPC health/shutdown checks passed. -Isolated Debian installation over copied older package state, alternatives, -Electron 43.7.0 identity and removal passed. The final optimized RPC also passed -the disposable exact-target deletion probe: an external native lock refuses, -then the selected target deletes after that lock is released while its sibling -payload stays intact. This probe does not mutate the actual library or replace -the controlled active-transfer qualification recorded above. - -Logs are original-repository `tmp/pr69-delete-scope-rpc-release-final.log`, -`pr69-delete-scope-package.log`, `pr69-delete-scope-package-smoke.log`, -`pr69-delete-scope-deb-install.log` and -`pr69-delete-scope-release-delete-probe.log`. Disposable installation evidence -remains in `tmp/pumas-deb-install-6dellxtg`; smoke/deletion fixture roots were -automatically removed. Existing Vite chunk-size and Electron desktop association -guidance remain; isolated install skipped the unsupported AppArmor profile and -reported alternatives cleanup warnings during successful removal. No signing, -publication, native Windows/macOS execution, actual model inference or build -reproducibility is claimed. The earlier vision event remains an unresolved -diagnostic, despite subsequent passing runs. Host app/install, real model data -and the original tracked checkout were preserved. Install the distinctly named -package and reopen Pumas to apply the new code; the running process cannot be -updated by a source change. diff --git a/docs/investigations/model-download-outcome-2026-10-11.md b/docs/investigations/model-download-outcome-2026-10-11.md deleted file mode 100644 index a429dbf6c..000000000 --- a/docs/investigations/model-download-outcome-2026-10-11.md +++ /dev/null @@ -1,190 +0,0 @@ -# Model download terminal feedback - -The user reported CLM-v0.1-8B-GGUF Q8_0, 7.69 GB appearing to complete, followed -by a dim download indicator instead of an enabled play action. Read-only -observations of the running backend establish that this transfer failed; they -do not establish an inference-ready model. - -## Observed state - -- Exact download: `c7c3ea45-2064-4c0b-9fe4-1ea84c43dfc4`. -- Selected file: `Qwen3-8B-Q8_0-outq2.gguf`, expected size 8,252,495,488 bytes. -- The live download snapshot reports `error`, 8,149,772,661 transferred bytes, - and progress `0.9875525236129761`. Its public error is - `The model download did not complete successfully.` -- The application log records an `artifact.http.response` validation failure: - `HTTP continuation representation or resource changed`. -- The current catalog reports the exact selected artifact as partial. The - separate 8.11 GB weight remains a different model ID; it was not selected. -- Laya has a complete catalog entry, adopted acquisition, and durable completion - receipt. It is not the download identified by the user. - -Queries used SQLite read-only mode and the existing localhost `get_models` and -`list_model_downloads` operations. No download command, model-file copy, hash, -deletion, restart, or live-library repair was performed. - -## Reproduction and cause - -`pnpm exec vitest run src/hooks/useModelDownloadLibrary.test.tsx` drives the real -download subscription hook, model catalog fetching/projection, completion -refresh, exact-ID activity merge, and rendered library controls. Before the fix, -the failure assertion fails because the selected row has no accessible error -alert. The genuine-completion scenario already passes. - -`useModelDownloads` owns errors keyed by the exact download presentation key. -The merged catalog row retains that key, but `LocalModelRowState` previously -looked only for inactive partial-recovery errors keyed by model ID. Consequently -a transfer error could change the ring's appearance without displaying its -failure. An unassociated activity row also omitted its error. - -The row now projects the error using its exact `downloadKey` while activity is -present. Both associated catalog rows and unassociated activity rows show an -accessible alert. Failure and command-error labels remain distinct; retries -use the existing exact download ID and authoritative subsequent snapshots clear -the error. Inactive recovery warnings retain their separate ownership. - -## Verification and limits - -The regression covers the observed failure, retry identity, a same-name sibling, -error clearing after a new transfer snapshot, and unassociated activity. It -also proves that 100% transfer progress alone does not enable play; confirmed -completion followed by a complete catalog enables play for only the selected -artifact. An incomplete refreshed catalog keeps play disabled. - -Full frontend suite: 939 passed, one existing skip, 138 passing files. Typecheck -and lint passed; build/installer outcomes are recorded in the execution ledger -when completed. Coding standards MCP snapshot -`snapshot:v1:cb98848b-5ab6-414b-8087-f1cf62578483` selects 33 policies with no -unresolved routing categories; selected text matches the previously read -standards. No persisted or RPC contract changed. - -The cause of the HTTP continuation mismatch is not established by this UI -reproduction. This change exposes the existing refusal and does not bypass it, -invent a completion receipt, or automatically retry the live transfer. Download -location reconciliation and library-lock scope remain separate pending work. - - -## Resume policy follow-up - -The user subsequently resumed the same transfer in the still-running older -installed process and observed it starting again. The original failed transfer -reported 8,149,772,661 bytes; the later paused partial had 91,437,494 bytes. The -selected file remains `Qwen3-8B-Q8_0-outq2.gguf`, not the 8.11 GB sibling. -These observations do not recover the overwritten prefix or establish why the -original server representation check changed. - -The cause of the destructive restart is established separately in -`acquisition/service.rs`: a continuation checkpoint holds a weak reference to -one workspace capability. HF pause/error recovery reconstructs that workspace. -A missing or rejected checkpoint selected offset zero, and a successful full -response called `open_part(..., false)`, truncating the retained partial. The old -HTTP adapter also accepted a matching-validator full response to a range request -as permission to replace the prefix. The contract and existing tests explicitly -required these behaviors. - -The user revoked that discard policy. Resume now binds an actual regular-file -partial through the current held workspace and uses its observed offset when -the exact selected manifest supplies a whole-file SHA. The assembled download -must verify the supplied SHA before publication. Local prefix observation is -not a successful download receipt, historical validator, or verified-chunk -claim. Valid live checkpoints retain conditional HTTP validation. S3 continues -its exact version/conditional selection and supplied digest checks. An ignored -range, invalid range, absent continuation evidence or oversized partial is -refused with bytes retained. Fresh remote writes use an empty append descriptor, -so they cannot truncate an existing or late-arriving partial. Owner-materialized -local installer staging is not a remote download and retains its own behavior. - -HF reports a bounded continuation-refusal message through existing progress -projections; raw response diagnostics stay local. No RPC shape, store schema, -receipt version, checksum retention or already-acquired-file policy changes. -No HTTP validator/access URL/prefix sidecar is persisted, and no execution lease -is retained just to keep a checkpoint alive. - -The initial actual HF immediate-resume regression failed against the old code: -the captured request omitted `Range` instead of requesting `bytes=5-`. The -updated fixtures observe exact HTTP/S3 range offsets and exact final/retained -bytes across pause, interruption, retry and owner restart. Negative acquisition -fixtures refuse ignored/wrong ranges and corrupt assembled contents without -issuing a consumer receipt. The public HTTP RPC fixture includes cold recovery, -interruption, pause/resume, final range transfer and durable importer publication. -Verification results and rebuilt installers are recorded in the execution ledger -when completed. Standards snapshot -`snapshot:v1:8232afb5-be9d-4ee8-8099-ce42f109e2ea` selects 33 policies with no -unresolved routing categories. - -The running installed application and actual library were not restarted, -retried, repaired, copied, or hashed during this implementation. The rebuilt -candidate must replace the old process to change its policy. Already overwritten -bytes are not recovered by this fix. Download-location reconciliation and root -lock scope remain separate pending work. - - -### Accepted resume verification - -- Default core package: 2,331 passed, 30 existing opt-in tests ignored across - unit, integration and documentation suites (the unit suite is 2,103/14). -- Headless core unit suite: 2,074 passed, 13 existing opt-in tests ignored. -- S3 acquisition unit coverage: 215 passed, two opt-in tests ignored; S3 reader - and acquisition integration suites: 58 passed. -- Default RPC package: 438 passed, 12 opt-in tests ignored, including all 410 - binary unit tests and the controlled public HTTP resume/import flow. -- Default S3 RPC selection: 17 passed. The separately gated headless S3 facade - suite also passed 17 tests, with its existing browser-coordinator test ignored. -- Default core/RPC all-targets Clippy, the CI-selected headless S3 core Clippy, - and default-feature S3 RPC all-targets Clippy passed with warnings denied. - Formatting and production frontend/Electron builds passed. - -An extra combined no-default core/RPC S3 all-targets Clippy experiment reported -11 dead-code warnings in existing test-only inference contract declarations. -Their feature guards are unchanged from the admitted slice baseline -`6761244b`. The repository's strict S3 CI lint gate selects the core package -separately; default-feature RPC lints pass. No warnings were suppressed. Strict -headless RPC inference-test gating remains separate cleanup, and is not claimed -qualified by this resume change. - -Initial broad debug builds exhausted the filesystem and produced link/write -failures; those runs are invalid acceptance evidence. Only task-generated -compiler output was removed. Final verification used two compiler jobs, disabled -incremental compilation, and debug level zero for development/test artifacts; -the optimized installer backend retains the normal release profile. Logs are -in ignored original-repository `tmp/pr69-resume-policy-*.log`. No runtime -inference or native Windows/macOS execution was performed. - -### Verified resume-policy installers - -Committed source and newly built RPC producer: -`bf19765a23d1cbe6fc0c3db429f2cac413cb4ce9`. The backend uses the normal -default-feature optimized `release` profile, with locked/offline Cargo inputs; -frontend and Electron production builds also passed. The unchanged frontend -suite retains its earlier `963fe94e` evidence (939 passed, one existing skip), -rather than claiming another execution. - -Local installers are retained in original-repository -`electron/release/resume-policy-20261011/`, beside `SHA256SUMS` and -`local-build-record.json`: - -| Artifact | Bytes | SHA-256 for explicit artifact verification | -| --- | ---: | --- | -| `pumas-library-electron_0.8.0-rc.1_amd64.deb` | 125,099,368 | `43301d8f143b7d7e2a55d11bbe4d82737c8f5d299334ed653ca6f3a7c114be94` | -| `Pumas.Library-0.8.0-rc.1.AppImage` | 160,689,560 | `d9ab2dde47f590c9a229aa0b927b480e82ed1ac95e3422e3e2fb24a7668d3d48` | - -Exact extracted Debian/AppImage resource and backend health/shutdown checks -passed. Isolated Debian installation, alternatives, Electron 43.7.0 identity -and removal passed. The host installation and running app were not changed. -Package checks verify selected build artifacts; they do not introduce automatic -post-acquisition model hashes. No signing, publication, model inference, native -Windows/macOS execution, byte-for-byte build reproducibility or actual retained -model download is claimed. - -The first packaging attempt was blocked by sandbox DNS for GitHub; it was -stopped, and packaging with network access passed. Electron Builder reported -existing desktop window-association guidance. The disposable Debian installation -skipped the bundled AppArmor profile on this host and reported alternatives -cleanup warnings during successful removal. Logs: -`tmp/pr69-resume-policy-rpc-release.log`, -`tmp/pr69-resume-policy-package-network.log`, -`tmp/pr69-resume-policy-package-smoke.log` and -`tmp/pr69-resume-policy-deb-install.log` in the original repository. Disposable -install evidence remains in `tmp/pumas-deb-install-sptr9k7c`; package smoke -extraction was automatically removed. Replace the installed binary and reopen -Pumas to apply this policy; source changes do not update the live process. diff --git a/docs/investigations/pr69-audio-ci-followup-2026-10-10.md b/docs/investigations/pr69-audio-ci-followup-2026-10-10.md deleted file mode 100644 index 74dc5fbed..000000000 --- a/docs/investigations/pr69-audio-ci-followup-2026-10-10.md +++ /dev/null @@ -1,65 +0,0 @@ -# PR #69: audio dependency installation - -## Observed failure and cause - -[CI run 38095339520](https://github.com/MrScripty/Pumas-Library/actions/runs/38095339520) -at `98eb3baf0ccae6e455bf6d0a7017626cae62bf1c` retained installed -runtime metadata. Comparison against the unchanged source recipe showed the same -68 package names, matching managed Python distribution/provider and 66 identical -dependency artifacts. NumPy resolved to 2.5.4 instead of 2.5.3; narwhals resolved -to 2.27.1 instead of 2.26.0. Their URLs and artifact hashes also differed. - -The installer resolved dependencies from indexes and wrote its lock afterward. -Agreement among that report, resolution and lock recorded the selected downloads; -it did not establish agreement with the existing candidate recipe. The rejection -was a reproducible dependency-selection error, not evidence of damaged files. - -## Repair and revised policy - -The existing source-recipe owner derives version constraints for all 68 entries. -The normal staged installer passes those constraints through the Python resolver -to ordinary index-based pip installation. Before staged package publication, it -requires every artifact's name, version, URL and SHA-256 to match the recipe. -No second pin list or replacement direct-URL dependency installation is used. -This exact recipe applies only to its existing Linux x86_64 GNU CPU/Python 3.12/ -cohere-asr/Torch candidate; other selections retain their existing policy. - -The user subsequently selected the project-wide -[acquisition checksum policy](../plans/acquisition-checksum-policy.md): verify a -supplied SHA during acquisition, retain the evidence, and check contents later -only on explicit request. This supersedes the earlier proposal to preserve the -final installed-byte gate. Installed interpreter/tree/model SHA checks and the -indirect content-derived model correlation gate have been removed. Path custody, -required members, sizes, package selection, confinement and lifecycle checks remain. -The source recipe and supplied archive download hashes were not loosened. - -The qualification example performs a cold installation in an initially empty -private root, retains phase evidence, removes only that managed runtime through -the public version-removal operation, then reinstalls with the same warm cache. -Both phases run the confined dependency probe and must select identical package -and managed-Python identities. CI retains both phases' metadata and probe reports. - -## Local cold/warm result - -On 2026-10-11, the normal installation and qualification example exited zero in -`tmp/ci-audio-coldwarm-20261011-retry` beneath the original repository. Both phases -selected all 68 recipe artifacts with matching name/version/URL/SHA evidence and -matching managed-Python distribution/provider. Independent metadata comparison -confirmed those identities. Both confined probes reported `status=passed`, -`child_tree_drained=true` and `production_available=false`: Torch 2.10.0+cpu, -Transformers 5.4.0, dependency imports and a CPU operation only. No model inference -or ASR was run. The path contains spaces and is supported by the revised policy. - -An earlier attempt ran out of disk while pip acquired Torch. Its failure evidence -was retained in `tmp/ci-audio-coldwarm-20261011`; the user freed space before the -successful fresh-root retry. This was an environment failure, not a code repair. -The earlier 2026-10-10 evidence is also preserved. These directories contain -private runtime dependencies and evidence, not copies of library models. - -Before repair, the constraint-forwarding regression rejected the unknown CLI -argument and the publication regression accepted consistently changed metadata. -The revised tests require constraint forwarding and refusal of changed package -name, version, URL or hash, including the observed NumPy drift. Current aggregate -verification and compatibility limits are recorded in the checksum-policy plan. -A hosted rerun remains required; local Linux checks do not establish Windows or -macOS behavior. Download reconciliation remains a separate, pending plan. diff --git a/docs/investigations/pr69-gguf-ci-followup-2026-10-10.md b/docs/investigations/pr69-gguf-ci-followup-2026-10-10.md deleted file mode 100644 index 36644abdd..000000000 --- a/docs/investigations/pr69-gguf-ci-followup-2026-10-10.md +++ /dev/null @@ -1,80 +0,0 @@ -# PR #69: GGUF CI failure - -## Observed run - -[CI run 38095339520](https://github.com/MrScripty/Pumas-Library/actions/runs/38095339520) -ran head `98eb3baf0ccae6e455bf6d0a7017626cae62bf1c`. Native Windows, -macOS and Linux Torch QA passed. The headless core unit suite, including the -startup preflight regression, passed. Its acquired-GGUF integration test failed -at the awaited descriptor-refusal assertion. Nine other tests in that binary -passed. Downstream release jobs were skipped, not accepted. - -The original failure did not identify which of twelve corruption cases ran. -Ten local runs of the original cohort with diagnostic assertions all passed; -that does not establish the original case or rule out an interleaving. - -## Controlled reproduction and repair - -The fixture disables HF but starts the filesystem watcher and startup work. -Both primary-selection paths use the same acquired-publication validator. -Descriptor refresh observes retained publication gates; it does not recreate a -missing index row. Filesystem reconciliation can recreate that projection from -intact canonical metadata, confirmed receipt and verified physical payload. - -A temporary controlled probe used the actual `index_model_dir` operation between -synchronous refusal and awaited descriptor resolution in `missing_index`. It -reproduced the failed assertion: index before was absent; index after contained -the current Ready publication; resolution succeeded with the acknowledged primary. -This proves that legitimate repair can invalidate the old test's assumption. -It does not prove which unlabelled case raced in the original hosted run. - -The negative test now drains the public instance shutdown receipt before fault -injection. A successful primary/descriptor resolution after drainage is the -positive control; shutdown cannot itself satisfy the negative assertions. All -twelve cases retain both refusal assertions and identify the corruption, result, -and before/after index evidence on unexpected success. No sleeps, assertions -weakened, receipt changes, or production-validator bypasses were introduced. - -A separate live test calls `rebuild_model_index` on a running API, without a -restart. Missing rows and stale index paths/entry paths recover from a valid -publication. Corrupted primary/projector payloads and a pending receipt remain -refused after reconciliation; the invalid bytes/receipt remain unchanged. - -## Verification boundary - -Commands used the locked graph and native Linux test permissions, with -`CARGO_PROFILE_DEV_DEBUG=0`, `CARGO_PROFILE_TEST_DEBUG=0`, and -`CARGO_BUILD_JOBS=4`: - -- `cargo test --locked --manifest-path rust/Cargo.toml -p pumas-library - --no-default-features --test acquired_gguf_vision -- --nocapture`: 11 passed. -- Same command with default features: 11 passed. - -- Full `cargo test --locked --manifest-path rust/Cargo.toml -p pumas-library - --no-default-features`: 2,070 unit tests passed (13 existing ignored), - 219 integration tests passed, six doc tests passed (eight existing ignored). - This is the complete failing headless CI command, without a test filter. - -The controlled reproduction was removed. No `[DEBUG-ci-gguf]` instrumentation -remains. This repair is separate from download-location reconciliation, whose -plan and pending acceptance claims are unchanged. A hosted rerun still must -validate the revised source; these results are local Linux evidence. - -## Subsequent checksum-policy change - -The preceding evidence describes the watcher-race repair at `2ada3d9e` before the -user changed the integrity policy. The subsequent -[checksum policy](../plans/acquisition-checksum-policy.md) permits same-file, -same-size content changes after verified acquisition, retaining the original SHA -for explicit verification. The focused test now distinguishes those allowed -changes from refused receipt, index, path and file-replacement cases. Live reindex -can recover index projections and admit changed payload contents; a pending -receipt still refuses. An explicit deep hash operation remains tested separately. - -A live primary-content fixture initially used a noncanonical directory. Reindex -legitimately moved it from `vision/migrated/live-reindex` to -`llm/llama/live-reindex`, so the old model ID could not resolve. The fixture now -starts at the canonical location and mutates opaque equal-size payload padding, -separating content-check policy from classification and folder-move behavior. -This does not alter production classification or suppress the original diagnostic. -Current feature-specific results are recorded in the checksum-policy plan. diff --git a/docs/investigations/pr69-review-followup-2026-10-10.md b/docs/investigations/pr69-review-followup-2026-10-10.md deleted file mode 100644 index abfd069bb..000000000 --- a/docs/investigations/pr69-review-followup-2026-10-10.md +++ /dev/null @@ -1,144 +0,0 @@ -# PR #69 review follow-up - -Scope: repair the two reviewed regressions, investigate audio qualification, and -selectively transfer/amend the reconciliation plan. Reconciliation implementation, -live-library repair, model inference and a new Debian release are outside this -follow-up. The plan remains Planned; its ten acceptance claims remain pending. - -## Source and selective integration - -GitHub main/base was `ad31e391dcd94c204b3fcd748cc98d27b3281e65`; PR #69's -reviewed head was `1a78ea8ecbe3ddf589d84db6783577eaf4efb79d`. Both remote refs -were verified before work. Local review branch: `fix/main-test-validation`. - -| Source branch / commit | Accepted replacement | Integration / verification | -| --- | --- | --- | -| `work/acquisition-q1-http`, investigation `1568e90c` | `a36b91e8236a65b05bc4f6e3e2fc9fe7e79d511b` | Selective document reconstruction; investigation matches the source blob exactly. | -| `work/acquisition-q1-http`, plan `0b97dcb2` | `a36b91e8236a65b05bc4f6e3e2fc9fe7e79d511b` | Only the eight planning documents transferred, then amended for this review. Links, all ten pending claims and the exact staged scope checked; active hooks passed. | - -The old branch was not merged. Its unrelated acquisition edits and untracked -document remain user-owned, with the tracked binary diff verified byte-identical -to the preserved pre-task baseline. The original branch is retained for that -work, not retired by document transfer. The locked PR worktree is retained for -the maintainer's push/review under the [ledger's resource contract](../plans/download-location-reconciliation/execution-ledger.md). -No published history was rewritten and no push was performed. - -## Regression repairs and observed evidence - -The missing constant was reproduced with Windows GNU cross-target compilation: -`cargo check --locked --manifest-path rust/Cargo.toml -p pumas-app-manager --tests ---target x86_64-pc-windows-gnu`. Before the fix it failed with E0425 at the -unconditional cancellation test's timeout reference. The same check passed after -`f6fb33fc` removed the Linux-only constant gate. The actual Linux cancellation -test passed, one test selected. The existing Windows/macOS CI jobs show the same -E0425 at the reviewed head; native Windows MSVC/macOS jobs still require a rerun. -GNU cross-compilation is not native-platform execution evidence. - -The headless startup regression was reproduced by running the exact core test -`tests::acquisition_integration::acquisition_integration_startup_refuses_legacy_store_without_rewriting_it` -with `--no-default-features --lib`. Before the fix, registry absence failed after -legacy refusal. After `58fa0382` removed the feature gate, the same test passed. -Runtime HF enablement now controls preflight, matching actual initialization. -Catalog-query and HF-disabled behavior retain their existing conditions. - -Focused HF-disabled compatibility also passed: one test selected, -`ordinary_builder_leaves_legacy_state_read_only_until_explicit_offline_migration` -in `--no-default-features --test artifact_acquisition`. It verifies supported -legacy reads remain unchanged until explicit migration. - -The full core library suite with `--no-default-features --features hf-client ---lib` passed: **2,070 passed, zero failed, 13 existing ignored**, with no filter. -This includes the startup regression. The full `--no-default-features --lib` -suite also passed: **2,070 passed, zero failed, 13 existing ignored**, no filter. -Commands used the locked dependency graph, -repository toolchain and native subprocess/loopback permissions, with -`CARGO_PROFILE_DEV_DEBUG=0`, `CARGO_PROFILE_TEST_DEBUG=0`, `CARGO_BUILD_JOBS=4`. -Formatting and diff checks passed. Other workspace/frontend/Electron/release -suites were not rerun for these two Rust lines; this is not a full candidate QA -or release claim. - -## Audio qualification: evidence and remaining blocker - -The [failed CI job](https://github.com/MrScripty/Pumas-Library/actions/runs/38090970191/job/114327241132) -at `1a78ea8e` installs successfully, then refuses during source-pinned recipe -validation, before dependency confinement qualification. Its retained artifact -contains only source identity and the probe log; installed `runtime.json` is -absent. The relevant installer, recipe and workflow files were unchanged by the -reviewed PR range. Exact attribution to a particular selected field in that run -cannot be recovered from its generic error alone. - -Three hypotheses were investigated in order: - -1. Interpreter selection drift. The installed pinned uv `0.12.18` catalog selects - CPython `3.12.14` for Linux x86_64 GNU, matching the recipe's distribution and - source URL. Provider version/archive pin also match source. This observation - does not attest the missing CI executable bytes. -2. Dependency resolution drift. Qualification requests Python minor `3.12` and - uses the general installer; `resolve_runtime.py` leaves core/cohere-asr - dependencies partly unpinned. A resolution-only probe with the existing pinned - uv, the recipe's exact official CPU Torch wheel URL, and the current source - CORE/cohere-asr constraints resolved the same 68 package names, but differed: - - | Dependency | Recipe pin | Current resolved version | - | --- | --- | --- | - | NumPy | `2.5.3` | `2.5.4` | - | narwhals | `2.26.0` | `2.27.1` | - - This is a concrete counterexample to reproducible recipe selection and - supports dependency drift as the likely cause. The probe uses uv resolution, - whereas the actual installer uses pip; it is not the missing original CI - selection or installed-byte/confinement evidence. No packages or models were - installed by the resolution-only probe. -3. Installed member/metadata drift. Exact retained interpreter/dependency bytes - cannot be checked without a successfully installed matching candidate. - -A replay of the unmodified `qualify_audio_dependencies` example used a fresh -ignored fixture under the original repository's -`launcher-data/cache/torch-qualification/`, never the live library. It failed -earlier with `Pinned uv archive download was interrupted`; it did not reach the -recipe comparison. No model weights were acquired. An initial resolution probe -also exhausted local disk; its retry after build-cache cleanup succeeded. -Cache cleanup interrupted one feature-check compile; that invalid run was -replaced by the successful complete HF-enabled core suite above. - -The workflow now preserves the installed runtime selection with `if: always()` -alongside the existing source/probe artifact, even when recipe validation fails. -It captures only fixture runtime metadata, not environment variables, live -library data or models. The bounded existing artifact retention remains seven -days. The recipe, acquisition checks and qualification gates are unchanged. -Workflow structure passed CI-pinned actionlint `1.7.8`; local shellcheck/pyflakes -were unavailable, so those subchecks remain native CI obligations. The new Bash -step passed syntax checking and actual absent/present fixture replay, including -byte-exact copying and upload-path selection. - -Audio candidate qualification remains **unsatisfied**. Next: rerun CI after the -maintainer pushes, compare its captured installed selection with the source -recipe, and make qualification acquisition reproducibly select the reviewed -recipe through the existing owned installer. Do not merely update pins to the -latest resolver output or bypass byte validation. A passing dependency recipe -alone still does not prove confinement, controlled-session lifecycle or model -inference; run the actual required qualification chain before acceptance. - -## Plan amendments - -The [amended plan](../plans/download-location-reconciliation/plan.md) now requires -an explicit warning before the first HF storage upgrade, cancellation without -upgrade, and separate direct-library versus upgraded-RPC-server tests using the -actual Lanternwake/Eidetic pinned dependency revisions. Those sources/pins are -not available in the adjacent checkouts; obtaining and testing them is a blocking -C5 input before recovery UI expansion, not assumed compatibility. - -It also distinguishes durable queue-admission release from live destination -ownership. The existing `DestinationExecutionOwner` restores dormant claims, -while generation-scoped release alone cannot settle them. M1 must settle the -exact restored claim after durable publication and before success, fence stale -inventory/generations, allow a new authorized same-destination transfer immediately -without restart, and preserve both unrelated paused downloads and their claims. -Interruption between publication and live settlement is explicitly tested. - -Coding standards MCP was rerouted at -`snapshot:v1:f7ec5a4e-affb-4206-91ad-a4b1f74260fe`, schema 5; both pages read, -42 policies selected and zero unresolved fact categories. Source repairs preserve -the existing owners; amendments add independent consumer/effect observations -instead of accepting projection agreement. No reconciliation code-compliance or -release acceptance is claimed before its implementation and required evidence. diff --git a/docs/investigations/vision-request-count-2026-10-11.md b/docs/investigations/vision-request-count-2026-10-11.md deleted file mode 100644 index 11b31da0a..000000000 --- a/docs/investigations/vision-request-count-2026-10-11.md +++ /dev/null @@ -1,35 +0,0 @@ -# Unexplained vision fixture request count - -The first RPC package run during deletion-scope validation failed the -`seventh_descriptor_requires_selected_semantics_supported_profile_and_live_props` -case `managed_without_session`. Its expected availability refusal passed, but -the fake backend's request collection was nonempty. The initial assertion did -not include the URI or whether the request preceded the capability query. -The exact request origin is therefore unavailable. - -The production vision validator, transport-session guard and fixture setup -were unchanged by the deletion repair. That excludes an edit to those files; -it does not prove that timing or other changed behavior had no effect. Possible -origins considered were background fixture work, profile setup before the query, -or an improperly ordered capability probe. No cause was established and the -failure is not classified as flaky. - -The focused invocation passed (one test, 6.03 seconds), the labelled invocation -passed, and its concurrent vision cohort passed eight tests. A final full RPC -package run passed 438 tests with 12 existing opt-in skips, including all 410 -binary unit tests. These are observations of those runs, not proof that the -earlier counterexample is resolved. Logs remain in original-repository -`tmp/pr69-delete-scope-rpc-all.log`, `pr69-delete-scope-vision-repro.log`, -`pr69-delete-scope-vision-labelled.log`, `pr69-delete-scope-vision-cohort.log` -and `pr69-delete-scope-rpc-labelled.log`. - -The only test change snapshots requests immediately before the capability -query and includes that snapshot plus all observed request URIs/bodies in the -existing failure assertion. The cases, expected availability reasons, zero-call -requirement and positive live-probe requirement remain intact. All captures -come from synthetic localhost fixtures. No sleep, retry inside the test, -background shutdown, assertion relaxation or production validator change was -introduced. Preserve this as an unresolved request-origin issue if it recurs; -the added evidence will distinguish the candidate origins. Native model -inference remains untested. This diagnostic is separate from model deletion -and download-location reconciliation. diff --git a/docs/library-upgrade.md b/docs/library-upgrade.md index bc9267d38..c79b92073 100644 --- a/docs/library-upgrade.md +++ b/docs/library-upgrade.md @@ -6,8 +6,9 @@ library never performs this upgrade automatically. The app stays open so you can explicitly upgrade its metadata, select another library, or close it. If it shows **Library could not start**, first close other apps using that -library and reopen Pumas Library. The app's main log retains the startup failure; -an unavailable backend never becomes an empty or ready library. +library and reopen Pumas Library. The recovery screen shows the reason the +backend reported, and the app's main log retains the startup failure; an +unavailable backend never becomes an empty or ready library. ## Upgrade from the desktop @@ -86,12 +87,21 @@ The migration and historical-writer obligations are owned by the ## Startup diagnostic boundary -The RPC startup supervisor emits a newline-delimited, path-free stdout frame -`PUMAS_STARTUP_FAILURE={"version":1,"reason":"migration-required"}` only -for the typed `acquisition.migration_required` failure, before exiting nonzero. -The Electron bridge reads bounded complete lines across chunks and waits for -stdio closure before consuming a failed-start diagnostic. Unknown versions, -malformed frames and other startup failures become `backend-unavailable`. +Every fatal RPC startup failure writes one newline-delimited stdout frame +`PUMAS_STARTUP_FAILURE={"version":1,"reason":...}` before exiting nonzero. +The typed `acquisition.migration_required` failure uses reason +`migration-required` and opens the upgrade flow above; every other failure uses +`backend-unavailable` with a bounded `detail` (home directory shown as `~`), +which the recovery screen displays. The Electron bridge reads bounded complete +lines across chunks and waits for stdio closure before consuming a failed-start +diagnostic. Readers ignore unknown fields; unknown reasons and malformed frames +become `backend-unavailable`. + +Download state that is current but unreadable by this version (for example, +fields written by a newer Pumas) is not a migration case. The backend starts +with the library, models and inference available, disables downloads without +rewriting that state, and reports the reason in a status banner. Open the +library with the newer version, or upgrade this one. Ordinary HF-enabled owners check an existing download store while holding the physical library lease, before claiming the registry or starting background work. diff --git a/docs/native-bindings.md b/docs/native-bindings.md index 5e10118c2..24d218883 100644 --- a/docs/native-bindings.md +++ b/docs/native-bindings.md @@ -2,14 +2,16 @@ ## Status -Pumas has a UniFFI adapter and generators for Python, Kotlin, Swift, Ruby, and -C#. CI generates archives, and the repository includes a local C# compile/load -smoke. The project does not yet have a verified host/runtime support matrix, so -these bindings should be treated as experimental rather than generally -supported SDKs. +No host-language binding is supported. `bindings/support-matrix.json` is the +authority: its contract status is `no_supported_host_bindings` with no accepted +host tuple, and it lists every current surface (UniFFI Python, Kotlin, Swift, +Ruby and C#, the Rustler/Elixir crate, and the Go claim) under +`removed_surfaces`, because none has a real host consumer or host-runtime +evidence. That removal is decided but not yet carried out: the `pumas-uniffi` +and `pumas_rustler` crates, generators and local smoke still exist. -`pumas_rustler` is also experimental. Its current NIF surface consists mainly -of local conversions and does not expose the core Pumas library API. +CI does not generate or package bindings, and binding archives are not release +assets. `pumas_rustler` does not expose the core Pumas library API. ## Boundary @@ -60,8 +62,10 @@ different commits, versions, targets, or profiles. ## Promotion Requirements -A host/language combination becomes supported only when CI or equivalent -release evidence exercises the exact packaged cohort through: +A host/language tuple is admitted to the support matrix only with a named real +consumer, an exact host runtime and native target, a supported operation and +lifecycle contract, deterministic cohort generation, and CI or equivalent +release evidence that exercises the exact packaged cohort through: - native library loading; - a synchronous call; diff --git a/docs/package-facts-fingerprint-canonicalization.md b/docs/package-facts-fingerprint-canonicalization.md index a780f73e0..917ae7aae 100644 --- a/docs/package-facts-fingerprint-canonicalization.md +++ b/docs/package-facts-fingerprint-canonicalization.md @@ -1,8 +1,5 @@ # Canonical package metadata fingerprints -See the [portable qualification report](package-facts-fingerprint-qualification.md) -for the recorded old/new control results and compatibility limits. - Package metadata includes a `HashMap` model card. Serializing that map directly into a source fingerprint makes otherwise identical observations depend on map insertion order and each process's random hash seed. A pinned import can therefore diff --git a/docs/package-facts-fingerprint-qualification.md b/docs/package-facts-fingerprint-qualification.md deleted file mode 100644 index 5e18cf06a..000000000 --- a/docs/package-facts-fingerprint-qualification.md +++ /dev/null @@ -1,97 +0,0 @@ -# Package fingerprint repair qualification - -Qualified on 2026-10-06. Repair commit: -`ee1c364654a40d7c02d58c59f8e3904d26ba1d20`, based on Pumas main -`5e114f6d8e4559e0a4d67e56000b423120a0fde0`. This report summarizes the recorded -local tests; publication does not constitute a new qualification run. - -## Controlled importer result - -The unchanged-source control reproduced -`Required pinned package-facts output is stale or unsupported`. -The repaired control completed through the managed Pumas importer, issued its -own validated pinned completion receipt, and settled custody to `adopted`. - -| Observation | Unchanged source | Repaired source | -|---|---|---| -| Status | Error | Completed | -| Completion receipt | Absent | Present | -| Custody | Using | Adopted | -| Read-only currentness | 0/32 | 32/32 | -| Source requests | 0 | 0 | -| Shutdown | Same owned download failure | Success | - -Each control used a separate new library/store and a local copy of the verified -Qwen payload. Hub, API and payload endpoints were replaced with a rejecting -loopback server. Pinned publisher metadata was supplied as fixture input; it was -not a new publisher fetch. The source and copied bytes were independently hashed: - -- Repository: `Qwen/Qwen2.5-0.5B-Instruct-GGUF`. -- Revision: `9217f5db79a29953eb74d5343926648285ec7e67`. -- File: `qwen2.5-0.5b-instruct-q4_k_m.gguf`, 491400032 bytes. -- SHA-256: `74a4da8c9fdbcd15bd1f6d01d621410d31c6fc00986f5eb687824e7b93d7a9db`. -- Source metadata license: `apache-2.0`. - -The actual GGUF v3 parser output was present: architecture `qwen2`, -`MOSTLY_Q4_K_M`, tokenizer `gpt2`, chat template present, context 32768, embedding -896, blocks 24 and attention heads 14. The fixture checked metadata schema 2, -package-facts contract 3 and model-ref contract 1. The GGUF inspector revision -remains `llama-ftype-v1`. - -## Validation and source trace - -The producer constructs `PackageInspectionContext`, parses GGUF evidence and -persists facts under `PackageInspectionManifest::source_fingerprint`. -Receipt issuance recomputes the context through -`cached_model_package_facts_are_current` and the existing contract/artifact/ -revision classifier. The repaired importer passed these checks and published its -own receipt; the test did not fabricate or force one. - -The six fingerprint regressions passed, covering six insertion orders, sixteen -fresh deserializations per order, nested objects, six separate process hash -seeds, semantic/array changes, size/mtime changes and legacy hash invalidation. -The unchanged source failed the read-stability and process-seed controls. -The full managed-importer test passed explicitly with its 180-second completion -bound and rejected mismatched fingerprints and package-facts versions 2 and 4. - -| Relevant suite or checks | Passed | -|---|---:| -| Package facts, including fingerprint regressions | 23 | -| Importer | 33 | -| Receipt store | 68 | -| Cache contracts | 7 | -| Freshness, canonical finalization, pinned verification and settlement | 9 | - -These are 140 successful regression executions; one targeted case also appears -in the importer suite. Two receipt-store process-fixture tests remained ignored. -The explicit full Qwen importer control is additional. Coverage is limited to -these suites and the selected features. Rust 1.92.0 builds were locked/offline, with -`--no-default-features --features test-support` and `ORT_SKIP_DOWNLOAD=1`. -Default and test feature graphs contained no ORT `download-binaries` feature. -Reproduction commands are in the [repair documentation](package-facts-fingerprint-canonicalization.md). - -## Compatibility and limits - -Metadata object keys are recursively canonicalized; arrays, nulls and meaningful -values retain their significance. Existing raw-JSON fingerprints become stale -and require fresh observation through the normal owned producer. No old row or -receipt is relabelled, and pinned-output validation is unchanged. - -The existing file fingerprint observes size and nanosecond mtime, not file -content. Same-size tampering that restores mtime remains outside that cache -contract; managed SHA-256 verification is separate. The GGUF parser reads the -version field without enforcing general rejection of unsupported versions, so -this qualification establishes the actual v3 fixture only. - -The defect is sufficient to reproduce the complete importer failure and the -repair is sufficient for this controlled import. Exact reconstruction of the -historical fingerprint remains unresolved because its original generator inputs -were not logged. This does not prove that key ordering explains every historical -hash bit or that the preserved failed acquisition can safely be recovered. - -All 77 original state files remained identical by SHA-256, size, mtime and inode. -Initial harness compile/lookup failures and corrected control evidence remain -preserved locally. Raw evidence, custody records, identifiers, workspace paths, -logs and weights are excluded from this publication. No redownload, original -record recovery, runtime startup or inference was performed; no story, voice or -production-loader behavior was qualified. diff --git a/docs/plans/acquisition-checksum-policy.md b/docs/plans/acquisition-checksum-policy.md deleted file mode 100644 index d7c2d3668..000000000 --- a/docs/plans/acquisition-checksum-policy.md +++ /dev/null @@ -1,284 +0,0 @@ -# Acquisition checksum policy - -The user selected this policy on 2026-10-10: verify a supplied SHA when -acquiring a file, retain the SHA, and perform subsequent content verification -only on explicit request. An installed file may legitimately differ from its -downloaded artifact. A historical checksum is not automatic startup, read, -reconciliation, or execution authority. - -## Ownership and contracts - -| Concern | Owner | Required behavior | -| --- | --- | --- | -| Download verification | Acquisition service and staged runtime installers | Reject a mismatch against a supplied expected SHA before acquisition succeeds. Keep the expected and observed evidence in the existing receipt. | -| Retained checksum evidence | Existing acquisition receipts, model metadata and runtime manifests | Preserve stored SHA values. Do not rewrite live libraries or substitute invented digests. | -| Explicit integrity verification | Existing user-requested model verification operation | Continue to verify retained checksums when explicitly invoked. | -| Installed library observation | Publication, package and runtime read-source owners | Check ownership, regular-file/path bindings, required members and receipt state without checking content SHA. | -| Package selection | Runtime recipe owner | Preserve package name/version/source identity and acquisition provenance. Do not compare an installed tree with a downloaded artifact or fixed tree digest. | -| Request authentication and identifiers | Existing authentication/identity owners | Hashing request signatures, metadata identities and protocol messages is separate from rechecking downloaded file contents. | - -Persisted receipts remain readable and retain their existing checksum fields. -Internal Rust/Python consumers must change together wherever content-checking -semantics change. Preserve supported path and receipt failures; do not turn a -Pending or invalid receipt into successful acquisition evidence. - -## Implementation and acceptance - -1. Separate historical checksum evidence from current file/namespace ownership - in model publication and acquisition read paths. Retain explicit verification. -2. Remove automatic installed-runtime, interpreter, model and copied-source SHA - comparisons at their owning modules and coordinated Rust/Python consumers. - Delete fixed installed-tree digest/relocation validation as an acceptance gate. -3. Keep source recipe constraints and download-artifact checks in staged install. - Never loosen supplied download hashes to accept a newer package. -4. Update contracts, diagnostics and tests that promise automatic content - integrity. Tests must distinguish allowed content changes from refused path, - receipt, file replacement and required-member failures. -5. Verify supplied-download SHA success/mismatch, checksum retention and explicit - verification; exercise library reopen/reconciliation and runtime preparation - without content rechecking. Run affected Rust/Python suites, both GGUF feature - configurations, and normal cold/warm audio installs before reporting acceptance. - -The prior GGUF watcher-race repair and audio dependency-pin repair remain separate -from download-reconciliation implementation. This policy supersedes their older -requirements for automatic installed-byte validation. Live model files and library -databases are outside the implementation write set. - -## Coordinated cutover and compatibility - -The staged runtime recipe owner derives all 68 constraints from the existing -candidate JSON, passes them through the normal resolver and validates downloaded -artifact identities before publication. Installed file SHA fields remain retained -metadata, not execution gates. Explicit `RetainedRuntimeReadSource::verify_checksums` -checks retained evidence on request; it refuses when a selected member has no -historical checksum rather than inventing one. `RuntimeReadFile::sha256` now returns -`Option<&str>` and `RuntimeReadFile::observed` represents that absence. The removed -public fixed installed-byte helper has no replacement automatic gate. Direct Rust -consumers of this prerelease candidate must recompile and update these API calls. -The affected workspace consumers are compiled and tested together. - -Rust and the Python child now use `pumas-cohere-owned-v2:` followed by a digest of -framed model/artifact labels and sorted member names and lengths. This private -correlation value compares layout only; the original held owner supplies authority. -It never compares freshly hashed model contents. The coordinated producer/consumer -cutover replaces v1 atomically. Python capture has no original acquisition SHA to -supply and represents that evidence as absent. Existing persisted receipts and -model checksum fields retain their schema and values; RPC request/response shapes -are unchanged. No library migration or receipt rewrite is required for this policy. -An older installed private v1 worker requires a fresh runtime installation before -using the experimental v2 session path; incompatible hello correlation remains a -typed startup refusal with child drainage. Reading a runtime does not rewrite its -code. The shipping audio admission catalog remains closed, so this is not a newly -qualified production audio path. - -The acquisition workspace owns first verification and caches its receipt against -the actual file binding. Owned partial writes invalidate that cache. Reopen admits -an authenticated complete receipt by checking metadata and current bindings; -publication and use do not rehash completed files. An interrupted, hashless member -without a durable completion receipt is still unavailable as verified evidence. -It is preserved with any fresh transfer for reconciliation, without hashing the -old file into a fabricated receipt or overwriting it. Existing source-supplied SHA -recovery remains first acquisition verification. The ongoing HTTP partial-prefix -checkpoint belongs to incomplete acquisition, not a post-download check. - -No automatic checksum bypass switch was added. Each existing owner now implements -the same policy for its consumers; physical ownership, namespace, length, required -members and Ready/Confirmed receipt checks continue to refuse their own failures. -Local import/copied-source operations can record digests while streaming bytes; -those observations cannot become automatic integrity gates. Explicit deep scan -and integrity operations still compare contents when requested. - -## Standards and review boundary - -Coding standards MCP routing selected 33 applicable policies with no unresolved -facts under snapshot `snapshot:v1:062e8bee-26c4-43c3-8920-d4cd96fa2135`. -The implementation follows the canonical acquisition/runtime/recipe owners, the -coordinated contract evolution rules, explicit persisted/API compatibility -semantics and per-commit staged review. This is one project-wide checksum-policy -cutover, including reproducible acquisition of the audio recipe. The prior GGUF -watcher repair is already a separate commit. No download-location reconciliation -implementation or inference acceptance is included. - -The active branch is `fix/main-test-validation`, based on main `ad31e391`, retained -for Jeremy's independent review and push under the existing protected-worktree -contract in the download-location reconciliation execution ledger. The original -dirty work branch and live library remain outside this write set. Generated source -attribution inventories are regenerated through their canonical producer; their -input freshness hashes are separate from acquired-file integrity checks. - -Generated outputs may use the existing `rust/target`, `frontend/dist` and -`electron/dist` owners and task-specific ignored directories beneath the original -repository's `tmp/`. Runtime installation tests and their environment stay in the -repository. A separate ignored S3 build directory avoids exhausting the filesystem -containing the validation checkout. No live library or model paths are build inputs. - -Declared source/documentation write set: - -- `.github/workflows/build.yml` -- `docs/contracts/artifact-acquisition.md` -- `docs/contracts/audio-custody-foundation.md` -- `docs/contracts/cohere-native-cohort.md` -- `docs/contracts/installed-audio-constructor.md` -- `docs/contracts/installed-audio-session.md` -- `docs/contracts/owned-audio-lifecycle.md` -- `docs/contracts/owned-audio-transport.md` -- `docs/investigations/pr69-audio-ci-followup-2026-10-10.md` -- `docs/investigations/pr69-gguf-ci-followup-2026-10-10.md` -- `docs/plans/acquisition-checksum-policy.md` -- `docs/release-notes-0.8.0-rc.1.md` -- `docs/release-attribution/0.8.0-rc.1-s3/inventory.json` -- `docs/release-attribution/0.8.0-rc.1/inventory.json` -- `rust/crates/pumas-app-manager/examples/qualify_audio_dependencies.rs` -- `rust/crates/pumas-app-manager/src/version_manager/audio_native_cohort/tests.rs` -- `rust/crates/pumas-app-manager/src/version_manager/audio_runtime_recipe.rs` -- `rust/crates/pumas-app-manager/src/version_manager/installer.rs` -- `rust/crates/pumas-app-manager/src/version_manager/installer/torch.rs` -- `rust/crates/pumas-app-manager/src/version_manager/managed_python.rs` -- `rust/crates/pumas-app-manager/src/version_manager/mod.rs` -- `rust/crates/pumas-app-manager/src/version_manager/torch_preview.rs` -- `rust/crates/pumas-app-manager/src/version_manager/torch_read_source.rs` -- `rust/crates/pumas-app-manager/src/version_manager/torch_read_source/tests.rs` -- `rust/crates/pumas-core/src/acquisition/service.rs` -- `rust/crates/pumas-core/src/acquisition/workspace.rs` -- `rust/crates/pumas-core/src/api/installed_audio.rs` -- `rust/crates/pumas-core/src/model_library/artifact_use.rs` -- `rust/crates/pumas-core/src/model_library/download_recovery.rs` -- `rust/crates/pumas-core/src/model_library/download_recovery/import_custody.rs` -- `rust/crates/pumas-core/src/model_library/hf/download.rs` -- `rust/crates/pumas-core/src/model_library/importer/publication.rs` -- `rust/crates/pumas-core/src/model_library/importer/staging.rs` -- `rust/crates/pumas-core/src/model_library/importer/staging/tests.rs` -- `rust/crates/pumas-core/src/model_library/importer/staging/tests/publication.rs` -- `rust/crates/pumas-core/src/platform/process.rs` -- `rust/crates/pumas-core/src/runtime_profiles/audio_runtime.rs` -- `rust/crates/pumas-core/src/runtime_profiles/audio_runtime/installed.rs` -- `rust/crates/pumas-core/src/runtime_profiles/audio_runtime/installed_tests.rs` -- `rust/crates/pumas-core/src/runtime_profiles/audio_session.rs` -- `rust/crates/pumas-core/src/runtime_read_source.rs` -- `rust/crates/pumas-core/src/runtime_read_source/candidate_recipe.rs` -- `rust/crates/pumas-core/src/runtime_read_source/dependency_probe.rs` -- `rust/crates/pumas-core/src/runtime_read_source/tests.rs` -- `rust/crates/pumas-core/tests/acquired_gguf_vision.rs` -- `rust/crates/pumas-core/tests/acquired_model_bridge.rs` -- `rust/crates/pumas-core/tests/acquired_onnx_package.rs` -- `rust/crates/pumas-core/tests/s3_acquisition.rs` -- `rust/crates/pumas-core/tests/s3_acquisition/manifest.rs` -- `torch-server/installed_cohere_source.py` -- `torch-server/loaders/owned_cohere_source.py` -- `torch-server/resolve_runtime.py` -- `torch-server/tests/test_installed_cohere_source.py` -- `torch-server/tests/test_owned_cohere_source.py` -- `torch-server/tests/test_resolve_runtime.py` - - -## Verification on 2026-10-11 - -The local target is Linux x86_64, Rust/Cargo 1.92.0, Python 3.12.3 in the ignored -original-repository `.venv`, Node 24.12.0 and pnpm 10.33.0. Cargo used the locked -offline graph, four jobs and disabled development/test debug symbols. Debug -assertions and normal test semantics stayed enabled. Native lifecycle/HTTP tests -ran with the local socket/process permissions their fixtures require. - -- Full default-feature Rust workspace, excluding only the repository-documented - BEAM-hosted `pumas_rustler`, with `pumas-app-manager/test-support`: passed. - App-manager: 323 passed, three ignored; core: 2,103 passed, 14 ignored; - RPC: 410 passed; UniFFI: 17 passed. All integration binaries passed, including - 12 acquired-GGUF tests under default features. Core doc tests: six passed, - eight ignored; the app-manager example doc test remains ignored. -- Headless core unit suite: 2,072 passed, 13 ignored. All headless integration - binaries subsequently passed: 222 test executions, eight designated helper - ignores. The 12 acquired-GGUF cases passed without default features too. -- S3-only integration binaries: 82 passed, one explicit HTTPS/signature - qualification cohort ignored. The cold model and auxiliary-content changes - reconcile with their original receipt/SHA; changed lengths, source SHA, - revision, identity, missing member and invalid receipt cases remain refused. -- Final focused acquisition workspace cohort: 15 passed, including reopened - read-only receipt reuse and invalidation before verifying a rewritten partial. - This follow-up preserves read-only reuse on Windows: only first acquisition - verification opens GENERIC_WRITE for its FlushFileBuffers operation. -- Windows GNU core/app-manager `--no-default-features --features test-support - --all-targets` compilation passed. Remaining warnings are in unchanged - platform/test helpers; this does not establish native Windows execution. -- Complete Torch Python suite after the coordinated source-ID change: 346 passed. - Release Python suite: 103 executed, one existing skip, all remaining passed. -- Frontend: 921 passed, one skipped. Electron: 268 passed, one skipped after - regenerating the attribution input inventory. Both production builds passed. -- Rustfmt, Ruff lint/format, affected-core/app-manager Clippy with warnings - denied, both generated attribution inventories and workflow syntax passed. - Workflow syntax validation did not include unavailable ShellCheck/Pyflakes. -- Real normal cold/warm audio installations and both confined dependency probes: - passed. All 68 name/version/URL/SHA acquisition identities and managed-Python - distribution/provider match the source recipe. Child trees drained, with - `production_available=false`; no model, inference or ASR was exercised. - -The pre-policy safetensors/ONNX/S3 integration assertions initially refused -post-verification content changes. They now distinguish valid content changes -from receipt and physical ownership failures, and explicitly prove retained SHA -values can detect the changes on request. Their original failed results are not -acceptance evidence. Earlier Python/release fixture runs lacked socket permissions; -complete native reruns passed without assertion changes or delays. - -Windows GNU cross-target compilation is compilation evidence only. Native Windows -and macOS execution require hosted reruns after the maintainer pushes this branch; -prior successful jobs do not attest this source. Repository-designated manual, -helper, external-fixture and real-model ignores remain explicit. No inference, -signing, publication, live library upgrade or reconciliation-plan claim is accepted. - -## Local candidate artifact plan - -Rebuild the existing 0.8.0-rc.1 Linux x86_64 desktop candidate from the committed -source with the locked default-feature release RPC backend, canonical frontend -and Electron production outputs, and the previously acquired pinned ONNX Runtime -1.24.2 native inputs. No new version promise, publication, binding distribution, -signature or inference qualification is selected. The Debian amd64 package and -AppImage use the repository's existing names in a fresh, ignored output directory. -They bundle the backend, native runtime and generated attribution notices; the -frontend and Rust/Python adapters are internal bundle inputs. User-visible changes -and prerelease consumer migration instructions are in -[the candidate release notes](../release-notes-0.8.0-rc.1.md). - -Use the original repository's ignored Cargo target for this release because the -validation filesystem has limited space. Copy the fresh RPC and the previously -verified native inputs into the canonical staging input before invoking stage-rpc. -The required local artifact evidence is staged RPC startup/shutdown, packaged -Debian/AppImage resources and RPC startup, and Debian install/remove inside the -release verifier's isolated namespace. The canonical desktop staging selects -`libonnxruntime.so`; the provider-shared companion remains a verified input, -outside this desktop bundle. This candidate is for local review; foreign-platform -and production inference obligations remain unsatisfied and it will not be -published. - -## Candidate completion evidence - -The release RPC built successfully from source commit `ada3258e44edf9eb3108638917f28291414328ee` -with the normal optimized release profile (LTO, one codegen unit), locked offline -dependencies and four jobs. Canonical staging and loopback HTTP startup/graceful -shutdown passed. Both canonical Linux installers built successfully into -`/media/jeremy/OrangeCream/Linux Software/repos/owned/ai-systems/Pumas-Library/tmp/pumas-release-checksum-20261011`. -Extracted Debian and AppImage resources match the fresh build inputs; each bundled -RPC passed HTTP startup and graceful shutdown. Debian install, alternatives, -Electron 43.7.0 identity and removal passed inside the release verifier's isolated -namespace. The host installation and live library were not changed. - -| Artifact | Size in bytes | SHA256 retained for acquisition verification | -| --- | ---: | --- | -| `pumas-library-electron_0.8.0-rc.1_amd64.deb` | 125073016 | `9d947e7378d8a42281fb796918de354c27cdbc266db9bb005c7550a2884502fc` | -| `Pumas.Library-0.8.0-rc.1.AppImage` | 160644623 | `e9f4799a0b62ed4480e7a70f0deddb22d23a49666032250901da58c04d6c3f79` | - -`local-build-record.json` and `SHA256SUMS` beside the packages retain source, -target, tool versions and local claim results. These one-time build-output -checksums identify this candidate for acquisition; they are not installed-file -automatic execution gates or proof of reproducible build bytes. Verification -logs remain in `/tmp/pumas-checksum-release-rpc.log`, -`/tmp/pumas-checksum-linux-package-build.log`, -`/tmp/pumas-checksum-release-rpc-smoke.log`, -`/tmp/pumas-checksum-linux-package-smoke.log` and -`/tmp/pumas-checksum-deb-install.log`. The Debian verifier retained its private -fixture inside the original repository's ignored `tmp/`. - -The local implementation and Linux candidate claims above are satisfied. Native -Windows/macOS reruns, real-model inference and independent review remain pending; -no production inference, reconciliation-plan completion or publication is claimed. -The branch/worktree remains retained-protected for Jeremy's review and push, with -its source and completion commits reachable from `fix/main-test-validation`. -The original tracked dirty diff remains byte-identical to its preserved baseline. diff --git a/docs/plans/artifact-acquisition/execution-ledger.md b/docs/plans/artifact-acquisition/execution-ledger.md index 4e6ad5d37..91ac5c0ec 100644 --- a/docs/plans/artifact-acquisition/execution-ledger.md +++ b/docs/plans/artifact-acquisition/execution-ledger.md @@ -12,8 +12,8 @@ observations, and perform no source replay or publication. Same-demand cold submission retains failure custody; subsequent submission is rejected. The source sees only one HEAD and one GET. Offline recomputation and secret/hash checks pass; Rust/dependencies/native/ONNX/network settings are unchanged. -See [report](reports/s3-installed-process-loss-2026-10-06.md) and -[evidence](reports/s3-installed-process-loss-evidence-2026-10-06.json). +See report (`reports/s3-installed-process-loss-2026-10-06.md`, removed; see Git history) and +evidence (`reports/s3-installed-process-loss-evidence-2026-10-06.json`, removed; see Git history). Next documented feature is Q2 exact wheel-set/local-only Torch consumption, blocked by AQ-HTTP. Actual-provider Q3, desktop/platform/inference/hosted and deployment gates remain open. Parent owns review/publication/integration. @@ -24,7 +24,7 @@ Parent delegates one bounded AC05/AC17 fixture after frozen ed31639. Separate `feat/s3-installed-process-loss-ed31639` preserves that branch/ref and all production artifact identities. The exact write set, first-byte/SIGKILL/cold custody proof, focused controls and unchanged eleven-scenario scope are recorded -in [admission](reports/s3-installed-process-loss-2026-10-06.md). No production +in admission (`reports/s3-installed-process-loss-2026-10-06.md`, removed; see Git history). No production Rust/dependency/native/ONNX/network setting changes are admitted. Execution is pending; actual-provider, UI/platform/inference and hosted gates remain open. @@ -42,8 +42,8 @@ pass. Full CI Ruff scope passes, complete 415-entry S3 notices are bound through extraction, and failures/diagnostics are retained. No Rust, native, dependency or ONNX source changed; no runtime or real credentials were obtained. This is one Linux backend fixture scope, not provider/platform/inference/full Q4 acceptance. -See [frozen report](reports/s3-installed-default-profile-2026-10-06.md) and -[hashed evidence](reports/s3-installed-default-profile-evidence-2026-10-06.json). +See frozen report (`reports/s3-installed-default-profile-2026-10-06.md`, removed; see Git history) and +hashed evidence (`reports/s3-installed-default-profile-evidence-2026-10-06.json`, removed; see Git history). Parent owns review/publication/integration. Next feasible existing-plan work is installed pre-FilesReady process loss and cold-custody qualification; read-only design exists, execution is future work. @@ -58,7 +58,7 @@ notices; the installed harness refuses guessed source/headless/default notices. Fourteen synthetic controls, full pinned Ruff lint/format and workflow YAML pass. Actual release build and ten unchanged HTTPS scenarios remain pending at this source milestone. Rust/native/ONNX/dependency source is unchanged. Parent owns -PRs and hosted/provider/platform acceptance. See [scope](reports/s3-installed-default-profile-2026-10-06.md). +PRs and hosted/provider/platform acceptance. See scope (`reports/s3-installed-default-profile-2026-10-06.md`, removed; see Git history). ## 2026-10-06 — independently reviewed prefix byte-capacity repair @@ -70,7 +70,7 @@ The three strengthened controls fail on the original source and pass repaired. Full S3 units pass 30, integrations 66, strict core Clippy and production RPC Clippy with inherited dead-code allowance pass. Exact default-plus-S3 RPC passes 324 tests and 12 existing ignores. Identity/retries/authentication/native/ONNX -policies and dependencies are unchanged. See [review repair](reports/s3-prefix-budget-review-repair-2026-10-06.md). +policies and dependencies are unchanged. See review repair (`reports/s3-prefix-budget-review-repair-2026-10-06.md`, removed; see Git history). Separate pinned Python formatting checkpoint 6f260de6 changes only two edited release scripts and preserves their ASTs. Full Ruff lint passes; a pre-existing @@ -116,8 +116,8 @@ intermediate compiler and disk/SIGBUS diagnostics remain retained. Post-prefix production default-plus-S3 RPC Clippy passes with the inherited dead-code allowance; RPC tests and provider/platform gates remain pending. Protected manifest/native/ONNX source remains byte-identical to integrated 7cf. -See [checkpoint qualification](reports/s3-prefix-enumeration-2026-10-06.md) -and [parent review packet](reports/s3-prefix-review-packet-2026-10-06.md). +See checkpoint qualification (`reports/s3-prefix-enumeration-2026-10-06.md`, removed; see Git history) +and parent review packet (`reports/s3-prefix-review-packet-2026-10-06.md`, removed; see Git history). Parent owns draft PR publication, review and integration; no PR was mutated. ## 2026-10-06 — S3 release profile and bounded-prefix successor admitted @@ -134,7 +134,7 @@ The first milestone adds an explicit S3 release attribution profile: 414 notices eight attribution regressions, eleven release contracts, 33 feature graphs, dependency ownership, production default-plus-S3 RPC compile and all 302 RPC tests pass. Intermediate empty-tree and metadata-omission failures are preserved. -See [profile qualification](reports/s3-release-attribution-2026-10-06.md) for exact +See profile qualification (`reports/s3-release-attribution-2026-10-06.md`, removed; see Git history) for exact base, reproduction, limits, logs and the next exact bounded-prefix write set. Before prefix source edits, admission is limited to S3 reader/SDK and new @@ -165,7 +165,7 @@ path-selection and 153 renderer cases, frontend types/lint, feature/ownership checks and six attribution tests. The unchanged canonical attribution generator refreshes and validates 365 default-release entries. Optional-S3 distribution terms remain separately scoped; no new release/platform/gate acceptance follows. -See [exact ancestry, isolated review scopes and evidence](reports/main95-readiness-checkpoint-2026-10-06.md). +See exact ancestry, isolated review scopes and evidence (`reports/main95-readiness-checkpoint-2026-10-06.md`, removed; see Git history). No optional hardening, runtime provisioning or prefix feature is added. Parent owns PR/review/integration; work stops at this bounded checkpoint under the requested weekly usage ceiling. @@ -464,7 +464,7 @@ and the 311-version external optional-S3 platform union. Shared generator and release outputs remain parent-owned. The two SIMD crates' absent packaged MIT texts were retrieved from their declared immutable upstream commit over ordinary verified HTTPS. Exact deltas, evidence, intermediates and remaining scope are in -[production replacement qualification](reports/s3-sdk-reader-replacement-2026-10-06.md). +production replacement qualification (`reports/s3-sdk-reader-replacement-2026-10-06.md`, removed; see Git history). Public constructors/DTOs/receipt formats and frozen manifest/importer/watcher source remain unchanged. The SDK GET operation marker is documented and signed @@ -499,7 +499,7 @@ Known-zero immutable selections now pass through the existing writer/SHA/receipt owner without an impossible range request; empty auxiliaries publish with exact receipts, while empty GGUF weights, unknown/missing objects, wrong digests and truncated mixed bundles fail. Cancellation and cold proof remain authoritative. -See [qualification](reports/s3-empty-members-qualification-2026-10-05.md). +See qualification (`reports/s3-empty-members-qualification-2026-10-05.md`, removed; see Git history). The parent-requested reserved-name admission correction is a separate sibling `fix/s3-bundle-reserved-e8082649`, not silently composed here. Parent owns reviews and integration; provider and installed/native acceptance remain pending. @@ -511,7 +511,7 @@ preflight now reuse the acquired importer's reserved root/normalization rule before job admission or source resolution, preserving final validation and retained-work recovery. Reserved roots/aliases/descendants cause no source, workspace-file or publication effects; a corrected same-owner request succeeds. -See [qualification](reports/s3-bundle-reserved-destinations-qualification-2026-10-05.md). +See qualification (`reports/s3-bundle-reserved-destinations-qualification-2026-10-05.md`, removed; see Git history). Frozen e808 and PR40 composition remain unchanged and changes-requested pending parent review/integration. The separately delegated next slice is zero-length members on sibling `feat/s3-empty-members-e8082649`; provider/Q4 gates stay open. @@ -543,7 +543,7 @@ Clippy with inherited dead-code exception pass. Controlled HTTPS proves exact multi-version pins, aggregate staging progress, optional authentication, cancellation, receipts, no secret persistence/logging, missing/digest/empty member refusal and honest retained outcomes. Browser/default/platform/provider -limits remain; AQ-S3 is not advanced. See [qualification](reports/s3-desktop-bundle-qualification-2026-10-05.md) +limits remain; AQ-S3 is not advanced. See qualification (`reports/s3-desktop-bundle-qualification-2026-10-05.md`, removed; see Git history) for exact trees, logs and boundary proof. Parent owns PR/review/hosted/merge/Library. Next existing-plan implementation candidate: S3 zero-byte selected-member handling through the existing reader/acquisition boundary, separately scoped; @@ -566,7 +566,7 @@ types/lint/builds, scoped Clippy/format/diff/frozen checks pass. Controlled HTTP proves optional token signing, cancellation, static reflected-provider errors, exact receipt identity and credential exclusion from owned files/debug output. DOM evidence does not qualify browser behavior; existing sandbox/default ONNX -403/fully strict dead-code blockers remain. See [qualification](reports/s3-desktop-authentication-qualification-2026-10-05.md) +403/fully strict dead-code blockers remain. See qualification (`reports/s3-desktop-authentication-qualification-2026-10-05.md`, removed; see Git history) for commands, logs, corrections and lifetime limits. No frozen native/core, dependency or security policy changes. Parent owns review/hosted/PR/merge/Library coordination. Next existing-plan implementation candidate: explicit pinned @@ -598,7 +598,7 @@ strict headless/default qualification remains blocked by those existing warnings and ort-sys HTTP 403 respectively. Sandboxed Chromium cannot launch because its installed helper lacks the required configuration; no browser claim/bypass is made. -See [qualification](reports/s3-desktop-workflow-qualification-2026-10-05.md) +See qualification (`reports/s3-desktop-workflow-qualification-2026-10-05.md`, removed; see Git history) for exact commands/logs, initial corrections, scope and limits. Core/native repair/reader/manifest/signing/watcher/importer/reconciliation bytes, main and frozen feature refs are unchanged. Parent owns independent review, hosted @@ -626,7 +626,7 @@ The local fixture observes a Ready indexed model and exact durable acquisition receipts. Negative/control fixtures cover changed source/digest, unsupported input, model collision, forged unissued receipt, pause/resume, cancellation, elapsed retry budget and dropped waiters. Reader and HTTP integration regressions -remain required. See [qualification](reports/s3-dispatch-import-qualification-2026-10-04.md) +remain required. See qualification (`reports/s3-dispatch-import-qualification-2026-10-04.md`, removed; see Git history) for exact commands, final check results, initial disk/fixture/lint failures and limits. Only identified task-generated/superseded build outputs were retired. Final source passed 12 dispatch/import, 11 reader and five HTTP integration @@ -663,7 +663,7 @@ check, as recorded in the qualification report. The repository checker passed 12 target/feature graphs; the SDK is absent from the six checked default/headless core graphs. The unchanged canonical attribution generator and checker passed, with exact optional dependency notices retained separately. -See [qualification](reports/s3-reader-qualification-2026-10-04.md) for commands, +See qualification (`reports/s3-reader-qualification-2026-10-04.md`, removed; see Git history) for commands, dependency comparison, source boundaries, disk-related failed builds and limits. The separate PR37 repair remains protected at @@ -690,7 +690,7 @@ Created this acquisition plan, a proposed shared contract, gate record, source a ## 2026-09-29 — Q1 started from accepted current main - Resolved `a8359512` to `a8359512a580aa25fb2f9c9e4cd7e0dd64fd970d`. It was not an ancestor of current accepted `main` `e37bbf4b964a0e2aadf25f80ab71edd8fa6b3eb3`; the common ancestor is `04e7f1568f00693c0ef26c77e0150e5e4dd112ea`. Preserved the original planning commit through the plan-only integration merge `f4dd7ff9` on `work/acquisition-q1-http`. No accepted source was reset or replaced. -- Current GitHub inventory: no open PRs; PRs #4, #5 and #6 are the latest merged runtime/Torch changes. On the exact base SHA, Build run `36624219733` and Scorecard run `36624219480` both completed successfully. These are base-only CI results. See the [starting-state report](reports/q1-starting-state.md) for links and source evidence. +- Current GitHub inventory: no open PRs; PRs #4, #5 and #6 are the latest merged runtime/Torch changes. On the exact base SHA, Build run `36624219733` and Scorecard run `36624219480` both completed successfully. These are base-only CI results. See the starting-state report (`reports/q1-starting-state.md`, removed; see Git history) for links and source evidence. - Source preparation traced the normal model workflow, durable download owner, native runtime installer, and existing generic download API. The acquisition module, actual shared transfer owner and both production cutovers do not exist yet. The source inventory and independent architecture review are preliminary only; no Q1 gate claim is satisfied. - Existing local-TCP restart/import tests and historical native installation evidence retain their original scope. No real HF service, current llama.cpp archive, desktop workflow, live migration, or Q1 production test has been executed in this slice. - The store reader currently supports schema 5 and explicit schema 4 upgrade; deployed record population and old-writer retirement are unknown. No live retained state was opened or modified. Pending/unresolved cleanup replay remains refused under its existing recovery owner. @@ -705,7 +705,7 @@ Created this acquisition plan, a proposed shared contract, gate record, source a - Independent read-only architecture review found and then rechecked two high-severity bypasses: stale `.part` bytes could have been resumed to falsely match the final, and pinned restore could accept a hashless final. Both are repaired with the exact regression `existing_hashless_file_uses_fresh_source_and_is_not_imported_after_reopen`; the reviewer confirmed source-level closure. The reviewer did not run that test; the integrator did. - **Actual candidate tests/checks:** `cargo test --manifest-path rust/Cargo.toml -p pumas-library model_library::hf:: -- --test-threads=1` passed 244/244 HF unit tests using controlled local HTTP servers and disposable filesystems. The new `xx` final / `xx` stale prefix / `ABCD` selected source case asserts no Range header, preservation on mismatch, and non-import after reopen. The complete `cargo test --manifest-path rust/Cargo.toml -p pumas-library -- --test-threads=1` then passed 1464 unit tests (6 ignored), the crate's integration suites (including the 36-test API suite), and doctests; the importer-recovery fixture now supplies its payload SHA-256 so it reaches the importer-failure behavior with verified input. These local-server tests are synthetic source fixtures, not live Hugging Face service evidence. `cargo clippy --manifest-path rust/Cargo.toml -p pumas-library --all-targets -- -D warnings`, `cargo check --manifest-path rust/Cargo.toml -p pumas-library --no-default-features`, `cargo fmt --manifest-path rust/Cargo.toml --all`, and `git diff --check` passed; final clippy/diff checks are repeated at the commit boundary. - **Still unexecuted / not claimed:** live HF source acquisition, current llama.cpp archive through the shared handoff, desktop HF/native controls, shared-owner cancellation/shutdown/reopen, real deployed-state migration/old-writer isolation, current-candidate hosted CI, and all Q1 system/manual/platform acceptance. Local loopback permission was required for the controlled HTTP tests. The first sandbox-only full run had 23 listener `PermissionDenied` failures; the authorized loopback rerun passed. Base CI remains historical/base-only and GitHub currently returns no combined status or PR-triggered workflow run for accepted `main`. -- **Standards MCP:** final route against `snapshot:v1:c181902d-6cad-40ae-80ef-83f091932539` selected 37 standards with zero unresolved fact categories. Targeted `read_many` calls read 13 applicable policies covering persistence/evolution, async lifecycle, Rust filesystem security, contracts, architecture, code design, API, cross-platform, verification, planning, and proportionality. Findings were checked against source and actual candidate tests; the route itself is not compliance evidence. The MCP authoring `review` operation does not review application source. The independent reviewer reused earlier routed obligations and made no new MCP calls in the narrow repair review. See the separate [MCP usability report](reports/coding-standards-mcp-usability.md). +- **Standards MCP:** final route against `snapshot:v1:c181902d-6cad-40ae-80ef-83f091932539` selected 37 standards with zero unresolved fact categories. Targeted `read_many` calls read 13 applicable policies covering persistence/evolution, async lifecycle, Rust filesystem security, contracts, architecture, code design, API, cross-platform, verification, planning, and proportionality. Findings were checked against source and actual candidate tests; the route itself is not compliance evidence. The MCP authoring `review` operation does not review application source. The independent reviewer reused earlier routed obligations and made no new MCP calls in the narrow repair review. See the separate MCP usability report (`reports/coding-standards-mcp-usability.md`, removed; see Git history). - Plan state remains Q1 in progress; AQ-HTTP, AQ-PACKAGES, AQ-S3 and AQ-COMPLETE remain not ready. Q2/Q3/runtime R1 are not started on an unaccepted prerequisite. The next implementation work continues Q1 with the durable owner and existing llama.cpp consumer; no runtime R1 branch is authorized yet. ## 2026-09-29 — Q1 native source identity and digest slice admitted @@ -737,7 +737,7 @@ Created this acquisition plan, a proposed shared contract, gate record, source a - A read-only composed-design trace found the current HF task owner stores one weak physical-root grant and one in-progress acquisition slot. Reusing this owner for model and native roots would reject the second root. The root-owned preparatory write set is `rust/crates/pumas-core/src/model_library/{download_recovery.rs,hf/lifecycle.rs}` plus this plan record and the co-located lifecycle test. `DestinationRootIdentity` now keys grant bookkeeping by physical-root identity; held `RootExecutionGrant` capabilities remain the effect authority. Independently reopened handles for one root coalesce to one retained grant, while separate roots can be acquired concurrently. Independent review confirmed that the key does not become filesystem authority and found no blocking defect. It noted inactive per-root slots remain for the owner lifetime; configured-root use is currently bounded, and a dynamically multi-root shared owner must prune only inactive slots or bound root admission. This does not move the task owner out of HF or add transfer/persistence ownership. - **Actual candidate evidence:** `cargo test --manifest-path rust/Cargo.toml -p pumas-library model_library::hf::lifecycle::tests:: -- --test-threads=1` passed **37/37** lifecycle tests, including `one_owner_acquires_distinct_physical_root_grants_concurrently` for same-root reopen coalescing and two-root custody. `cargo clippy --manifest-path rust/Cargo.toml -p pumas-library --all-targets -- -D warnings`, `cargo check --manifest-path rust/Cargo.toml -p pumas-library --no-default-features`, `cargo fmt --manifest-path rust/Cargo.toml --package pumas-library -- --check`, and `git diff --check` passed. These are local, disposable-filesystem tests and static checks, not real HF/runtime consumer or restart/reopen acceptance. -- **Coding-Standards MCP:** Fresh snapshot `snapshot:v1:ea1dc4cb-2d14-4a69-866c-ded1b097e278` routed the slice to 37 standards with no unresolved questions. Focused reads covered Persistence, Concurrency, Contract Evolution, Architecture, Rust Async, Rust API, Verification, Commit, Rust Cross-Platform, Rust Dependencies, Security, Untrusted Execution, Resilience, Protocols, Schemas, Replay, and Code Design. The first route included eight policy bodies and produced output large enough to truncate; subsequent focused policy reads supplied the applicable obligations. This workflow feedback is separately recorded in the [MCP usability report](reports/coding-standards-mcp-usability.md). +- **Coding-Standards MCP:** Fresh snapshot `snapshot:v1:ea1dc4cb-2d14-4a69-866c-ded1b097e278` routed the slice to 37 standards with no unresolved questions. Focused reads covered Persistence, Concurrency, Contract Evolution, Architecture, Rust Async, Rust API, Verification, Commit, Rust Cross-Platform, Rust Dependencies, Security, Untrusted Execution, Resilience, Protocols, Schemas, Replay, and Code Design. The first route included eight policy bodies and produced output large enough to truncate; subsequent focused policy reads supplied the applicable obligations. This workflow feedback is separately recorded in the MCP usability report (`reports/coding-standards-mcp-usability.md`, removed; see Git history). - This sub-slice is authored atop Q1 source `98c19910faeebbb75056ddd604b99554305b14a8`. `gh pr checks 7` could not reach GitHub (`error connecting to api.github.com`); a direct PR-page fetch also returned a cache miss. The last prior observation for the pushed `98c19910…` head was Build run `36652117684` in progress, so no pass is claimed for this candidate. The user-owned `docs/breif/future.md` remains untouched and untracked. - The isolated native proposal remains unintegrated. Its GPT-6.1 Sol High reviewer confirmed the four initial custody findings were addressed, then found a P2: canceled metadata transaction/removal waiters left blocking workers outside the shutdown receipt. The contributor reports that diff `642c96dde04fb49a133c56081c814abacc06b08c5959b87239fe755de700157a` registers these tasks with `VersionState`, drains them through manager shutdown, and exposes an explicit direct-owner drain. Independent follow-up review confirmed the P2 closed for `VersionManager` and direct `VersionState` owners and found no new P0/P1/P2 in that scope. It also identified the public `OllamaVersionManager` wrapper as an adjacent drain owner; a read-only tree search found no in-repository production caller, but its public API owns the same state. The exact worker write set is therefore expanded to include `version_manager/ollama.rs` only for its owned mutation drain and a focused regression. The reviewer explicitly did not extend the guarantee to that wrapper yet. The worker's exact-candidate tests report 254 app-manager, 265 RPC, 17 integration and 2 intent-integration cases passing, plus targeted canceled-waiter and static checks. Its native downloader remains independent, and AQ-HTTP is not ready. - Q1/AQ-HTTP remains in progress/not ready. The shared durable owner/store, actual HF import and native consumer cutover, source resolver consumption, lifecycle reopen across handoff, desktop path, real source and all AC01–AC10/AC15/AC16/AC18 claims remain pending. @@ -765,7 +765,7 @@ Created this acquisition plan, a proposed shared contract, gate record, source a - Independent read-only review of `584b5f45…` found no substantiated P0/P1/P2/P3 finding in the five-file scope. It verified scoped isolation, custody drainage and outcome retention, and preservation of HF policy. A generic scope still requires an explicit shutdown owner; HF currently has that owner. AQ-HTTP remains not ready. - Hosted Actions run `36658935346` is for exact head `c3052583860baa76dc114edf6420805e9b06f327`; it was observed in progress, with Workflow/release contracts successful and frontend/desktop contracts, headless-without-inference, Rust quality and three Torch target jobs still in progress. Release/archive/RPC-E2E conditional jobs were skipped. No current-head full CI pass is claimed. - The next Q1 implementation boundary is the canonical durable source-neutral acquisition owner/store and verified-file handoff, with the ordinary HF workflow and existing exact-tag llama.cpp installer as real consumers. Source inspection also confirmed `DownloadPersistence` schema 5 performs its v4-to-v5 publication during load and that `LibraryMutationAuthority` reads hidden admissions/quarantines to protect model deletion. The new owner/store and that mutation reader must change together; any migration must preserve those populations and must not claim exact consumer settlement from tag/path existence. Supported retained population and old-writer behavior remain to be established before any live-root mutation. -- **Coding-Standards MCP for this boundary:** snapshot `snapshot:v1:366ec2b5-a33e-48de-a36f-c2bde42d1d19`; the complete route selected 31 standards with zero unresolved categories. Focused reads covered Persistence, Architecture Replay, Concurrency, Contract Evolution, Schemas, Untrusted Execution, Independent Test Oracles and Platform Verification. The first route attempt requested `content.limit: 0` and the MCP rejected it (`minimum = 1`); omitting `content` returned a complete selection. An eight-policy read exceeded the visible output window, so the policies were re-read in two smaller batches. MCP routing/reads supplied obligations only; source, GitHub and tests supplied implementation evidence. Actual usability feedback is in [the separate report](reports/coding-standards-mcp-usability.md). +- **Coding-Standards MCP for this boundary:** snapshot `snapshot:v1:366ec2b5-a33e-48de-a36f-c2bde42d1d19`; the complete route selected 31 standards with zero unresolved categories. Focused reads covered Persistence, Architecture Replay, Concurrency, Contract Evolution, Schemas, Untrusted Execution, Independent Test Oracles and Platform Verification. The first route attempt requested `content.limit: 0` and the MCP rejected it (`minimum = 1`); omitting `content` returned a complete selection. An eight-policy read exceeded the visible output window, so the policies were re-read in two smaller batches. MCP routing/reads supplied obligations only; source, GitHub and tests supplied implementation evidence. Actual usability feedback is in the separate report (`reports/coding-standards-mcp-usability.md`, removed; see Git history). - A read-only architecture investigation of `c3052583` confirmed the supervisor extraction remains necessary preparation and does not create a shared durable owner. Its source trace identified the v4 migration-on-load, hidden custody and deletion-authority coupling, GitHub exact-tag/asset bridge, separate HF/native shutdown composition, and public constructors that need explicit lifecycle dispositions. The full write-set recommendation is retained in its handoff and will be narrowed to the exact production changes and tests before the next edits. - User-owned untracked `docs/breif/future.md` remains untouched. No live retained store, installed environment, model, or release was opened or changed. @@ -786,7 +786,7 @@ Created this acquisition plan, a proposed shared contract, gate record, source a - Source audit found that all production `downloads.json` writes converge on `AcquisitionStore`, while model writes decode the strict schema-5 projection and replace the flattened legacy partition. The receipt therefore needs a distinct versioned envelope partition. Normal HF completion removes its marker before importer effects, then publishes guarded metadata, index projection and applicable package facts, issues the exact `Using` receipt, and atomically adopts the acquisition while releasing the exact queue admission. The receipt remains paired with the adopted acquisition as immutable completion history. Existing schema-6 metadata publication requires `Durable` when it writes, but equality may skip a new publication. The package-facts source fingerprint is a cache freshness key (metadata/descriptor/dependency JSON and file length/mtime), not payload identity; `ModelMetadata` also contains a `HashMap`. Neither fact permits treating that fingerprint or metadata/index presence as a completion receipt. - A read-only feasibility review at the exact source commit found schema-4/5 read-only and explicit-offline migration, current schema-6 reads/writes, and no exact importer completion record. The proposed implementation advances the envelope to schema 7, stores a strictly validated, opaque versioned model receipt outside the schema-5 projection, and explicitly converts pre-receipt schema 6 plus supported schemas 4/5 without fabricating receipts. Receipt v1 binds the exact acquisition/use IDs, demand, queue admission, manifest, ordered file receipts, destination and model identity. Its separately versioned canonical output proof covers declared metadata/index projections and required pinned package-facts content/version: recursively sorted object keys, preserved array order/nulls, and rejected unsupported values. Receipt publication is conditional on the persisted exact Using lease and current confirmed admission under the held root grant. Cold recovery validates the historic lease, queue, file receipts, receipt and outputs under fresh root custody without renewing/replacing the Using lease and without importer, metadata repair, index mutation or package-facts hydration. Exact settlement atomically transitions acquisition to Adopted and releases the queue admission in one canonical document publication while retaining the receipt with the adopted acquisition; no acknowledgement-before-release intermediate state is supported. Conflicting/orphaned/malformed/unknown-version receipts fail closed, and only disposable fixtures may qualify schema migration because deployed schema-6 population and old-writer exclusion remain unknown. - Unknown actual deployed schema-6 population, overlapping old processes, rollback requirements, separately retained model/index state, and index-only writers remain unverified. No live retained root is authorized or modified. The schema-7 transition and reopen tests will use disposable fixtures; no deployed migration-compatibility claim is made. -- The feasibility reviewer performed no edits, Git mutation or tests. Its Coding-Standards routing used snapshot `snapshot:v1:968b380d-c352-496b-9a5f-f522222e09ab`, with an initial and final route both selecting 21 standards and zero unresolved questions, plus focused reads for Persistence, Replay, Contract Evolution and Schemas. Its separate actual MCP usability feedback is recorded in [the MCP report](reports/coding-standards-mcp-usability.md). +- The feasibility reviewer performed no edits, Git mutation or tests. Its Coding-Standards routing used snapshot `snapshot:v1:968b380d-c352-496b-9a5f-f522222e09ab`, with an initial and final route both selecting 21 standards and zero unresolved questions, plus focused reads for Persistence, Replay, Contract Evolution and Schemas. Its separate actual MCP usability feedback is recorded in the MCP report (`reports/coding-standards-mcp-usability.md`, removed; see Git history). - Independent design review `q1_custody_final_review` found no source defect, but identified implementation-blocking conditions: conditional receipt publication over the complete Using/admission identity; no unrecoverable receipt→acknowledgement→queue-release window; private cold-settlement authority that does not renew the persisted lease; precise independent receipt/output/package-facts versions and canonical projections; offline migration that operationally stops cached old writers and preserves every partition without manufacturing receipts; and fail-closed duplicate/orphan/malformed/unknown receipt rules. The exact contract/write-set now records all conditions. Reviewer ran no source tests and performed no edits; its actual MCP experience remains in the separate MCP usability report. - The integrator additionally read Platform Verification, Implementation and Documentation on the root receipt-slice snapshot after the initial compact batches; this did not change the source boundary. Exact implementation, restart, output-mismatch, cancellation and fault-injection evidence remains pending. AQ-I12 is recorded; AQ-HTTP remains not ready. @@ -815,7 +815,7 @@ Created this acquisition plan, a proposed shared contract, gate record, source a - The guard obtains existing root exclusion and rechecks one coherent canonical custody snapshot before import shortcuts/effects. Ordinary and orphan imports have no custody exemption. Private partial-HF and full-HF capabilities bind their respective `Transferring` stage or current verified-use lease, matching queue admission, selected files/workspace/destination, and held root grant. Existing `RuntimeTasks` and acquisition task custody retain and drain effects through caller cancellation and worker failure. Reopened unresolved `Using` remains non-executable. - Writer evidence on exact tree `0c3e472c8b5f05073ede4ddbe2252a2a34e54baf`: importer/recovery default 32 passed; importer/recovery no-default 32 passed; managed HF 170 passed; acquisition 63 passed; download-store 62 passed with 2 existing ignored helpers; mutation-authority 2 passed; focused HF import cancellation 1 passed; no-default check, default/no-default all-target Clippy with `-D warnings`, formatting, diff checks and commit hooks passed. The tests use real temporary filesystems, canonical stores, SQLite and actual owner contexts. Local HTTP fixtures exercise real localhost transport; stale-token/store corruption, seeded phases, panics and scheduling are synthetic fault probes on those real components. This is not live HF/native acceptance. - Independent review checked exact head `8b6c5f70c55a3d124189d0cd88dc85c780f47c84`, exact parent `d0b71b51075815cf307cea95c9364be0ed25472d`, and nine-file diff identity `5991327bf4df196cd379f70d65ed30298a51f2e3`. It found no substantiated P0–P3 issue and ran `git diff --check`; it ran no tests/build/Clippy/formatting. Reviewer findings and worker-reported test results are distinct evidence. -- Coding-Standards routing for the implementation used snapshot `snapshot:v1:9881b6be-4a0e-4d72-b0cd-4e4307cdc710`, 24 selected standards and zero unresolved facts, with focused Concurrency, Rust Async, Persistence, Rust API, Untrusted Execution, Verification, Security, and independent-oracle obligations. The material partial-stage/aggregate-effect design changes were rerouted by the worker; root will retain a final same-tree route. Full per-agent MCP usability feedback is separate in [the usability report](reports/coding-standards-mcp-usability.md). +- Coding-Standards routing for the implementation used snapshot `snapshot:v1:9881b6be-4a0e-4d72-b0cd-4e4307cdc710`, 24 selected standards and zero unresolved facts, with focused Concurrency, Rust Async, Persistence, Rust API, Untrusted Execution, Verification, Security, and independent-oracle obligations. The material partial-stage/aggregate-effect design changes were rerouted by the worker; root will retain a final same-tree route. Full per-agent MCP usability feedback is separate in the usability report (`reports/coding-standards-mcp-usability.md`, removed; see Git history). - The exact source commit/merge has not been pushed yet, so no hosted check is claimed for this candidate. PR #7 remains the Q1 draft to `main`; update/push and inspect fresh CI before treating any check as current. AQ-HTTP remains not ready. - Next Q1 slice: exact model-owned HF finalization receipt/output proof and no-replay `Using` reopen. Then native shared-acquisition consumer cutover, public app-manager handoff, remaining withdrawal regression, and objective-level acceptance. Q2 and runtime R1 remain gated on AQ-HTTP. @@ -825,7 +825,7 @@ Created this acquisition plan, a proposed shared contract, gate record, source a - Native recovery now removes its owned input workspace after exact settlement. Startup also handles the already-`Adopted` cleanup window idempotently: under the native versions lock it validates the bound receipt, installed tree and metadata before retrying removal. The live native installer claims its publication/cancellation barrier before receipt issuance, so an accepted cancellation cannot leave a receipt that startup later treats as install intent. A local loopback restart test leaves an adopted workspace behind and verifies startup removes it. - **Current local test evidence:** acquisition store tests passed 8/8; HF receipt tests passed 24/24; `artifact_acquisition` integration tests passed 2/2; the loopback-only GitHub fixture-seam test passed 1/1; the workspace identity-only lookup test passed 1/1; native installer/manager tests passed 24/24 with 235 filtered. The native test run includes install, restart cleanup of a stale adopted workspace, explicit removal, and same-tag reinstall with distinct acquisition identities. `cargo clippy --manifest-path rust/Cargo.toml -p pumas-library -p pumas-app-manager -p pumas-rpc --all-targets -- -D warnings`, `cargo check --manifest-path rust/Cargo.toml -p pumas-library --no-default-features`, `cargo fmt --manifest-path rust/Cargo.toml --all -- --check`, and `git diff --check` all pass on the current local source tree. - Independent composed review of the previous candidate found the adopted-workspace retry gap (P2), plus a cancellation/receipt race subsequently closed by moving the arbitration claim before receipt issuance. The adopted cleanup retry checks exact record/receipt/lease, active attempt, persisted workspace root+relative identity, installed output and metadata while holding the native lock. Final read-only follow-up found no substantiated P0–P3 findings; reviewers ran no checks. The new restart regression proves the local seeded stale-workspace case, not arbitrary crash timing. Coding-Standards final routing used snapshot `snapshot:v1:425e276a-fc0b-4282-9889-a76742027c42`, 40 selected standards and zero unresolved fact categories; routing/policy reads inform obligations but do not establish code acceptance. -- The Passeur issue was reproduced without submitting work: agent/task limits are undocumented in tool declarations, a valid agent query returns `PATH_NOT_FOUND` from `profile.open`, a valid task query returns `SERVICE_PROFILE_CONFLICT`, and status confirms repository service unavailable. The steps and targeted tool improvements are recorded in [the Passeur usability report](reports/passeur-mcp-usability.md); this session did not notify maintainers. +- The Passeur issue was reproduced without submitting work: agent/task limits are undocumented in tool declarations, a valid agent query returns `PATH_NOT_FOUND` from `profile.open`, a valid task query returns `SERVICE_PROFILE_CONFLICT`, and status confirms repository service unavailable. The steps and targeted tool improvements are recorded in the Passeur usability report (`reports/passeur-mcp-usability.md`, removed; see Git history); this session did not notify maintainers. - These are local disposable-state and controlled loopback checks. They do not establish live HF/native publisher behavior, desktop workflow, current-head hosted CI, deployed schema-6 population/old-writer isolation, public compatibility dispositions, or Windows/macOS/Linux durability. No live retained root was mutated. AQ-HTTP remains not ready; Q2 and runtime R1 remain gated. - `docs/breif/future.md` remains user-owned and untouched. No commit, push, merge, deploy or Passeur task submission was made. @@ -857,15 +857,15 @@ Created this acquisition plan, a proposed shared contract, gate record, source a - The existing public `VersionInstaller::with_acquisition` entry point uses the caller's existing acquisition service/store and reconciles retained native work before return. The ordinary llama.cpp install now registers workspace/log preparation and successful cleanup through that consumer. The old unconfigured direct constructor rejects before release lookup, progress initialization, or filesystem mutation. `VersionManager::new_with_acquisition` is the corresponding manager path; external caller population and cutover remain unverified under AC16. - The initial final Sol High review found shutdown lock re-entry, direct recovery effects outside custody, and HF saturation error erasure. Each was fixed and covered by a deterministic regression or focused adapter test. A later integrator trace found ordinary native workspace setup/cleanup still outside shared custody; that path and pre-mutation refusal were fixed. The latest read-only Sol High review of the complete updated source found no new confirmed correctness issue and verified the ordinary install, constructor, recovery, shutdown and HF error paths. Reviewers ran no tests; all outcomes below are integrator-run. - Exact composed verification on the current uncommitted candidate: `cargo test --manifest-path rust/Cargo.toml --locked --all-targets -p pumas-library -p pumas-app-manager -p pumas-rpc -- --test-threads=1` exited 0. Core unit tests: 1,515 passed, 6 ignored; API integration: 36 passed; `artifact_acquisition`: 2 passed; RPC unit tests: 265 passed; RPC integration: 17 passed, 10 ignored; intent integration: 2 passed, 2 ignored; other targets passed. The app-manager unit target, including direct setup refusal and native install/recovery cases, also completed successfully. `cargo clippy --manifest-path rust/Cargo.toml --locked -p pumas-library -p pumas-app-manager -p pumas-rpc --all-targets --all-features -- -D warnings`, `cargo check --manifest-path rust/Cargo.toml --locked -p pumas-library --no-default-features`, `cargo fmt --manifest-path rust/Cargo.toml --all -- --check`, and `git diff --check` passed. -- Passeur was rechecked after the frontend update. `passeur_status` reports connected/open service, held/ready coordination, and build `6a43daa6eec45ddceadea0ba2e2a623d7fc8e81e330237c7762a7f1c63c33f63`; provider/execution/approval remain `not_checked`. `passeur_agents({limit:4})` still fails with `PATH_NOT_FOUND` at `profile.open`, so no contributor ID exists and no task was submitted. Sol 6.1 remains the authorized implementation path until contributor execution is available. See the [Passeur usability report](reports/passeur-mcp-usability.md). -- The Coding-Standards route for this resumed slice used snapshot `snapshot:v1:28c08446-d4d8-4bab-bf4c-5122700bbd60`: 25 selected standards, zero unresolved routing facts, and 24 canonical policy reads. Routing/policy reads provided obligations only; they do not certify implementation or acceptance. See the [MCP usability report](reports/coding-standards-mcp-usability.md). +- Passeur was rechecked after the frontend update. `passeur_status` reports connected/open service, held/ready coordination, and build `6a43daa6eec45ddceadea0ba2e2a623d7fc8e81e330237c7762a7f1c63c33f63`; provider/execution/approval remain `not_checked`. `passeur_agents({limit:4})` still fails with `PATH_NOT_FOUND` at `profile.open`, so no contributor ID exists and no task was submitted. Sol 6.1 remains the authorized implementation path until contributor execution is available. See the Passeur usability report (`reports/passeur-mcp-usability.md`, removed; see Git history). +- The Coding-Standards route for this resumed slice used snapshot `snapshot:v1:28c08446-d4d8-4bab-bf4c-5122700bbd60`: 25 selected standards, zero unresolved routing facts, and 24 canonical policy reads. Routing/policy reads provided obligations only; they do not certify implementation or acceptance. See the MCP usability report (`reports/coding-standards-mcp-usability.md`, removed; see Git history). - Build #349 (`36794721238`) is green on prior head `1c228c3436e100b898d6fc2f05e471e88bee4162`, before this local source diff. It is not CI evidence for this candidate. The local branch has not yet been committed or pushed for current-head hosted checks; PR #7 remains open and draft. All AC01–AC18 and AQ-HTTP remain pending/not ready; AC10 resource qualification, AC16 external compatibility/cutover, live HF/native sources, desktop behavior, deployed-store/old-writer qualification, and supported-platform durability remain unproved. User-owned `docs/breif/future.md` remains untouched; no merge was attempted. ## 2026-09-30 — downstream UniFFI compile gap and Passeur availability recheck - Commit `07cf74dfb960bca005918f6923073cc4a5c82814` was pushed fast-forward to PR #7. Build #350 (`36802790129`) is running on that head. `Workflow and release contracts`, `Headless without inference plugins`, `Frontend and desktop contracts`, and Linux/macOS native QA completed successfully; Rust quality failed, while Windows native QA was still running at this observation. The failure is an exhaustive match in `pumas-uniffi/src/bindings.rs` that omitted the new `PumasError::AcquisitionCapacityExhausted` variant. - A local follow-up maps that variant to the existing `FfiError::Download` with `PumasError::to_string()`, preserving the capacity resource without changing the UniFFI enum or binding schema. A co-located test covers workers, blocking, rescue-workers, rescue-blocking, and scope labels. `cargo test -p pumas-uniffi acquisition_capacity_uses_existing_download_error_and_preserves_resource --lib` passed 1/1. All-target Clippy with `-D warnings` across library, app-manager, RPC, and UniFFI passed; formatting and `git diff --check` passed. A fresh read-only Sol High review found no compatibility issue or new confirmed finding. These changes were already authored through the Sol fallback before the user's next instruction to use Passeur; no Passeur task ran. -- After the user reported Passeur availability, `passeur_status` and `passeur_prepare` showed a connected service/open admission and ready/held metadata coordination; identity worked and the task list returned zero. But `passeur_agents({limit:4,offset:0})` again failed with `PATH_NOT_FOUND` at `profile.open`; the exact expected project profile file was absent, and `passeur_coordination` status returned `not_enabled`. Execution profile/provider/approval remain `not_checked`; no agent ID was returned and no task was submitted. The user was told that no Passeur subagent is currently working. The profile/readiness inconsistency is recorded in the [usability report](reports/passeur-mcp-usability.md). +- After the user reported Passeur availability, `passeur_status` and `passeur_prepare` showed a connected service/open admission and ready/held metadata coordination; identity worked and the task list returned zero. But `passeur_agents({limit:4,offset:0})` again failed with `PATH_NOT_FOUND` at `profile.open`; the exact expected project profile file was absent, and `passeur_coordination` status returned `not_enabled`. Execution profile/provider/approval remain `not_checked`; no agent ID was returned and no task was submitted. The user was told that no Passeur subagent is currently working. The profile/readiness inconsistency is recorded in the usability report (`reports/passeur-mcp-usability.md`, removed; see Git history). - The current local UniFFI/write-set/Passeur-report follow-up has not yet been committed or pushed; the user-owned `docs/breif/future.md` remains untracked and untouched. PR #7 remains draft, no merge was attempted. The next Passeur code task must wait for a discoverable configured contributor; the currently required local integration fix can be verified and committed without claiming Passeur authored it. AC01–AC18 and AQ-HTTP remain pending/not ready. ## 2026-09-30 — Build #351 terminal evidence and acceptance update @@ -874,7 +874,7 @@ Created this acquisition plan, a proposed shared contract, gate record, source a - AC15 is accepted for this code candidate and the [acceptance matrix](reports/acceptance-matrix.md) now records that result. AC01–AC14 and AC16–AC18 remain pending; in particular, actual Hugging Face and approved llama.cpp sources, complete process-kill/reopen and cancellation matrices, desktop user workflows, deployed retained-store/old-writer inventory, external public-client dispositions, AC10 representative resource measurements, and AC17 packaged/platform qualification remain unproved. AQ-HTTP stays in progress/not ready; AQ-PACKAGES, AQ-S3, AQ-COMPLETE and runtime R1 remain gated. - Bounded GPT-6 Luna High read-only discovery confirmed that the current HF and llama.cpp production compositions are exercised with seeded metadata and synthetic loopback artifacts. It identified the missing real-source interactions, full desktop operation, broader process-kill/reopen coverage and remaining AC06 pause/stale-generation/release/demand cases. No tests, network operations or edits were performed by the discoverer. - PR #7 remains open, draft, based on `main` at `e37bbf4b964a0e2aadf25f80ab71edd8fa6b3eb3`, with code head `eadfb6bb3abc82e3efe5c63c881696f26ab7619c`; no merge was attempted. The PR description still needs this terminal Build #351 result and AC15 status after the documentation commit. -- Passeur was rechecked against the current frontend build `6a43daa6eec45ddceadea0ba2e2a623d7fc8e81e330237c7762a7f1c63c33f63` and service generation `e1e32585-e963-495d-b46b-05102aff09f1`. Status/prepare connect and report ready/held metadata, but coordination status says `not_enabled`, task listing is empty, execution/provider/approval are `not_checked`, and valid `passeur_agents({limit:4,offset:0})` still fails at `profile.open` with `PATH_NOT_FOUND`. The expected project profile is absent; no agent ID was returned and no Passeur task was submitted. One invalid `limit:8` probe was a caller argument error; retrying at the documented limit still produced the profile failure. See the [Passeur usability report](reports/passeur-mcp-usability.md). +- Passeur was rechecked against the current frontend build `6a43daa6eec45ddceadea0ba2e2a623d7fc8e81e330237c7762a7f1c63c33f63` and service generation `e1e32585-e963-495d-b46b-05102aff09f1`. Status/prepare connect and report ready/held metadata, but coordination status says `not_enabled`, task listing is empty, execution/provider/approval are `not_checked`, and valid `passeur_agents({limit:4,offset:0})` still fails at `profile.open` with `PATH_NOT_FOUND`. The expected project profile is absent; no agent ID was returned and no Passeur task was submitted. One invalid `limit:8` probe was a caller argument error; retrying at the documented limit still produced the profile failure. See the Passeur usability report (`reports/passeur-mcp-usability.md`, removed; see Git history). - The current branch remains `work/acquisition-q1-http`; `a8359512a580aa25fb2f9c9e4cd7e0dd64fd970d` is an ancestor of this branch and is not in `main`. `docs/breif/future.md` remains untracked and untouched; `pumas-coordinated-plans.zip` is absent at the repository root. Existing detached/Passeur/task worktrees were left untouched. ## 2026-10-01 — AC06 service-level cleanup-custody regression @@ -884,8 +884,8 @@ Created this acquisition plan, a proposed shared contract, gate record, source a - The full command `cargo test --manifest-path rust/Cargo.toml --locked -p pumas-library --lib -- --test-threads=1` passed: 1,517 passed, 0 failed, 6 ignored. `cargo clippy --manifest-path rust/Cargo.toml --locked -p pumas-library --all-targets -- -D warnings`, `rustfmt --edition 2021 --check rust/crates/pumas-core/src/acquisition/service.rs`, and `git diff --check` also passed. - Independent GPT-6.1 Sol High read-only review found no substantiated issue in the exact service-test diff. Its scope limits remain: worker alive while withdrawal is tested, no waiter cancellation/shutdown/stale-generation cases, and the cleanup error occurs before fixture mutation. These limits align with the still-pending AC06 clauses above. - AC06 remains pending for queued/active/verifying cancellation, pause/resume no-write behavior, stale-generation rejection at the service boundary, idempotent release, and live/durable-demand preservation. No acceptance status changed. -- Passeur recheck: status/prepare show a connected service and ready/held metadata, but valid agent discovery still returns `PATH_NOT_FOUND` at `profile.open`, and the task list is empty. A first preflight was rejected because `target_ref` lacked the required `refs/heads/` prefix; after correcting that input, Passeur returned `COORDINATION_NOT_ENABLED` (“Coordination has not been explicitly initialized”). No task was submitted. The tool contract says coordination initialization is operator-CLI-only, so implementation used the already authorized GPT-6.1 Sol fallback; see [Passeur usability feedback](reports/passeur-mcp-usability.md). -- Coding-Standards routing for this slice used snapshot `snapshot:v1:e6fcc079-e95a-4f2e-a39e-47a7e667a20f`, selected 20 standards with zero unresolved facts after explicitly setting frameworks empty and the concurrent-plan-integration profile. Reading 18 compact policies in one batch exceeded the caller-visible output window; the focused Rust, persistence, concurrency, verification, implementation and commit obligations were inspected separately. See [Coding-Standards MCP usability feedback](reports/coding-standards-mcp-usability.md). +- Passeur recheck: status/prepare show a connected service and ready/held metadata, but valid agent discovery still returns `PATH_NOT_FOUND` at `profile.open`, and the task list is empty. A first preflight was rejected because `target_ref` lacked the required `refs/heads/` prefix; after correcting that input, Passeur returned `COORDINATION_NOT_ENABLED` (“Coordination has not been explicitly initialized”). No task was submitted. The tool contract says coordination initialization is operator-CLI-only, so implementation used the already authorized GPT-6.1 Sol fallback; see Passeur usability feedback (`reports/passeur-mcp-usability.md`, removed; see Git history). +- Coding-Standards routing for this slice used snapshot `snapshot:v1:e6fcc079-e95a-4f2e-a39e-47a7e667a20f`, selected 20 standards with zero unresolved facts after explicitly setting frameworks empty and the concurrent-plan-integration profile. Reading 18 compact policies in one batch exceeded the caller-visible output window; the focused Rust, persistence, concurrency, verification, implementation and commit obligations were inspected separately. See Coding-Standards MCP usability feedback (`reports/coding-standards-mcp-usability.md`, removed; see Git history). - At this observation the local branch is still based at `da98aba9c48a407daa297a48f70f08058cd58e6c` with the source/doc slice uncommitted; PR #7 is open/draft at that head and Build #352 completed successfully on the prior docs-only head. No merge was attempted. The user-owned untracked `docs/breif/future.md` remains untouched and all existing detached/Passeur/task worktrees remain unchanged. ## 2026-10-01 — AC06 pause and active-cancel transfer tests @@ -923,7 +923,7 @@ Created this acquisition plan, a proposed shared contract, gate record, source a - One near-settlement `get_model_download_status` poll returned JSON-RPC `-32603` (`internal`). A subsequent `list_model_downloads` showed `completed`; the model projection, verified output and durable receipt all showed successful settlement. Track this as an AC08 progress/error-contract follow-up; it does not invalidate the separately observed importer settlement in AC03. An initial RPC request to `/` returned 404 before the correct `/rpc` path was used; that was a caller path error, not product evidence. - Build #357 (run `36819161301`) now succeeds on the exact code candidate after retrying its failed Windows native QA job. The retry of the unchanged `suspended_admission_assigns_descendants_to_job_and_drains_them` fixture passed; workflow/release contracts, Rust quality, headless-without-inference, frontend/desktop contracts, and Linux/macOS/Windows native QA all passed. Conditional release/package/archive, RPC-E2E, desktop-package, Linux startup and assembly jobs remained skipped. This records AC15 on the current code head and does not qualify skipped release artifacts or other acceptance claims. - The acceptance matrix records AC03 and AC15 as accepted only for the scopes above. AC01–AC02, AC04–AC14, and AC16–AC18 remain pending; AQ-HTTP is not ready. Desktop control tests, cancellation/pause workflows, broad crash-window coverage, resource measurements, public-client dispositions, deployed schema-6/old-writer inventory, and packaged/platform evidence remain open. Q2 and runtime R1 remain gated. -- Passeur was rechecked after the user requested GPT-6.1 Sol. `passeur_status` showed the service connected, repository binding valid, and coordination ready/held; `passeur_tasks({schema_version:1,limit:16,offset:0})` returned zero tasks. A valid `passeur_agents({limit:4,offset:0})` still failed with `PATH_NOT_FOUND` at `profile.open`. No Muse Spark agent ID or running subagent was available, and no Passeur task was submitted. This evidence work continued directly with Sol 6.1; the refreshed observation is in [Passeur MCP usability](reports/passeur-mcp-usability.md). +- Passeur was rechecked after the user requested GPT-6.1 Sol. `passeur_status` showed the service connected, repository binding valid, and coordination ready/held; `passeur_tasks({schema_version:1,limit:16,offset:0})` returned zero tasks. A valid `passeur_agents({limit:4,offset:0})` still failed with `PATH_NOT_FOUND` at `profile.open`. No Muse Spark agent ID or running subagent was available, and no Passeur task was submitted. This evidence work continued directly with Sol 6.1; the refreshed observation is in Passeur MCP usability (`reports/passeur-mcp-usability.md`, removed; see Git history). - PR #7 remains open/draft and unmerged; Build #357 is green for the current existing PR head. The ledger/matrix/gate update still needs to be committed/pushed on `work/acquisition-q1-http` and reflected in the PR body. No `main` merge is authorized. `docs/breif/future.md`, other worktrees, and user state remain untouched; real-source files and receipts are confined to the disposable `/tmp` root. ## 2026-10-01 — exact PR-head Build #358 @@ -959,7 +959,7 @@ All seven primary write sets are disjoint. Do not broaden a stream or change sha ## 2026-10-01 — Q1 workstream results and serial integration -- Execution used seven independent Codex CLI orchestrators in the admitted worktrees. The user selected GPT-6 Luna XHigh for orchestration; GPT-6.1 Sol High handled architecture/review, and GPT-6.1 Sol Medium handled implementation where needed. Passeur's model catalog listed `muse-spark-1.3-contributor`, but valid agent-profile lookups repeatedly failed with `PATH_NOT_FOUND` at `profile.open`; no Passeur implementation task was admitted. Each workstream completed pre-edit and final Coding-Standards routes with zero unresolved applicability facts. Per-workstream details and exact commands are in the corresponding final CLI summaries; Passeur findings are in [the usability report](reports/passeur-mcp-usability.md). +- Execution used seven independent Codex CLI orchestrators in the admitted worktrees. The user selected GPT-6 Luna XHigh for orchestration; GPT-6.1 Sol High handled architecture/review, and GPT-6.1 Sol Medium handled implementation where needed. Passeur's model catalog listed `muse-spark-1.3-contributor`, but valid agent-profile lookups repeatedly failed with `PATH_NOT_FOUND` at `profile.open`; no Passeur implementation task was admitted. Each workstream completed pre-edit and final Coding-Standards routes with zero unresolved applicability facts. Per-workstream details and exact commands are in the corresponding final CLI summaries; Passeur findings are in the usability report (`reports/passeur-mcp-usability.md`, removed; see Git history). | Workstream | Integrated commit on `work/acquisition-q1-http` | Focused result | | --- | --- | --- | @@ -1133,7 +1133,7 @@ All seven primary write sets are disjoint. Do not broaden a stream or change sha - The new `concurrent_stale_worker_handoff_cannot_mutate_durable_acquisition` test uses oneshot gates to keep the first worker live while a successor handles the same demand and workspace. It captures the successor's `Using` record and final/partial bytes, then releases the stale worker. The stale attempt returns the typed `acquisition.custody` validation error `Acquisition readiness is stale`; the durable record remains equal to the winner, no consumer receipt exists, and file bytes and workspace entry count remain unchanged. The test drains consumer/service work before assertions. - Root inspected the bounded Passeur diff and applied this one-file change to `work/acquisition-q1-http`. Serial verification with the shared `rust/target` passed: `cargo test --offline --manifest-path rust/Cargo.toml -p pumas-library --lib acquisition::service::tests::concurrent_stale_worker_handoff_cannot_mutate_durable_acquisition -- --test-threads=1` — 1 passed, 0 failed, 1,563 filtered out. `rustfmt --edition 2021 --check rust/crates/pumas-core/src/acquisition/service.rs` first identified one formatting adjustment; `rustfmt --edition 2021` applied it. `git diff --check` passed. No Clippy or no-default-feature run was performed. This was the only Rust build, and no `cargo`/`rustc` process was running concurrently. - Final Coding-Standards routing used snapshot `snapshot:v1:2eab787a-b1be-424e-8195-405814f86ede`, selected 24 standards with zero unresolved applicability questions, and read 17 selected policies. The MCP supplied implementation, documentation, concurrency, persistence and verification obligations; the diff and passing test are separate evidence. It did not accept AC06 or AQ-HTTP. -- Passeur's first native completion omitted the required `PASSEUR_MESSAGE` v2 assignment disposition and surfaced the same generic clarification twice. Root supplied the exact final-message schema, after which the task reached terminal completion. The separate [Passeur MCP usability report](reports/passeur-mcp-usability.md) records this observed recovery and the result-read bound. This adapter/reporting issue does not change the code test evidence. +- Passeur's first native completion omitted the required `PASSEUR_MESSAGE` v2 assignment disposition and surfaced the same generic clarification twice. Root supplied the exact final-message schema, after which the task reached terminal completion. The separate Passeur MCP usability report (`reports/passeur-mcp-usability.md`, removed; see Git history) records this observed recovery and the result-read bound. This adapter/reporting issue does not change the code test evidence. - Commit `ecff648b93f6263f44fd27dab4d2a982e65441ba` (`test(acquisition): cover concurrent stale handoff`) now contains the reviewed code and evidence updates on `work/acquisition-q1-http`. It is one commit ahead of `origin`; no push, PR update, merge or acceptance-state change was made. The Passeur task worktree is retained as provenance because cleanup was not authorized. AC06 remains partial: same-task-ID replacement, queued/verifying cancellation, idempotent release and preservation of all live/durable demands remain open. AC01–02 and the other required Q1 criteria remain pending; AQ-HTTP stays not ready, and Q2/runtime R1 stay gated. The unrelated untracked `docs/breif/future.md` remains untouched. ## 2026-10-01 — milestone plan integration branch established @@ -1583,7 +1583,7 @@ All seven primary write sets are disjoint. Do not broaden a stream or change sha ## 2026-10-05 — Q3 confirmed model output reconciliation successor -Separate branch `feat/acquisition-s3-reconcile-e1ee893f` preserves dispatch parent `e1ee893ff67752bdc839a067f15519f25a323c1a`, accepted reader PR38 and accepted main ancestry. Contract section 9/AC05 selects confirmed model publication before acquisition acknowledgement. A version-2 copied output receipt now binds the exact issued acquisition use; source-neutral importer output observation uses the existing consumer reconcile/settlement path. Model/index/physical payload proof is required; Pending, missing, changed, unbound and future receipt states remain unresolved with no replay, index repair, output deletion or migration. Ordinary version-1 copied output remains supported. [Qualification](reports/s3-reconciliation-qualification-2026-10-05.md) owns evolution, test oracles and limits. +Separate branch `feat/acquisition-s3-reconcile-e1ee893f` preserves dispatch parent `e1ee893ff67752bdc839a067f15519f25a323c1a`, accepted reader PR38 and accepted main ancestry. Contract section 9/AC05 selects confirmed model publication before acquisition acknowledgement. A version-2 copied output receipt now binds the exact issued acquisition use; source-neutral importer output observation uses the existing consumer reconcile/settlement path. Model/index/physical payload proof is required; Pending, missing, changed, unbound and future receipt states remain unresolved with no replay, index repair, output deletion or migration. Ordinary version-1 copied output remains supported. Qualification (`reports/s3-reconciliation-qualification-2026-10-05.md`, removed; see Git history) owns evolution, test oracles and limits. Final source local runtime checks passed: `s3_acquisition` 20/20, `s3_reader` 11/11, `artifact_acquisition` 5/5. Commands use `cargo test --locked --offline --manifest-path rust/Cargo.toml -p pumas-library --no-default-features --features s3 --test TARGET --config profile.test.package.pumas-library.debug=0 --config profile.test.package.pumas-library.incremental=false --config 'profile.test.package.pumas-library.strip="debuginfo"' -- --test-threads=1`. Strict `cargo clippy --locked --offline --manifest-path rust/Cargo.toml -p pumas-library --no-default-features --features s3,test-support --all-targets --config profile.dev.package.pumas-library.debug=0 --config profile.dev.package.pumas-library.incremental=false -- -D warnings` passed. Headless `cargo check` with no default features and the same dev package overrides passed. All-target compilation compiles unit fixtures but does not execute the full unit suite. Feature graph checker passed 12 contracts, attribution/dependency ownership checks passed, formatting/diff checks passed, and Node release tests passed 20/20. Exact logs/command arrays accompany the review package. @@ -1591,7 +1591,7 @@ Linux x86_64, Rust 1.92, existing shared Cargo target, `CARGO_BUILD_JOBS=1`, tas ## 2026-10-05 — Q3 explicit pinned file-set and GGUF auxiliary successor -Separate `feat/acquisition-s3-manifest-ea1c4ae7` over frozen ea1c4ae7 preserves dispatch e1ee893f, reader PR38 and accepted main. Complete explicit pinned selection flows through the existing acquisition owner; one GGUF plus data/text auxiliaries publishes from verified descriptors with preserved paths. Complete confirmed output may settle the exact cold use without transfer/import replay; omitted/changed/unsupported inputs refuse and retain evidence. [Qualification](reports/s3-manifest-qualification-2026-10-05.md) records pin encoding, per-object budgets, receipt compatibility, authority and limits. +Separate `feat/acquisition-s3-manifest-ea1c4ae7` over frozen ea1c4ae7 preserves dispatch e1ee893f, reader PR38 and accepted main. Complete explicit pinned selection flows through the existing acquisition owner; one GGUF plus data/text auxiliaries publishes from verified descriptors with preserved paths. Complete confirmed output may settle the exact cold use without transfer/import replay; omitted/changed/unsupported inputs refuse and retain evidence. Qualification (`reports/s3-manifest-qualification-2026-10-05.md`, removed; see Git history) records pin encoding, per-object budgets, receipt compatibility, authority and limits. Final local checks: 29 acquisition/import, 11 reader and five HTTP integration tests (45); strict enabled-S3 all-target Clippy; actual headless compile; 12 feature graph contracts; canonical attribution and workspace dependency ownership; format/diff; 20 release/workflow contracts. First integration compile failed E0583 nested module lookup, corrected by explicit path before runtime. Locked/offline Rust 1.92, shared target/jobs=1, task XDG config and package-local profile overrides. Only known completed task outputs were retired with size/hash journals. All 482 locked identities, unchanged canonical generator, HF and speech sources are preserved. Default ONNX/full-suite/native execution remains unqualified with about 135 MiB free and no completed ort-sys native output. No credentials, network settings or permissions changed. No independent review, hosted result, hard-kill/power-loss, live providers, desktop workflow or other multi-file weights claimed. AQ-S3 remains not ready; parent owns PR/review/integration. @@ -1609,7 +1609,7 @@ Review 5409255854 selected all 18 PR39 files. The receipt-size finding (discussi Separate `fix/acquisition-output-receipt-bound-159fd371` preserves 159fd371 and accepted main 73fec2e06c75ddae8c0e58be6ffcf352923376bd. The sole production change is neutral consumer admission/issuance in `acquisition/service.rs`: actual JSON capped at 4 MiB, unique file/parent namespace reserved at 2 MiB using encoded names plus 512 bytes per entry, within existing owned blocking work. Current copied-output schema measurement checks maximum-width physical identities/size/hash and fixed strings against those reserves; 2 × (4 MiB + 2 MiB) + 16 KiB is below the unchanged 16 MiB output limit. Old manifest decoding, receipt settlement/reconciliation and producer publication checks remain byte-identical. README sentence placement and ledger joined number/SHA tokens are repaired. Missing/null identity with intact payload retains exact cold uncertainty. -Final runtime targets pass 36 acquisition/import, 11 reader and five HTTP tests (52). A temporary 3 MiB callback/bundle stress extension separately ran 36 passes/one failure: owned background reconciliation visited `.tmp_import_…/config/tokenizer_config.json/metadata.json` and returned ENOTDIR at shutdown. The stress source/patch and failed log are retained outside this repair; the experiment is not a passing fixture or large-payload concurrency claim. AQ-S3 remains not ready on this and existing acceptance gaps. [Qualification](reports/s3-consumer-receipt-bound-2026-10-05.md) records final supporting checks and remaining limits. All 482 locked identities, canonical generator, HF/speech sources and frozen branches are preserved. No credentials, permissions/network settings, external review request or merge changed; parent owns PR39 integration. +Final runtime targets pass 36 acquisition/import, 11 reader and five HTTP tests (52). A temporary 3 MiB callback/bundle stress extension separately ran 36 passes/one failure: owned background reconciliation visited `.tmp_import_…/config/tokenizer_config.json/metadata.json` and returned ENOTDIR at shutdown. The stress source/patch and failed log are retained outside this repair; the experiment is not a passing fixture or large-payload concurrency claim. AQ-S3 remains not ready on this and existing acceptance gaps. Qualification (`reports/s3-consumer-receipt-bound-2026-10-05.md`, removed; see Git history) records final supporting checks and remaining limits. All 482 locked identities, canonical generator, HF/speech sources and frozen branches are preserved. No credentials, permissions/network settings, external review request or merge changed; parent owns PR39 integration. ## 2026-10-05 — explicit authenticated S3 reader successor @@ -1631,7 +1631,7 @@ all-target Clippy, headless check, formatting, diff checks and all 12 dependency feature graphs pass locally. The initial integration run's 30 read-only-home registry setup failures were corrected with disposable XDG configuration, without editing frozen repair code. Exact commands, source/standards authority, raw log -paths/hashes and limitations are in [qualification](reports/s3-authentication-qualification-2026-10-05.md). +paths/hashes and limitations are in qualification (`reports/s3-authentication-qualification-2026-10-05.md`, removed; see Git history). No real credentials/provider, external reviewer, PR/merge, native repair, dependency/lockfile or receipt/schema changes were used. Parent owns independent review and hosted integration. Next existing-plan feature is Q3 direct explicit @@ -1660,7 +1660,7 @@ fixture with verification enabled in a child process. The coordinator's optional SignedHeaders/token-tampering assertion is added only on this successor. The initial missing-await test compile and subsequent passing runs are retained. Exact commands, surface, raw logs/hashes and boundaries are in -[qualification](reports/s3-model-workflow-qualification-2026-10-05.md). +qualification (`reports/s3-model-workflow-qualification-2026-10-05.md`, removed; see Git history). Frozen reader/native watcher/importer/reconciliation/manifest production and staging/VersionId fixtures, main, schemas and dependencies remain unchanged. Parent owns review/hosted qualification/PRs/merges. Next existing-plan feature is @@ -1700,7 +1700,7 @@ media or transfer-only peak RAM. The initial c092 premature importer deadline failed and drained; the repair includes verified handoff in the unchanged 300s phase before the unchanged 30 s importer entry. Compile/interruption/failure logs, cache hash manifests and both successful measurements remain in the -[report and exact evidence](reports/ac10-public-hf-measurement-2026-10-06.md). +report and exact evidence (`reports/ac10-public-hf-measurement-2026-10-06.md`, removed; see Git history). Repository-local owner identity is verified; no dependency, production owner, S3/native frozen write set or public API changes. Parent owns PRs/hosted reviews/ integration. AC10 and AQ-HTTP remain pending. Next existing-plan feature is Q2 @@ -1729,8 +1729,8 @@ compile failure (exit101), repaired nine-control pass and pre-clock-refinement 153-pass run are separately identified. Independent specification and standards reviews ACK final blob. Exact argv, profiles, wrapper, logs, hashes, failures, clock/fixture limits, ONNX manifest policy and resource/cache restoration are in -[qualification](reports/http-elapsed-budget-qualification-2026-10-06.md) and its -[evidence JSON](reports/http-elapsed-budget-2026-10-06/evidence.json). +qualification (`reports/http-elapsed-budget-qualification-2026-10-06.md`, removed; see Git history) and its +evidence JSON (`reports/http-elapsed-budget-2026-10-06/evidence.json`, removed; see Git history). Repository-local MrScripty identity is verified before/after both commits. Parent owns PR/review/hosted integration. Linux synthetic/core evidence supports bounded AC02/AC06/AC10/AC15 aspects; those broader criteria and AQ-HTTP remain @@ -1750,7 +1750,21 @@ Rust subtree `0bd482ac031078865f944efeec6dad4d7d825530` matches tested HTTP sour the owner blob and all S3/native sources remain byte-identical. All ten deadline controls pass again in default and no-default (10/10 each) on this merge. The original failed controls, qualified checks, raw archive and AC10/PR42 evidence -are preserved. [Post-main evidence](reports/http-elapsed-budget-2026-10-06/post-main-evidence.json) +are preserved. Post-main evidence (`reports/http-elapsed-budget-2026-10-06/post-main-evidence.json`, removed; see Git history) binds exact commands/logs, identities, merge parents/tree and Rust subtree agreement. Parent separately monitors main's postmerge CI; no new hosted or full AQ-HTTP acceptance is claimed. Q2 remains the next gated implementation feature. + +## 2026-11-04 — v0.8.0 documentation review + +Plan compacted for the v0.8.0 documentation cleanup. Q1 and Q3 are recorded as +merged and shipped in 0.8.0 with AQ-HTTP and AQ-S3 not accepted; Q2 and Q4 stay +planned. The dated status narratives formerly at the top of `plan.md`, the +superseded Q1 starting-state section, and the dated slice qualification reports, +review packets, tool-usability notes, command-log archives and generated evidence +for merged slices were removed. They are retrievable from Git history at +`78c52fcf` (`git show 78c52fcf:docs/plans/artifact-acquisition/`). Links to +them in this ledger are rewritten as plain paths. Reports still cited by +`docs/contracts/`, the AQ-S3 provider record and the latest per-claim +reconciliation (`combined-ec03-acquisition-acceptance-2026-10-09.md`) are kept. No source, gate state +or acceptance claim changed. diff --git a/docs/plans/artifact-acquisition/issues.md b/docs/plans/artifact-acquisition/issues.md index ccbad409d..7149cf882 100644 --- a/docs/plans/artifact-acquisition/issues.md +++ b/docs/plans/artifact-acquisition/issues.md @@ -1,6 +1,6 @@ # Acquisition issues and dispositions -Q1 is active; production repairs and acceptance claims remain pending until evidence is recorded. Evidence references [the source audit](reports/codebase-audit.md), [the canonical contract](../../contracts/artifact-acquisition.md), and its linked primary sources. Severity is consequence within this scope, not an asserted exploited vulnerability. +Status review (2026-11-04, v0.8.0): Q1 and Q3 source work is merged and ships in 0.8.0; the Q1 repairs marked "fixed in the Q1 candidate" below landed with PR #34 and its follow-ups. Acceptance claims remain pending until current-head evidence is recorded; deferred items (AQ-D*) and pending environments (AQ-E01) are unchanged. Evidence references [the source audit](reports/codebase-audit.md), [the canonical contract](../../contracts/artifact-acquisition.md), and its linked primary sources. Severity is consequence within this scope, not an asserted exploited vulnerability. | ID | Severity / issue | Owner / disposition | Deciding evidence and revisit condition | | --- | --- | --- | --- | diff --git a/docs/plans/artifact-acquisition/plan.md b/docs/plans/artifact-acquisition/plan.md index c87ff49e1..83eb0e17b 100644 --- a/docs/plans/artifact-acquisition/plan.md +++ b/docs/plans/artifact-acquisition/plan.md @@ -1,310 +1,38 @@ # Plan: source-neutral artifact acquisition -**Positive HTTP elapsed-budget feature (2026-10-06):** Separate -`feat/acquisition-http-budget-0c02dcfb` retains frozen AC10 evidence base -`0c02dcfb81a0f7ab2a3858c2b5cee329816b3ce5` (tree `78c663ed397264284cb95662d49a3354380755d4`). Tested -source `0950c4d5839608c8dd5f52afcb3fd2424a9a1656` (tree `55c7dea28bae397ee9d70995897c5ff0c8e2a672`) now enforces the existing positive -per-file HTTP source-wait budget across headers, body, attempts and backoff. -Exact sets, verification, held handoff and receipts already existed; stalls -ignoring the configured budget were the missing AQ-HTTP prerequisite. All ten -controls and affected-slice checks pass; independent reviews ACK the final blob. -Zero-budget compatibility, registered-effect drainage, S3/native frozen source, -public API shapes and explicit runtime ONNX policy remain unchanged. See -[qualification](reports/http-elapsed-budget-qualification-2026-10-06.md). -Normal merge `6385a493` incorporates accepted main `1c1c7875`; the -Rust subtree is unchanged and all ten controls pass again in both modes. -AQ-HTTP remains pending. Next implementation feature is Q2 exact wheel closure / -verified local handoff / network-denied local-only Torch consumption, gated by -AQ-HTTP acceptance; no Q2 source change is admitted here. - -**AC10 public HF importer measurement (2026-10-06):** Separate -`qualification/ac10-public-hf-72224551` records the bounded ignored Linux -512 MiB public-core transfer/importer fixture at `8a147160` (tree `9544e16dde7802baa2033bf7ceea7d44c2ba3767`). -Default and no-default fresh-process runs preserve partial/final/settled inode, -match source/file/receipt digests and settle model/index publication to Adopted. -RSS samples at the importer hold are 99,004 and 96,536 kB respectively; raw -VmHWM/I/O and complete retained-file inventories are in the -[report](reports/ac10-public-hf-measurement-2026-10-06.md). -Both mixed-size controls and strict all-target core Clippy pass. Independent -source reviews accepted the exact timing repair; the first failed attempt remains -recorded. This is one synthetic workload, not a complete resource envelope. -AC10 and AQ-HTTP remain pending; Q2 remains gated. No production/API changes. - -**Installed S3 process-loss milestone (2026-10-06):** Separate -`feat/s3-installed-process-loss-ed31639` preserves frozen ed31639 and its actual -production binary hash. All eleven installed cases (the original ten plus one -pre-FilesReady SIGKILL), 24 controls and pinned CI Ruff pass at 81aea4c0. Actual -one-byte/transferring custody remains exact after two cold owners, with no source -replay or model/receipt publication. See [frozen qualification](reports/s3-installed-process-loss-2026-10-06.md). -This closes the bounded local milestone only. The next documented implementation -feature is Q2 wheel-file-set acquisition/local-only Torch consumption, gated by -AQ-HTTP, still not ready. Remaining S3 continuation is actual-provider Q3/AQ-S3 -acceptance; credentials/fixtures and supported platform/deployment inputs are -not supplied. No additional fault campaign is admitted. - -**Q4 installed default-plus-S3 successor (2026-10-06):** Independently admitted -`feat/s3-installed-prefix-main95` binds build provenance and complete S3 notices -to the existing installed HTTPS fixture harness. Actual production release, -all ten installed scenarios and default-profile health smoke pass at b0a66ba3. -All 16 provenance/oracle controls, full CI Ruff scope and YAML parse pass. -The original query-order fixture failure and its red/green repair are retained. -See [frozen qualification](reports/s3-installed-default-profile-2026-10-06.md). -The current prefix branch and all frozen evidence remain separate. Provider, -UI/platform/inference and hosted acceptance gates remain open. -The installed S3 pre-FilesReady process-loss successor is now locally qualified -in its separate branch/report above; broader gates remain open. - - -**Q3 prefix byte-capacity review repair (2026-10-06):** The maintained SDK now -preserves typed listing byte overflow and the prefix API reports Incomplete at -page/remaining-total capacity; malformed XML remains a protocol failure. Three -old-source red controls, final 30 S3 units, 66 integrations, strict core Clippy, -production RPC Clippy and 324 RPC cases pass (12 existing RPC ignores). -See [repair qualification](reports/s3-prefix-budget-review-repair-2026-10-06.md). -No source identity, retry/verification, credential or native/ONNX policy changes. -The next independent Q4 slice is truthful installed default-plus-S3 provenance -and complete notice packaging; actual-provider/platform gates remain open. - - -**Q3 bounded prefix source checkpoint (2026-10-06):** Separate -`feat/s3-prefix-main95` preserves integrated 7cf17383 and tested attribution -prerequisite a39121b4. Explicit bounded SDK pagination with reviewed XML agreement -and immutable conditional HEAD pins is implemented. Focused units/integrations -pass; recovered post-prefix default-plus-S3 RPC qualification passes 324 tests -with 12 existing ignores. Hosted/provider/platform gates remain pending. -See [qualification](reports/s3-prefix-enumeration-2026-10-06.md) and -[parent review packet](reports/s3-prefix-review-packet-2026-10-06.md). -Parent retains PR/review/integration ownership. Next existing-plan work is -Q3 actual-provider acceptance, then Q4 qualification. - - -**Q3 sibling composition and bounded Q4 evidence (2026-10-05):** The coordinator -authorized normal composition of frozen e6acb0ba and 7dc6acef, in that ordered -parent sequence. Merge cd9d8191 preserves accepted PR40 and every frozen ref. -Combined checks pass, including 171 acquisition units, 64 S3 integrations, -220 RPC cases, native owner/process checks and renderer/Node checks. A normal -production S3 release binary, unpacked outside checkout, passes ten independent -TLS/signature/import/cancellation/cold-restart scenarios and release health smoke. -This is an unreleased Linux qualification archive, with no test-support or -inference claim. Browser launch is blocked by sandbox-helper ownership; ordinary -official MinIO installation is blocked by HTTP 403 and stopped at that denial. -See [provider/platform matrix](reports/s3-composed-provider-qualification-2026-10-05.md) -for exact lineage, hashes, evidence kinds and missing external inputs. -The sibling entries below describe their earlier separate scope. AC13/AC14, -AQ-S3 and full AC17/Q4 remain pending. Parent owns review/integration; next -existing-plan work remains authorized actual-provider Q3 acceptance, then Q4. - -**Q3 empty selected S3 members (2026-10-05):** Separate -`feat/s3-empty-members-e8082649` preserves frozen e808 and its PR40 merge. -Known-zero immutable selections now pass through the existing writer/SHA/receipt -owner without an impossible range request; empty auxiliaries publish with exact -receipts, while empty GGUF weights, unknown/missing objects, wrong digests and -truncated mixed bundles fail. Cancellation and cold proof remain authoritative. -See [qualification](reports/s3-empty-members-qualification-2026-10-05.md). -The parent-requested reserved-name admission correction is a separate sibling -`fix/s3-bundle-reserved-e8082649`, not silently composed here. Parent owns reviews -and integration; provider and installed/native acceptance remain pending. -Next existing-plan work: authorized Q3 cross-provider acceptance, then Q4. - -**Q3 reserved bundle destination correction (2026-10-05):** Reviewer P2 at -frozen e808 is isolated on `fix/s3-bundle-reserved-e8082649`. RPC and native -preflight now reuse the acquired importer's reserved root/normalization rule -before job admission or source resolution, preserving final validation and -retained-work recovery. Reserved roots/aliases/descendants cause no source, -workspace-file or publication effects; a corrected same-owner request succeeds. -See [qualification](reports/s3-bundle-reserved-destinations-qualification-2026-10-05.md). -Frozen e808 and PR40 composition remain unchanged and changes-requested pending -parent review/integration. The separately delegated next slice is zero-length -members on sibling `feat/s3-empty-members-e8082649`; provider/Q4 gates stay open. - - -**Q3 pinned multi-file desktop/native composition (2026-10-05):** - -Separate `feat/s3-desktop-bundle-d30412e9` starts from frozen authenticated -`d30412e9`. Tested prerequisite `dd90f416` adds pure native manifest preflight -and safe explicit file-boundary observations; implementation `339032ff` adds -anonymous/authenticated bundle starts, aggregate read and per-file dialog pins. -Existing single-object methods, ephemeral secret handling, acquisition/import/ -registration/receipt/cancellation owners and policies remain compatible. - -The coordinator then authorized an explicit normal merge of accepted main -`838eb2990905144a59830f1a16fe91b4e1105d4d`, tree -`f6d6c1d3c5ba5be0fb998a6fd157fcb31c63dc72`, whose ordered parents are 05717338 -and 1e811936. Composition `d9d907cfe0e57b1e2bc7e296eff1327de835bc5e`, tree -`82511113e7e82a44ee526f91a8ce7f480282e0ec`, has ordered parents 339032ff and -838eb299. All frozen feature refs remain separate ancestors; accepted PR40 -publication/discovery repairs are included through that merge without rewriting -their implementation. Follow-up `5104a21e` qualifies the existing empty-member -refusal and adds its help text, with no reader policy change. - -Composed acquisition 171, model-library 832, reconciliation 35 and S3 integration -60 tests pass (overlapping subsets); full RPC 220 passes. Frontend 863, Node 242, -final DOM 20, no-S3 source 4 and generator 8 pass. Strict core Clippy and RPC -Clippy with inherited dead-code exception pass. Controlled HTTPS proves exact -multi-version pins, aggregate staging progress, optional authentication, -cancellation, receipts, no secret persistence/logging, missing/digest/empty -member refusal and honest retained outcomes. Browser/default/platform/provider -limits remain; AQ-S3 is not advanced. See [qualification](reports/s3-desktop-bundle-qualification-2026-10-05.md) -for exact trees, logs and boundary proof. Parent owns PR/review/hosted/merge/Library. -Next existing-plan implementation candidate: S3 zero-byte selected-member -handling through the existing reader/acquisition boundary, separately scoped; -live provider and Q4 installed/native qualification remain separate. - -**Q3 authenticated desktop/RPC successor (2026-10-05):** - -Separate `feat/s3-desktop-auth-106a6ca4` preserves frozen anonymous `106a6ca4`, -review fixes `887308dc`, native `eabc3959`, reader `ffecce07`, main `05717338` -and original PR40 `63123fd8` ancestry. Transport prerequisite `0023bcf9` contains -reflected errors before IPC. Implementation `39f7689ab20a10276839a8f5dff206879d53b008`, -tree `01f49715a2b3637826591a078134db0bc59f62ca`, adds a distinct authenticated -command with bounded Deserialize-only credentials and one-use uncontrolled form -inputs. Existing native HTTPS authenticated reader/import owns signing, identity, -verification, finalization and receipts; safe task state carries no credentials. - -217 RPC tests, four no-S3 regressions, 860 frontend tests, final 17 focused tests, -239 Electron tests (one native sandbox smoke skipped), eight generator tests, -types/lint/builds, scoped Clippy/format/diff/frozen checks pass. Controlled HTTPS -proves optional token signing, cancellation, static reflected-provider errors, -exact receipt identity and credential exclusion from owned files/debug output. -DOM evidence does not qualify browser behavior; existing sandbox/default ONNX -403/fully strict dead-code blockers remain. See [qualification](reports/s3-desktop-authentication-qualification-2026-10-05.md) -for commands, logs, corrections and lifetime limits. No frozen native/core, -dependency or security policy changes. Parent owns review/hosted/PR/merge/Library -coordination. Next existing-plan implementation candidate: explicit pinned -multi-file desktop selection through the existing native bundle workflow; -real-provider/refresh/platform acceptance remains separate. AQ-S3 stays pending. - -**Q3 anonymous desktop/RPC successor (2026-10-05):** Separate -`feat/s3-desktop-workflow-eabc3959` starts exactly from frozen native workflow -`eabc395966f2f3f155b298144bc81c4941121225`. Model Manager now offers one pinned -anonymous GGUF import with explicit HTTPS source facts, required VersionId and -SHA-256, phase/current-file byte observation, pre-finalization cancellation and -typed registered/retained-work results. Three closed commands compose the -existing native operation under one bounded RPC worker; closing observation does -not cancel it, and process shutdown awaits it. Source facts are not persisted as -account/configuration defaults; credentials are deliberately absent from this -wire/UI. Native authentication remains additive and independently frozen. -See [desktop qualification](reports/s3-desktop-workflow-qualification-2026-10-05.md) -for exact scope, controlled evidence and environment blockers. Frozen core, -reader, manifest, discovery, importer and native-repair bytes remain unchanged. -Next existing-plan Q3 feature is authenticated explicit-source RPC/desktop -configuration with a qualified ephemeral secret boundary; live AWS, a non-AWS -service and MinIO acceptance and Q4 installed/native qualification remain -separate. Parent retains review/hosted qualification/PRs/merges; AQ-S3 is not ready. - -**Plan status:** `Active` — Q1 is admitted on the current accepted `main` base; AQ-HTTP remains not ready. +**Plan status:** `Verifying`. Q1 and Q3 source work is merged and ships in +0.8.0; their objective gates (AQ-HTTP, AQ-S3) are not accepted. Q2 and Q4 are +`Planned` and have not started. No slice is currently being implemented. **Objective acceptance status:** `pending`. +**Current phase:** acceptance evidence for AQ-HTTP, then admission of Q2. +**Exactly one next slice:** AQ-HTTP acceptance on current `main` — rerun the +pending AC01–AC10, AC15, AC16 and AC18 claims against the shipped source and +record the deployed retained-state population (schema 6/7, old writers, +rollback) before any live-root mutation. Q2 and runtime R1 stay gated on it. + +**Status review (2026-11-04, v0.8.0):** The Q1 shared HTTP lifecycle, neutral +persistence/handoff and HF/llama.cpp consumer cutover merged through PR #34 +(`232698f1`), with follow-ups in PRs #39 and #43 (HTTP elapsed-time budget). +Q3 S3 reader, explicit/conditional manifests, authored bundles, desktop/RPC +workflows and installed-process fixtures merged through PRs #38, #42 and #52 +and the 2026-10-09 v0.8 integrations (PRs #59, #60, #61 and #68). The shipping +implementation is `rust/crates/pumas-core/src/acquisition/`; behavior is owned by +the [artifact acquisition contract](../../contracts/artifact-acquisition.md). +No plan record changed between 2026-10-09 and this review, and v0.8.0 +qualification does not depend on these gates. Q2 has no source yet: the Torch installer does not +consume the acquisition owner. Evidence bound to pre-merge branch heads is +historical; acceptance needs fresh exact-head evidence. Dated slice reports, +command-log archives and generated evidence for merged slices were removed in +this review and remain in Git history +(`git log -- docs/plans/artifact-acquisition/reports`). -**Q3 native explicit source workflow successor (2026-10-05):** Separate -`feat/s3-model-workflow-ffecce07` starts from the frozen authenticated reader -`ffecce07220f6504fb1db2e348759473bd284de6`, tree -`0acb23784970e86859851c9063e76d04cd740b8b`. The coordinator reported independent -source-review acceptance of that reader; hosted/provider acceptance remains -separate. The selected smallest application entry is native -`PumasApi::import_s3_model`: caller-supplied explicit source/version/digest facts, -a reserved workspace, finite retry budgets, stable operation UUID and optional -request-scoped credentials compose through the bounded acquisition scope and -existing single/bundled GGUF importer. Safe phase/current-file byte observation, -pre-finalization cancellation, typed result and retained-work semantics belong -to this additive facade. See [qualification](reports/s3-model-workflow-qualification-2026-10-05.md) -for the exact tested code milestone and checks. Frozen native discovery, -watcher/importer/reconciliation and reader/manifest production paths are -unchanged. The optional reviewed token-signing assertion is extended only in -the successor test. Next existing-plan implementation is Q3 desktop/RPC explicit -source/configuration entry through this native operation; real-provider and -installed/native qualification remain separate. Parent owns review, hosted -qualification and integration. AQ-S3 stays not ready. - -**Q3 explicit authenticated-reader slice (2026-10-05):** On -`feat/acquisition-s3-auth-63123fd8`, the explicitly delegated credential slice -builds on exact PR40 head `63123fd8f9f866064a8315096ab3fb1fc81e8f0f`, tree -`163ef2442695b44555ac0e42ff79a6a88de9e817`, preserving accepted main -`05717338c2aea737483fb4b28c3ed4053a65de96` and every staging/VersionId repair. -Code milestone `d74114c63a9717692fa7051ef5146d7253a2c5c5` adds an additive -HTTPS-only authenticated constructor with explicit in-memory credentials and an -optional session token. Anonymous construction and identity/retry/verification -contracts are retained. Nine authentication unit fixtures, 41 existing S3 -acquisition regressions, 13 reader tests, strict enabled-S3 Clippy and supporting -headless/static checks pass locally. See [qualification](reports/s3-authentication-qualification-2026-10-05.md). -The frozen watcher/importer/manifest write set remains untouched. Independent -review, exact-head hosted qualification and integration are coordinator-owned. -The next existing-plan implementation slice is Q3's direct explicit source-facing -application workflow/source configuration through the existing model operations; -real AWS/non-AWS/MinIO acceptance and credential refresh remain separate. -AC13/AC14 and AQ-S3 remain pending. - -**Q3 staging/version acceptance follow-up:** Merged PR39 is the base for the two fixes on `fix/import-discovery-s3-version`: private temporary-import events no longer become watcher model scopes, and explicit S3 manifests distinguish same-key/different-VersionId objects while retaining same-version evidence checks. The fixes were pushed without force and verified at `a606c80b0be41580c7af0583703d9f9af5f2cb44`. A successor normal-workflow fixture now qualifies a valid 3 MiB callback and 3 MiB auxiliary with the real watcher, public GetModel observation, clean shutdown and cold output proof without source replay. See [qualification](reports/s3-staging-discovery-qualification.md) for commands, failed experiment and limits. AC13/AC14 and AQ-S3 remain pending. The next slice is authorized real-provider/source-configuration qualification; credentials, live AWS/non-AWS/MinIO and desktop workflow are not supplied or established by these local fixtures. - -**Admitted Q3 reader development (2026-10-04):** The coordinator explicitly delegated the next useful feature slice independently of blocked Torch acceptance. On `feat/acquisition-s3-reader-c70a78f7`, base `c70a78f7232f46dfb3a6b73db8bcc75fa9293acf`, develop the first optional anonymous, version-bound S3 protocol reader and qualify it against a deterministic local fixture. The reader produces the existing manifest and streams ranges into caller-owned staging; it does not own retry, persistence, import, or consumer publication. Its accepted boundary is explicit endpoint/addressing authority, immutable VersionId selection, conditional range reads, changed-object refusal, cancellation, and optional-feature isolation. AWS/non-AWS/MinIO, authenticated/refreshing credentials, shared-service source dispatch, model import, and AQ-S3 acceptance remain open. PR/review/integration are coordinator-owned; worker commit and non-force push are authorized. Historical gate evidence below is not advanced by this slice. - -**Q3 reader milestone:** The optional `s3` reader now includes addressing style in its stable source identity. Its 11 local protocol fixtures, strict all-target headless Clippy, default/headless dependency isolation, and exact locked license collection passed. See [reader qualification](reports/s3-reader-qualification-2026-10-04.md) for source scope, commands and limits. The coordinator reported independent acceptance and published draft [PR38](https://github.com/MrScripty/Pumas-Library/pull/38) at the exact reader commit. Ordinary CI does not enable S3; explicit hosted qualification remains necessary. The dispatch/import successor below is separate from reader evidence. Authenticated/refreshing credentials and live AWS/non-AWS/MinIO qualification remain open. This reader milestone does not close AQ-S3. - -**Admitted Q3 dispatch/import successor (2026-10-04):** The coordinator delegated shared-service dispatch and real model import on `feat/acquisition-s3-import-2c7d6014`, preserving reader `2c7d6014658ef44575f3724f0ff6e7395f1fd7d8` and accepted main `96c2dca97fad673a2735f9f778013067569fe692` as ancestors. The bounded path is one anonymous versioned object through the existing acquisition owner to one GGUF published by the existing model importer from a verified descriptor. Enabled-S3 hosted test/Clippy commands are part of this slice; ordinary CI omits the SDK. See [dispatch/import qualification](reports/s3-dispatch-import-qualification-2026-10-04.md) for lifecycle, receipt ordering, local evidence and remaining scopes. Independent review and exact-head hosted CI are coordinator-owned and pending. The next slice is source-facing composition and exact model-output reconciliation; credentials, multi-file formats, live-provider and native qualification remain separate. AQ-S3 is not advanced. - -**Q3 explicit-set composition successor (2026-10-05):** Separate branch `feat/acquisition-s3-manifest-ea1c4ae7` builds on reconciliation candidate `ea1c4ae75a8a6d4719a95f31c684e1d0398acbb8`, preserving reviewed dispatch e1ee893f, accepted reader PR38 and main ancestry. The reader resolves all explicitly pinned members; the shared acquisition owner verifies the full set; the existing copied importer publishes one GGUF plus selected data/text auxiliaries with exact paths. Confirmed cold recovery proves every member before settlement without replay. See [explicit-set qualification](reports/s3-manifest-qualification-2026-10-05.md). Forty-five focused local tests, strict enabled-S3 all-target Clippy and headless/static checks passed. Independent review and hosted acceptance are coordinator-owned. Credentials, source-facing application workflow, live providers, sharded/other multi-file weights and complete native/default/full-suite qualification remain open. AQ-S3 remains not ready. - -**Q3 consumer receipt byte-budget review correction (2026-10-05):** PR39 review found the S3 pin budget does not bound generic selected manifests, callback payloads or expanded directory-prefix proofs. A separate successor of exact 159fd371 bounds actual pretty manifest/completion JSON and unique namespace proof entries in existing owned consumer work, before new admission/issuance. Retained decoding, settlement, publisher schema and late defensive bounds remain unchanged. The actual red controls, current publication-schema reserve proof and final checks are recorded in [qualification](reports/s3-consumer-receipt-bound-2026-10-05.md). A temporary 3 MiB callback/bundle stress fixture independently exposed live-stage reconciliation ENOTDIR at shutdown; its source/log are preserved for separate work, and large-payload concurrent discovery is unqualified. Accepted main 73fec2e0 and frozen 159fd371 remain intact. AQ-S3 remains not ready; parent owns PR39 review/integration. - -**Q3 acquired publication proof correction (2026-10-05):** Independent review found legacy missing-identity compatibility could bypass acquired Confirmed/root/payload proof in ea1c4ae7 and 772294c1. A separate bounded repair requires explicit canonical/indexed publication identity and covers cold changed/missing output with retained Using state. See [repair evidence](reports/s3-publication-proof-repair-2026-10-05.md). Prior positive fixtures did not establish this missing-identity boundary. Accepted main 73fec2e0 is verified and preserved in the repair composition. Initial SHA fetch authentication failure resolved through the existing normal push/branch-fetch path, without settings changes. AQ-S3 remains not ready. - -**Current Q1 action — integration review repairs:** Draft [PR #34](https://github.com/MrScripty/Pumas-Library/pull/34) on `integrate/http-acquisition-baseline` preserves the original Q1 and repaired-main histories. [Build 37141872406](https://github.com/MrScripty/Pumas-Library/actions/runs/37141872406) passed all seven ordinary jobs on `0dd38c707125facfdaae29c82704213e85ceb155` (tree `7611df7a568d56807589bb2dca2bfbb03e484dd0`): workflow/release contracts, frontend/desktop, strict Rust quality, headless without inference, and native Linux/macOS/Windows. This is exact-head supporting AC15 evidence for the checks that ran. Release archives and native model E2E remain unqualified; AQ-HTTP, external review disposition and maintainer integration remain pending. Review repairs after this head require fresh exact-head qualification. -**Historical Q1 phase before integration:** The local Q1 candidate advances the shared `downloads.json` authority to schema 7 with exact HF completion receipts and cold `Using` reconciliation. The Hugging Face workflow imports through the shared verified-file owner, and the llama.cpp archive installer uses that same owner, extracts from its verified file handle, and records/reconciles a native installation receipt. Cancellation that wins before the native receipt now revokes the exact attempt, cleans its workspace, and withdraws the exact receipt-free lease; cold reopen and same-tag retry are covered locally. RPC composition injects the shared consumer and drains consumers before acquisition shutdown. This resumed slice adds finite shared worker, blocking-job, rescue and live/draining-scope admission, typed overload errors, and public direct llama.cpp setup through the existing service with retained-work reconciliation before return. Ordinary direct installs now prepare and clean their workspaces through registered capacity; the legacy unconfigured installer refuses before filesystem or progress mutation. Configured counts remain admission defaults, not measured resource guarantees. Warm checkpoints now retain at most `AcquisitionCapacity.workers` entries per service and cap encoded metadata at 64 KiB per entry; local checkpoint and full acquisition tests plus strict all-target Clippy pass. This bounds checkpoint metadata only; queue, stream, buffer, hash, descriptor, peak-RAM, disk and network behavior remain unqualified under AC10. Initial Sol High findings on shutdown lock order, recovery-effect custody and HF error propagation were repaired with focused regressions. A review after closing the ordinary-install custody gap found no new confirmed correctness issue. A later composed-path review found three additional lifecycle gaps, now repaired on the Q1 branch: llama.cpp HTTP and post-publication progress sends observe cancellation and shutdown; registered `AcquiredArtifactUse::run_blocking` effects retain the workspace execution lease after waiter cancellation; and manager recovery lookup runs under consumer custody. Focused tests cover the full progress-channel control signals and retained workspace lease; the progress fixture runs on Linux x86_64, so packaged and supported-platform shutdown behavior remains unqualified. The AC06 service fixtures prove same-owner resume after pause with a valid HTTP range response and original receipt, reject sequential and concurrent stale handoffs, and exercise same-task-key Worker→CancelFinalizer replacement and Worker→Worker reuse. The retained paused `/rpc` test now covers one cancellation, exact cleanup/isolation, and same-process API reconstruction. Queued cancellation, service-level Verifying cancellation, idempotent public release, and all live/durable demand combinations remain open. Public customer compatibility remains unresolved under AC16. AC03 and AC15 have bounded evidence for their recorded candidates and scopes; the current branch still needs exact-head AC15 requalification. The remaining required Q1 claims and broader desktop, deployment, resource, public-client, and platform scopes remain open. AQ-HTTP is not ready. -**Hosted validation follow-up (2026-10-01):** Build #36934392505 on `6f40880ab397d185e4bcf590e781f56d6632842a` passed workflow/release checks, Rust quality, headless-without-inference, and Linux/macOS Torch native QA. It failed two frontend tests because a test clicked an existing but disabled install button before async choices arrived, and the Windows managed-child QA fixture did not start its descendant within 10 seconds. All three manual Torch native RPC E2E jobs failed during CPython 3.14.7 full-archive license evidence collection; declared zstd license members were missing, and Linux/macOS also lacked the declared zlib-ng member. A test-only wait-for-enabled correction passes the focused frontend file locally (18/18, Node 24.12.0); the corrected head still needs hosted validation. AC15 current-head requalification and AQ-HTTP remain pending. - -**Exact-head follow-up (2026-10-01):** Build #36937514619 completed on code/test head `381d66c82a0264acb74948785b7b355afba29109`. Workflow/release checks, Rust quality, headless-without-inference, frontend/desktop contracts, and Torch native QA on Linux, macOS, and Windows passed. All three manual Torch native RPC E2E jobs failed during CPython 3.14.7 full-archive license evidence collection; the metadata-declared zstd and zlib-ng files were absent from the downloaded archive. The overall Build failed on those jobs. The test-only frontend synchronization correction is verified; AC15 current-head requalification and AQ-HTTP remain pending. - -**Historical exact-head hosted validation (2026-10-02):** Build #36958240065 ran on pre-slice Q1 code head `f0311afdce69dbae5ca0cc53d562e8113f237732`. Workflow/release checks, Rust quality, headless-without-inference, frontend/desktop contracts, and Torch native QA on Linux, macOS and Windows passed. All three Torch native RPC E2E jobs failed while collecting CPython 3.14.7 full-archive license evidence: zstd was absent on Windows, while zstd and zlib-ng were absent on Linux/macOS. This does not qualify the new Q1 test head; rerun exact-head validation after pushing it. AC15 current-head qualification and AQ-HTTP remain pending. - -**Earlier normalized AC15 candidate result (2026-10-02; superseded by the AC09 candidate below):** The first frozen candidate at HEAD `42a198bfc73e9f32e5107bc57fe5c25ed7e3c2c9` plus seven Rust/frontend paths (fingerprint `6de2c5f76ac6d8f818605753dc47d0c40949e00e216e8bf3697a4b8a8a61e6d0`) passed the initial local aggregate. Exact staged review found two test-only timeout paths could detach `spawn_blocking` store snapshots. They now directly await both handles and observe terminal errors; separate GPT-6.1 Sol High standards/spec reviews confirmed lifecycle compliance and an unchanged test oracle. Formatting those awaits changed the candidate fingerprint again, to `89b890e780b74e1d6674465fc9671baaaecba1ac9a10ceb50d395b5b57f422e3`. The full default/no-default Rust package matrix, Rust fmt/check/strict Clippy, frontend lint/types/789 tests, Electron lint/validate/183 tests (1 ignored), launcher 49 tests, and desktop-contract checks (8 generator, 41 RPC/Electron and 48 frontend tests) passed on that normalized fingerprint. Three first full-suite attempts had bounded timeout failures (two core controlled-transfer first-chunk setups and one app-manager stalled-shutdown case); each isolated test passed and the unchanged full package run passed on repeat. Local frontend/Electron checks used Node 24.12.0 and documented npm workspace commands; exact Node 24.15.0 was unavailable. Exact commands, warnings, reruns and limits are in the [ledger](execution-ledger.md). This historical local evidence does not replace exact-head hosted validation. AC15 and AQ-HTTP remain pending. - -**Q1 exact-head hosted validation (2026-10-02):** Draft PR #7 is open from `work/acquisition-q1-http` to `work/artifact-acquisition-runtime-plan` at code/test head `23dd044744f086bc295c767f6b335f0c3c29cb69`. Build #36995870643 completed with workflow/release contracts, frontend/desktop contracts, headless without inference, Rust quality, and Linux/macOS/Windows Torch native QA passing. Its Linux, Windows and macOS Torch native RPC E2E jobs failed during Python 3.14.7 license evidence collection because the downloaded archive lacked declared `LICENSE.zlib-ng.txt` and/or `LICENSE.zstd.txt` members (Windows lacked zstd; Linux/macOS lacked both). Release/package assembly jobs were skipped after those failures. This exact run does not satisfy hosted AC15; the AC09 test below changes source, requiring a new candidate, full local requalification and a fresh exact-head Build. - -**Historical AC09 test candidate (2026-10-02):** Starting at HEAD `23dd044744f086bc295c767f6b335f0c3c29cb69`, the working source diff over `rust/` and `frontend/` has SHA-256 `9da31bf9e7d397621ba70320b81060b4890a0be78995e5cbf5592cce729494e7`. The admitted `native_independent_acquisition_installs_and_repeated_shutdown_preserves_receipt` test passes 1/1 in both default and `--no-default-features` `pumas-app-manager --lib` configurations on Linux x86_64 with a controlled loopback archive. Final spec and standards reviews accepted its canonical model DB/sidecar checks, bounded admission, monitor lifetime through shutdown/refusal probes, and captured-failure cleanup. The full local AC15 matrix passes on this exact candidate: default and no-default package suites, workspace fmt/check/strict Clippy, frontend lint/types/789 tests, Electron lint/validate/183 tests (1 ignored), launcher 49 tests, and desktop-contract checks (8 generator, 41 RPC/Electron and 48 frontend tests). See the [ledger](execution-ledger.md) for package counts, warnings and toolchain details. The repository pins Node 24.15.0; local UI checks used Node 24.12.0 with pnpm 10.33.0. This is local supporting evidence only: the candidate remains uncommitted and needs exact-head hosted validation. AC09, current-head AC15 and AQ-HTTP remain pending. - -**Earlier scoped evidence (2026-10-01):** AC03 is accepted for real Hugging Face import and official llama.cpp installation through the source-built RPC backend on Linux x86_64; both persisted products survived a clean restart. AC15 is accepted on code candidate `7963211bc5989f6b08712792bf1542a2314cb7fb` after Build #357's targeted Windows retry passed. Build #358 also passed on the documentation-only PR head `c0412ddb4bf3d65fee69fd8e6e9744fe324e7100`, including Windows native QA. These are recorded candidate results, not current-branch CI evidence: the prior remote Q1 head `96a1cbe8999576ca8dc70143201e6e98b0c6a37d` failed the recovery fixture in both default and no-default CI. The corrected working-tree fixture passed the focused test in both configurations (1/1 each); full exact-head CI is pending. The HF operation used mutable `main` revision metadata but verified the selected weight file's publisher LFS SHA-256. A near-settlement `get_model_download_status` call returned `-32603`; the following list and model projection showed successful completion, so this is recorded for AC08 follow-up. The warm-checkpoint component is locally bounded and covered by 110 acquisition tests, but these results do not establish the complete measured resource envelope, packaged desktop behavior, deployed migration/old-writer safety, public-client compatibility, or cross-platform durability; AQ-HTTP remains not ready. - -**Latest scoped evidence (2026-10-02):** `public_hf_status_poll_tracks_mixed_size_download_through_receipt_settlement` passes 1/1 on Linux x86_64 with a controlled loopback HF endpoint. It polls the public core getter during delayed mixed-size transfer and held final import, then verifies receipt-backed completion, model/index presence, adoption, queue release, and a stable repeated terminal observation. Strict all-target `pumas-library` Clippy, scoped rustfmt, and `git diff --check` pass. This does not qualify RPC/JSON-RPC, preload, Electron, supported platforms, or the recorded real-source `-32603`. The next admitted AC08 write set converts the preserved `[0,1]` HF progress fraction to whole-percent text in the header and adds a focused status-role regression; current callers, count behavior and proof limits are recorded in `reports/write-sets.md`. AC01, AC08, AC16, and AQ-HTTP remain pending. - -**Latest frontend scoped evidence (2026-10-02):** The admitted header fraction-to-percent correction passes `Header.test.tsx` 28/28, frontend TypeScript `check:types`, ESLint, and `git diff --check` on Linux x86_64 using Node 24.12.0; repository `.node-version` is 24.15.0, so exact-pinned local execution remains unavailable. The new status-role case checks backend fraction `0.42` as `42%` under the header's zero-count/default branch. Normal `App` and `LibraryOnlyApp` callers pair the selected download with a positive active count and retain their existing aggregate-count/speed display. This is a narrow component projection result, not the real delayed Electron workflow or complete AC08; AC08, AC16 and AQ-HTTP remain pending. Rerun exact-head hosted Build after the changes are committed and pushed. -**Latest AC08 HTTP/JSON-RPC scoped evidence (2026-10-02):** `retained_paused_download_status_round_trips_through_http_json_rpc` passes 1/1 on Linux x86_64 through the actual in-process `/rpc` listener with local IPC/loopback permission. It opens a current-format paused partial record, checks two stable status results including exact projected identities, 7/100 bytes, a finite ~0.07 fraction and explicitly serialized null ETA, then observes bounded owner shutdown. This fills retained-status transport coverage only; it is not live transfer/import evidence, binary startup, Electron behavior, or diagnosis of the prior real-source `-32603`. AC08, AC16 and AQ-HTTP remain pending. -**Latest AC06/AC08/AC16 HTTP JSON-RPC cancellation evidence (2026-10-02):** `retained_paused_download_cancellation_cleans_only_target_through_http_json_rpc_and_reopens` passes 1/1 on Linux x86_64. Through actual `/rpc`, it cancels one of two retained paused records, observes terminal cancellation, exact target-only partial/marker cleanup, keeper and sentinel preservation, queue/public inventory state, and same-process API/server reconstruction with the target still absent. The focused run requires local filesystem/loopback permission; it does not exercise an active transfer/import, source non-replay, process-loss durability, Electron, external clients, or supported platforms. The prior API reconstruction attempt revealed that the first server handle and reqwest client had to be dropped after observed shutdown; the passing test now does so. This partial retained-state composition is not full AC06/AC08/AC16, and AQ-HTTP remains not ready. The exact test command, review and limits are in the [execution ledger](execution-ledger.md). -**Latest AC01/AC08/AC16 HTTP JSON-RPC resume-refusal evidence (2026-10-02):** `retained_weak_selection_resume_refusal_preserves_paused_state_through_http_json_rpc_and_reopens` passes 1/1 on Linux x86_64 with local filesystem/loopback permission. It requires the exact correlated `-32005` invalid-request envelope for a retained mutable-revision selection without a digest, and preserves its paused status, selected identity, full durable inventory, partial file, marker and sentinel across refusal, bounded shutdown and same-process API reconstruction. This is not successful resume, live HTTP/import behavior, source-request-count evidence or process-loss durability, and it does not explain the recorded real-source `-32603`. AC01, AC08, AC16 and AQ-HTTP remain pending. -**Latest AC08/AC16 digest-backed HF resume/import settlement through HTTP JSON-RPC (2026-10-02):** `retained_digest_resume_status_waits_for_import_settlement_through_http_json_rpc` passed 1/1 on Linux x86_64 with local filesystem/loopback permission. With one retained 24-byte digest-backed GGUF, actual `/rpc` status remained `Downloading` at the held real importer metadata write with complete bytes, `Using` custody and active queue admission; after release it reached repeated stable `Completed` with model/index output, matching receipt, `Adopted` and queue release. The fixture exercises complete retained bytes, not live HTTP continuation or source-request counts; it does not explain the historical real-source `-32603`, prove hard process/power-loss recovery, or qualify Electron, deployed roots or other platforms. The initial run found a missing isolated `launcher-data` fixture directory, which was added; the permitted rerun passed without skip. The no-default-features RPC build reported 11 existing dead-code warnings. Independent GPT-6.1 Sol High review accepted the corrected exact diff. AC08, AC16 and AQ-HTTP remain pending; see the [execution ledger](execution-ledger.md). -**Recent implementation slice — AC01/AC08 truthful HF progress totals:** Fresh and recovery admission now set a byte denominator only when every selected file size is known and the checked sum is positive. Unknown and zero-byte totals remain unknown; all received bytes are no longer divided by a known-size subtotal. The RPC range validator is unchanged. Controlled producer regressions cover mixed-size fresh/recovery admission, bytes beyond the known subtotal, valid progress and serialization. The focused HF download module passed 178 tests, and follow-up read-only Sol High review found no substantiated issue. This repairs the source-derived denominator failure path, but it does not explain the recorded real-source `-32603`; its response payload is unavailable, and the local public-core delayed poll does not reproduce the affected RPC call. AC01, AC08 and AQ-HTTP remain pending. - -**Current AC01/AC02 hardening candidate — canonical path and encoding ambiguity:** Commits `83d6adc1` (source candidate `aeb1c304`) and `0f272db1` (source candidate `779a91b0`) add the Unicode collision and duplicate-encoding checks to this branch. The manifest collision key applies NFC, lowercase and NFC per path component across final paths, `.part` staging paths and file/directory prefixes while preserving original Unicode paths/source keys. A direct `unicode-normalization` dependency supports this comparison. The HTTP response validator rejects multiple `Content-Encoding` fields before exposing the response body. On current HEAD, the manifest unit module passed 10/10 and the HTTP unit module passed 20/20 serially with offline Cargo and one job; these include rejection and positive-admission cases for both changes. `cargo check --offline --jobs 1 --manifest-path rust/Cargo.toml -p pumas-library --no-default-features`, scoped rustfmt, and `git diff --check` pass. These local results do not close the full AC01/AC02 evidence: Linux fixture behavior does not establish macOS filesystem identity, the broader HTTP fault matrix remains open, and exact-head hosted CI has not been observed. AC01 and AC02 remain pending. - -**Current AC04 candidate — strict duplicate-member reads and offline migrations:** Canonical acquisition, model-inventory and HF-receipt reads now reject duplicate decoded JSON object member names through a recursive Serde visitor, while unrelated JSON readers retain their prior behavior. The filtered `duplicate` test run passed 29 tests (including unrelated matching test names), strict all-target `pumas-library` Clippy passed, rustfmt and diff checks pass, and independent Sol High review found no substantiated issue. On exact candidate `2b71e874`, focused schema-6 retained-partition migration and schema-4/5 migration fixtures each passed. The schema-6 fixture covers cold production-reader reopen, no fabricated consumer receipt, and refusal to settle Pending cleanup. These are partial local AC04 evidence only; other recovery windows, deployed schema-6 population, old-writer exclusion, rollback and retained-root evidence remain open. AC04 and AQ-HTTP remain pending. - -**Current AC05 native recovery evidence (2026-10-01):** Three bounded Linux x86_64 fixtures now cover distinct native states: receiptless `Using` custody after injected preparation failure; receipt-bearing cold-owner recovery after an injected returned error between durable destination rename and installed-metadata publication; and a subprocess killed by parent-issued SIGKILL at that same post-rename/post-sync, pre-metadata boundary. The new child-process regression passes 1/1. It checks retained receipt/acquisition/lease/demand/manifest/workspace/output correspondence, cold-owner settlement to `Adopted`, stable repeated reopen, and no follow-up request to its controlled loopback source through both owners and a bounded drain. The returned-error fixture remains same-process, and the SIGKILL fixture covers one interruption point only. Neither is power-loss proof; the loopback source, Linux x86_64 target and disposable root do not qualify real-source behavior, other crash windows, deployed migration, shutdown/resource bounds, packaged behavior, Windows/macOS, or full AC05. AC05 and AQ-HTTP remain pending. - -**Current AC15 local app-manager verification (2026-10-01):** At handoff head `b0fef68bb4fdc5b5adc5f1e1a1bdeb4aea467dde`, the app-manager library suite passed 268/268 non-ignored tests in both default and no-default-features configurations; strict all-target Clippy passed in both configurations and scoped rustfmt passed. This covers the changed app-manager source slice on Linux x86_64, not the full Q1 core/RPC/desktop/feature matrix or hosted workflow qualification. AC15 remains accepted only for its historical candidate; current-branch AC15 and AQ-HTTP remain pending. - -**Current Q1 hosted-validation follow-up (2026-10-01):** Because `build.yml`'s pull-request filter excludes `work/artifact-acquisition-runtime-plan`, Build run `36932716241` was manually dispatched on PR head `6653bdadd51fb55e15933173b3974054f683d7a3`. Workflow lint, dependency ownership and release-version checks passed; release attribution then failed because `rust/Cargo.lock` and `pumas-core/Cargo.toml` had changed with the earlier admitted Unicode normalization dependency. The canonical attribution generator has now refreshed the notice and inventory outputs, and their local checker/tests pass. The hosted code-quality jobs were skipped after the prerequisite failure; rerun Build on the updated head before considering AC15. AC15 and AQ-HTTP remain pending. - -**Current AC18 source-level locality review (2026-10-01):** Independent GPT-6.1 Sol High review compared code candidate `c3a550cc160ed759cfbac2c2d3ac0f95e6856fc6` with plan base `e37bbf4b964a0e2aadf25f80ab71edd8fa6b3eb3`. The current documentation head `d85ecc37913dd9d3fbb9ed7cdc5e3848c816d6ce` changes only the ledger. No substantiated architecture defect was found in the migrated HF and llama.cpp paths: each uses the shared acquisition owner/store/writer, consumer publication stays with model/native owners, receipt settlement and recovery stay at those consumer boundaries, and no acquisition-to-app-manager/model-importer/runtime dependency was found. The unmodified Ollama archive path, generic public `DownloadManager` callers outside this checkout, HF receipt decoding compatibility seam, and future Q2 wheel/Q3 S3 compositions remain outside this review. This is source review, not correctness, migration, platform or acceptance certification; AC18 and AQ-HTTP remain pending. - -**Remaining Q1 objective acceptance evidence:** AC01–AC02 complete source/HTTP semantics; AC04–AC07 recovery, crash windows, cancellation and provenance; AC08 desktop controls and the progress-status anomaly; AC09 bootstrap/shutdown; AC10 measured resource bounds; AC16 public-client compatibility; AC17 deployment/platform qualification; and AC18 composition/locality qualification. An independent source review of the migrated HF and llama.cpp paths found no substantiated ownership defect, but package/S3 compositions and the full AC18 acceptance scope remain open. Keep deployed retained-root mutation blocked until schema-6 population, overlapping old writers and rollback requirements are inventoried. Do not open Q2 or runtime R1 until AQ-HTTP's objective gate is accepted; the scoped Linux source-built backend result does not satisfy the remaining gate claims. **Canonical plan path:** `docs/plans/artifact-acquisition/plan.md`. -**Owner:** Pumas acquisition integration. The repository owner assigns the implementation and integration roles when admitting source work. -**Operation:** `start` this exact plan on `work/acquisition-q1-http`. -**Planning baseline:** Pumas `a8359512a580aa25fb2f9c9e4cd7e0dd64fd970d`, preserved and integrated by `f4dd7ff9`. -**Implementation base:** accepted Pumas `main` `e37bbf4b964a0e2aadf25f80ab71edd8fa6b3eb3`; Coding-Standards `39d55dc330d44ecf940364ceada9d2527f7c7ea0`; delivered runtime plan revision 3 is the input, revision 4 is the companion output. -**Milestone integration:** `work/artifact-acquisition-runtime-plan` is the plan integration branch, based on the accepted `main` commit above. Draft PR #7 carries Q1 from `work/acquisition-q1-http` into that plan branch. Later milestone branches enter the same plan branch in dependency order after required corrections and evidence are complete. Only the fully integrated plan is proposed to `main`; no `main` merge is implied by a milestone PR. - -**Recent bounded Q1 evidence — AC06 cancellation during file-set sealing:** Test `cancellation_during_acquisition_file_set_sealing_drains_before_handoff` in `rust/crates/pumas-core/src/model_library/hf/download.rs` reuses `imported_download_fixture` and its real importer, then pauses the shared owner's registered `seal verified acquisition file set` effect before durable `FilesReady` handoff. Public HF cancellation is acknowledged while the worker remains `Cancelling` and the acquisition `Transferring`; input and marker bytes, admission, root custody, and receipts are checked before and after release. The registered effect drains before terminal cleanup; the acquisition becomes `Withdrawn`, no consumer completion is published, and root custody is released. Importer metadata writes are snapshotted at the seal boundary because auxiliary metadata may already exist. The focused test and affected-package Clippy pass locally; the full HF download module has sandbox-only loopback bind failures, detailed in the ledger. This is a controlled Linux test boundary before hashing, not mid-hash, HTTP cancellation/replay, crash durability, full AC06, AC08, AC15, or AQ-HTTP evidence. All gates remain pending. - -**Recent bounded Q1 evidence — AC06 same-task-key replacement:** Test `same_task_key_cancel_replacement_rejects_stale_acquisition_readiness` in `rust/crates/pumas-core/src/acquisition/service.rs` uses a fixed Worker key, retains its matching operation/context, holds a registered async effect, and installs a CancelFinalizer under that exact key. Readiness fails with stale generation before any seal job; the acquisition row and stage bytes remain unchanged, the partial remains append-openable, no receipt appears, and finalizer entry waits for predecessor drainage. The focused test passed 1/1, the socket-capable service test module passed 27/27, and strict all-target `pumas-library` Clippy passed. The default sandbox run of that module had 10 passes and 17 loopback bind failures (`EPERM`); the same suite passed when rerun with local loopback access. A separate GPT-6.1 Sol High review accepted the source diff after a cited base commit typo was corrected. This is one local Worker→CancelFinalizer case only; queued cancellation, service-level Verifying cancellation, Worker→Worker same-key resume/reuse, successful concurrent handoff, real HF/native behavior and full AC06 remain unqualified. AC06 and all dependency gates remain pending. - -**Recent bounded Q1 evidence — AC06 same-key Worker→Worker reuse:** Test `same_task_key_worker_reuse_rejects_stale_readiness_and_preserves_successor_handoff` finishes and positively observes Worker A, then installs Worker B under the same literal key and demand. A's still-pairwise-matching context/operation is rejected by the current-generation guard before the seal observer; the exact Transferring row, receipt state, bytes, inventory and partial appendability remain unchanged. B hands the original acquisition to receiptless `Using` with one verified `DATA` file. The focused test passed 1/1 on Linux x86_64 through the serialized Cargo wrapper; scoped rustfmt and `git diff --check` passed. Separate GPT-6.1 Sol High exact-diff review found and drove a result-unwrapping correction, both-drain cleanup ordering, and waiting for registered effects before the successor observation; final review found no remaining substantiated issue. This is same-process service evidence after predecessor completion, not public HF resume, active Worker replacement, mid-hash cancellation, process/power-loss recovery, platform acceptance, consumer settlement or full AC06. Keep AC06 and all gates pending. - -**Recent bounded Q1 evidence — AC06 queued HF follower cancellation:** Test `cancelling_queued_follower_preserves_incumbent_that_completes_normally` in `rust/crates/pumas-core/src/model_library/hf/download.rs` uses the real importer with a cached incumbent artifact and an existing metadata-write barrier. A distinct cached follower is durably admitted to the same destination, observed Queued with its own claim, and canceled through the public HF API while the incumbent import is held. The test then releases and completes the incumbent normally, drains the follower, and checks preserved incumbent/unrelated bytes and metadata, no follower demand/output/metadata, released claims/admissions, and zero requests at a bounded local loopback monitor. The focused test passed 1/1, the HF download module passed 180/180 with local loopback access, and strict all-target `pumas-library` Clippy passed with warnings denied. Independent GPT-6.1 Sol High exact-diff review accepted the bounded regression after two monitor/cancellation-oracle fixes; it ran no builds or tests. This is one Linux x86_64 fixture and same-destination wake-up; it does not establish service-level `Verifying` cancellation, all live/durable-demand preservation, crash durability, real-source behavior, platform qualification, or full AC06. AC06 and every dependency gate remain pending. - -**Recent bounded Q1 evidence — AC06 public consumer cancellation during file-set sealing:** Test `host_cancellation_during_file_set_sealing_prevents_consumer_handoff` covers the public `AcquisitionConsumer::acquire_http` path. The implementation checks host cancellation before registering seal work and again after the seal effect drains, before publishing `FilesReady`/`Using`; direct HF/importer callers continue through the unchanged non-host readiness path. With `ControlledHost` canceled while a real registered local verification effect is held, the test observes `DownloadCancelled`, exact unchanged `Transferring`/no-files state, no receipt or prepare/publish callback, unchanged final input bytes, and a test-owned workspace execution lease retained through the barrier and dropped after the operation drains. The focused test passed 1/1; the acquisition service module passed 28/28; the HF download module passed 180/180 with local loopback access; strict all-target `pumas-library` Clippy passed. Independent GPT-6.1 Sol High review accepted the exact diff. The capability-lifetime probe does not prove OS-level exclusion. This covers cancellation requested during one held seal before durable readiness publication; a race after the cancellation check, replay/crash behavior, platforms, real-source acceptance and full AC06 remain open. AC06 and every dependency gate stay pending. - -**Recent bounded Q1 evidence — AC06 public withdrawal isolation:** Test `public_withdrawal_preserves_live_use_and_cold_retained_demand` leaves C receiptless in `Using`, shuts down its original owners, and reopens the store/service on the same disposable root. With B's registered effect holding a file descriptor opened by `AcquiredArtifactUse::open_file(0)` and a read gated through `run_blocking`, public `withdraw_after_cleanup` removes only A's file and withdraws only A's exact row. B's `Using` row/reservation remains live and C's cold exact row, verified bytes and receiptless status remain unchanged. A's scope closes while B is still held; B then reads the verified bytes and settles normally. The focused test passed 1/1, the full acquisition service module passed 29/29 with local loopback access, strict all-target `pumas-library` Clippy passed with warnings denied, and separate GPT-6.1 Sol High exact-diff review accepted the corrected verified-descriptor path. This one same-process A/B/C composition does not prove general eviction, every demand combination, release idempotence, OS-level exclusion, crash durability, real-source behavior, platform/deployment qualification or full AC06. AC06 and all dependency gates remain pending. - -**Next Q1 action:** Validate the PR #34 review repairs, publish the bounded correction milestone, and bind its fresh hosted Build and external review to the exact head. [Build 37141872406](https://github.com/MrScripty/Pumas-Library/actions/runs/37141872406) passed all seven ordinary jobs on `0dd38c707125facfdaae29c82704213e85ceb155` (tree `7611df7a568d56807589bb2dca2bfbb03e484dd0`): workflow/release contracts, frontend/desktop, strict Rust quality, headless without inference, and native Linux/macOS/Windows. This is exact-head supporting AC15 evidence for the checks that ran. Release archives and native model E2E remain unqualified; AQ-HTTP, external review disposition and maintainer integration remain pending. Review repairs after this head require fresh exact-head qualification. Do not merge Q1 or open Q2/Runtime while the applicable gate remains outstanding. +**Owner:** Pumas acquisition integration. The repository owner assigns the +implementation and integration roles when admitting source work. +**Operation:** `verify` this plan for AQ-HTTP; `start` Q2 only after AQ-HTTP is +accepted. Work starts from current `main`; the earlier `work/acquisition-q1-http` +and `work/artifact-acquisition-runtime-plan` branches are no longer the +integration path. ## Objective and scope @@ -404,48 +132,18 @@ Each row is one coherent semantic unit including producer and actual consumers. | Milestone | Goal | Dependencies | Gate / evidence | State | | --- | --- | --- | --- | --- | -| **Q1** | Shared HTTP lifecycle, neutral persistence/handoff, and real HF/native consumer cutover; existing UI outcomes preserved. | Source/retained-state preparation and active recovery-owner handoff. No runtime milestone. | `AQ-HTTP`: AC01–AC10, AC15, AC16, AC18; real HF model import and native archive extraction plus corresponding UI/contract/cancellation/reopen evidence. | In progress; gate not ready | -| **Q2** | Exact wheel-file-set acquisition and local-only consumption in the existing Torch installer. | AQ-HTTP. | `AQ-PACKAGES`: AC11, AC12 and Q1 regression evidence affected by this composition; network-denied installation and actual package identity. | Planned | -| **Q3** | S3-compatible acquisition using the same lifecycle, direct explicit source workflow, tested credentials/version semantics, and a real model import through the existing model-facing operations. | AQ-HTTP. Q2 is the default next serial integration; Q3 can be delegated after shared files stabilize. | `AQ-S3`: AC13, AC14 and source-neutrality regressions; native AWS S3, one non-AWS compatible service, local MinIO, and S3-to-model-library evidence. | Planned | +| **Q1** | Shared HTTP lifecycle, neutral persistence/handoff, and real HF/native consumer cutover; existing UI outcomes preserved. | Source/retained-state preparation and active recovery-owner handoff. No runtime milestone. | `AQ-HTTP`: AC01–AC10, AC15, AC16, AC18; real HF model import and native archive extraction plus corresponding UI/contract/cancellation/reopen evidence. | Implemented (merged, ships in 0.8.0); AQ-HTTP not accepted | +| **Q2** | Exact wheel-file-set acquisition and local-only consumption in the existing Torch installer. | AQ-HTTP. | `AQ-PACKAGES`: AC11, AC12 and Q1 regression evidence affected by this composition; network-denied installation and actual package identity. | Planned; not started | +| **Q3** | S3-compatible acquisition using the same lifecycle, direct explicit source workflow, tested credentials/version semantics, and a real model import through the existing model-facing operations. | AQ-HTTP. (Implemented ahead of Q2 by delegated slices.) | `AQ-S3`: AC13, AC14 and source-neutrality regressions; native AWS S3, one non-AWS compatible service, local MinIO, and S3-to-model-library evidence. | Implemented against controlled HTTPS fixtures (ships behind the `s3` feature in 0.8.0); live AWS/non-AWS/MinIO evidence absent; AQ-S3 not accepted | | **Q4** | Complete affected public/installed/native qualification, migration documentation and removal of superseded authority. | Q1–Q3 implemented. | `AQ-COMPLETE`: all AC01–AC18 satisfied and all four milestones Accepted; packaged/independent-consumer/native-platform evidence in AC17. | Planned | [Dependency gates](reports/dependency-gates.md) is the single gate-status and consumer-handoff record. Every gate is currently **not ready**. A gate opens only after its claims pass for identified material source, supported API and stated target scope; availability is not inferred from a commit label or partial implementation. Material incompatible changes require targeted re-verification of affected gates. Runtime **R1 requires AQ-HTTP**. Runtime **R2 requires AQ-PACKAGES** as well as R1. Runtime use of S3 requires AQ-S3 on the relevant target. S3, Xet, peers or chunk CAS are not secretly prerequisites of HTTP runtime management. The runtime plan does not implement or accept these gates itself. Both plans share one serial integration owner for overlapping files. -### Q1 starting boundary - -First refresh the selected checkout and current standards, preserve unrelated work, and reconcile the active recovery plan. State the supported retained-state population and exact seam between transfer completion and model/native finalization. Add regression evidence before/with changes. Implement a usable end-to-end HF/native path, not only a new trait or DTO. Do not open another generic engine while keeping old HF and native transfer owners active for the same migrated population. - -Bounded investigations belong inside their milestones: verify the current destination grant can support a neutral workspace, identify a real native artifact's accepted integrity evidence, and prove restart handoff with existing store readers. Stop each investigation when the chosen interface can be implemented safely; update the issue record only if its result changes ownership, migration or evidence. - -### Q1 current-checkout reconciliation — 2026-09-29 - -The exact refs, PR/CI state, pre-existing worktrees and untracked work, source-owner trace, supported store formats, review findings and evidence limits are recorded in the [Q1 starting-state report](reports/q1-starting-state.md). That report is read-only source/repository evidence and does not satisfy acceptance claims. The actual deployed retained-state population and older-writer retirement/isolation remain unknown; no live root was read or changed. Q1 may proceed with source work and disposable fixtures, while live-root mutation remains blocked. The original `a8359512…` plan commit is preserved and integrated into the task branch; runtime R1 remains gated by AQ-HTTP. - -A Linux x86_64 regression now passes locally for receiptless native `Using` custody after injected preparation failure and same-process cold owner reconstruction. It supports AC05/AQ-I03 but does not establish hard-process or power-loss recovery, complete orphan output equivalence, deployed migration safety, or AQ-HTTP readiness; see the [execution ledger](execution-ledger.md). - -At the current Q1 boundary, a separate Linux x86_64 subprocess regression also passes after parent-issued SIGKILL at the durable native rename/sync boundary before metadata publication. This adds evidence for that one process-loss window; it does not establish power-loss durability or the remaining AC05 windows. The exact test and source-review evidence are in the [execution ledger](execution-ledger.md). - -A further Linux x86_64 fixture drives the real native installer with a valid publisher-digested archive that contains a README but no server binary. Extraction refuses publication after acquisition; receiptless cold recovery is refused by both direct installer reconciliation and public manager reconstruction, with the controlled source observing no replay and durable/workspace state unchanged after owner drainage. Positive archive publication and the handoff's existing receiptless-native regression also pass after the shared fixture change. This is same-process, disposable-root evidence only; AC05 and AQ-HTTP remain pending. See the [acceptance matrix](reports/acceptance-matrix.md) and [execution ledger](execution-ledger.md). ## Acceptance and verification -**Admitted Q3 interrupted-publication successor (2026-10-05):** The coordinator -assigned the next concrete plan requirement while `e1ee893f` is independently -reviewed. Branch `feat/acquisition-s3-reconcile-e1ee893f` preserves that candidate -and reader PR38 unchanged. This slice addresses the consumer-commit-before- -acquisition-acknowledgement requirement in contract section 9 and bounded AC05 -support: the real copied model publisher binds its exact issued acquisition use, -and a cold consumer may settle only an already confirmed, indexed Ready, -unchanged output without transfer or import replay. Missing, Pending, legacy -unbound, changed and unsupported outputs remain unresolved. Evidence is in -[reconciliation qualification](reports/s3-reconciliation-qualification-2026-10-05.md). -Independent review and exact-head hosted acceptance remain coordinator-owned. -This does not qualify source-facing desktop/RPC composition, multi-file model -selection, credentials, live providers or every interruption boundary. AQ-S3 -remains not ready. - [Acceptance matrix](reports/acceptance-matrix.md) owns criteria, evidence kind, environment, execution mode and named procedures. Every production claim remains pending. Static checks and disposable fixtures support, but do not replace, real transfer, package, desktop, native and deployment evidence. Source review and this package's link checks do not certify code compliance. Composed-design review is **applicable**. [Architecture review](reports/architecture-review.md) answers all eight probes for this design and its runtime consumer, plus the authority-scope and dependency questions. The required simplicity result is reduced caller knowledge: a new source changes a source integration, not runtime installers or model adapters; a new installer consumes existing verified artifacts without learning HTTP/S3 recovery. @@ -454,7 +152,7 @@ Independent read-only review covers durable migration, credential/destination au ## Blockers, re-plan triggers and limits -The local implementation and read-only review fixes are present; focused source tests and formatting pass. AC04 now has partial local evidence that the canonical `downloads.json` readers reject duplicate object member names without changing unrelated JSON readers, and that disposable schema-4/5 and schema-6 fixtures preserve retained partitions, reopen through production readers and refuse unresolved Pending cleanup. Deployed schema-6 population, old-writer isolation, rollback and retained-root evidence remain open. These results do not qualify AC10 resource behavior or satisfy production acceptance. The active recovery ownership and real retained-state population must be reconciled before their mutation; those are bounded admission conditions, not a requirement to finish unrelated remediation. Pending cleanup remains refused. Native/GPU/GUI/network credentials unavailable to an execution session block only the claims requiring them; all final production acceptance still waits for its required evidence. +No source blocker. AQ-HTTP is blocked on evidence, not code: the deployed retained-state population (schema 6/7 libraries, overlapping old writers, rollback) is uninventoried, and AC10 representative resource bounds, AC16 public-client compatibility and AC17 platform/deployment qualification have no current-head evidence. Schema-7 conversion stays explicit and offline ([library upgrade](../../library-upgrade.md)); Pending cleanup remains refused. AQ-S3 is blocked on live AWS S3, one non-AWS compatible service and local MinIO environments, which have not been supplied ([provider record](reports/s3-composed-provider-qualification-2026-10-05.md)). Missing native/GPU/GUI/network credentials block only the claims that require them. Re-plan when a new consumer changes authority, the proposed state store cannot preserve supported recovery, a file lease cannot survive required worker cleanup, a source cannot establish required identity, an S3 dependency cannot provide the selected API/target, or downstream semantics leak into acquisition. Adding a file within an already admitted owner only amends its concrete write set. @@ -462,6 +160,6 @@ Authorized planning does not authorize deleting user files, publishing releases, ## Linked records and terminal documentation -[Ledger](execution-ledger.md) · [Issues](issues.md) · [Audit](reports/codebase-audit.md) · [Architecture](reports/architecture-review.md) · [Acceptance](reports/acceptance-matrix.md) · [Write sets](reports/write-sets.md) · [Dependency gates](reports/dependency-gates.md) · [Standards/source review](reports/standards-and-sources.md) · [Coding-Standards MCP usability](reports/coding-standards-mcp-usability.md) · [Companion runtime plan](../runtime-installations-and-model-adapters/plan.md). +[Ledger](execution-ledger.md) · [Issues](issues.md) · [Audit](reports/codebase-audit.md) · [Architecture](reports/architecture-review.md) · [Acceptance](reports/acceptance-matrix.md) · [Write sets](reports/write-sets.md) · [Dependency gates](reports/dependency-gates.md) · [Standards/source review](reports/standards-and-sources.md) · [Companion runtime plan](../runtime-installations-and-model-adapters/plan.md). -On adoption, link this plan from the source brief and add the bounded ownership disposition to the active Rust/library recovery and upstream-runtime plans. Do not create another master execution plan. The shared contract remains marked proposed until implemented; update it in the same slices. At acceptance, move durable decisions to current owner documentation/ADR as required, and follow Pumas's documented terminal-plan lifecycle rather than retain duplicate active instructions. Git and the delivered older packages preserve history. +Do not create another master execution plan. The shared contract owns implemented behavior; update it in the same slices. At acceptance, move durable decisions to current owner documentation/ADR as required, and follow Pumas's documented terminal-plan lifecycle rather than retain duplicate active instructions. Git and the delivered older packages preserve history. diff --git a/docs/plans/artifact-acquisition/reports/ac10-public-hf-2026-10-06/command-logs.tar.gz b/docs/plans/artifact-acquisition/reports/ac10-public-hf-2026-10-06/command-logs.tar.gz deleted file mode 100644 index 5498344e2..000000000 Binary files a/docs/plans/artifact-acquisition/reports/ac10-public-hf-2026-10-06/command-logs.tar.gz and /dev/null differ diff --git a/docs/plans/artifact-acquisition/reports/ac10-public-hf-2026-10-06/evidence.json b/docs/plans/artifact-acquisition/reports/ac10-public-hf-2026-10-06/evidence.json deleted file mode 100644 index 8f39ff1a9..000000000 --- a/docs/plans/artifact-acquisition/reports/ac10-public-hf-2026-10-06/evidence.json +++ /dev/null @@ -1,878 +0,0 @@ -{ - "provenance": { - "base": "722245514b3bae42511aa5ea188570292ce276d4", - "base_tree": "14e8a1b36b580f2397264dd38b18329ec07bc75e", - "admission": "d3d93f8b5da09f7d71c96631aab141c6bae9fb6c", - "source_blob": "855fe4272889d7518d572461160b35a02a299d23", - "source_sha256": "6d6f4bf94d43a3095e81cb853dd9738687c0ccc7d2f35f4871911d9fe3299bce", - "branch": "qualification/ac10-public-hf-72224551", - "build_settings": { - "CARGO_BUILD_JOBS": "1", - "CARGO_INCREMENTAL": "0", - "CARGO_PROFILE_DEV_DEBUG": "0", - "CARGO_PROFILE_TEST_DEBUG": "0", - "CARGO_TARGET_DIR": "/workspace/Pumas-Library/rust/target" - }, - "kernel": "Linux 6.18.44 x86_64 GNU/Linux", - "workspace_available_bytes_after_cache_cleanup": 1837703168, - "command": "/tmp/pumas-cargo-admission/run-cargo-serialized test --offline --manifest-path rust/Cargo.toml --locked -p pumas-library --lib [--no-default-features] public_hf_large_transfer_preserves_file_identity_and_records_resource_usage -- --ignored --nocapture --test-threads=1", - "resumed_after_pr42_evidence": "91db604ae301500d003b0ecbd76287426d86aeed", - "transfer_deadline_definition": "300s through actual verified handoff/marker removal; then unchanged30s importerentry", - "versions": { - "rustc": "1.92.0 (ded5c06cf 2025-12-08)", - "cargo": "1.92.0 (344c4567c 2025-10-21)" - }, - "default_exit": 0, - "workspace_headroom_sample": { - "available_bytes": 967688192, - "utc": "2026-10-06T08:34:44.149473+00:00", - "phase": "no-default compilation" - }, - "source_head": "8a147160c2b3743c549e00a89b1e48f54d7a2390", - "source_tree": "9544e16dde7802baa2033bf7ceea7d44c2ba3767", - "pr42_owned_dependency_cache_restored": { - "utc": "2026-10-06T08:42:48.208852+00:00", - "restored": [ - { - "from": "/tmp/pr42-build-cache/node_modules", - "to": "/workspace/Pumas-Library-pr42-desktop-contract/node_modules" - }, - { - "from": "/tmp/pr42-build-cache/electron/node_modules", - "to": "/workspace/Pumas-Library-pr42-desktop-contract/electron/node_modules" - }, - { - "from": "/tmp/pr42-build-cache/frontend/node_modules", - "to": "/workspace/Pumas-Library-pr42-desktop-contract/frontend/node_modules" - } - ], - "available_bytes_before": 660766720, - "available_bytes_after": 249712640, - "active_cargo_rustc_clippy": false - } - }, - "commands": { - "cwd": "/workspace/Pumas-Library-s3-installed-prefix-main95", - "commands": [ - { - "name": "default-measurement", - "command": "CARGO_PROFILE_DEV_DEBUG=0 CARGO_PROFILE_TEST_DEBUG=0 /tmp/pumas-cargo-admission/run-cargo-serialized test --offline --manifest-path rust/Cargo.toml --locked -p pumas-library --lib public_hf_large_transfer_preserves_file_identity_and_records_resource_usage -- --ignored --nocapture --test-threads=1", - "log": "default.log", - "exit": 0 - }, - { - "name": "no-default-measurement", - "command": "CARGO_PROFILE_DEV_DEBUG=0 CARGO_PROFILE_TEST_DEBUG=0 /tmp/pumas-cargo-admission/run-cargo-serialized test --offline --manifest-path rust/Cargo.toml --locked -p pumas-library --lib --no-default-features public_hf_large_transfer_preserves_file_identity_and_records_resource_usage -- --ignored --nocapture --test-threads=1", - "log": "no-default.log", - "exit": 0 - }, - { - "name": "scoped-rustfmt", - "command": "source /workspace/.pumas-tools/env.sh; rustfmt --edition 2021 --check rust/crates/pumas-core/src/api/hf.rs", - "log": "rustfmt-initial.log", - "exit": 0 - }, - { - "name": "default-clippy", - "argv": [ - "/tmp/pumas-cargo-admission/run-cargo-serialized", - "clippy", - "--offline", - "--manifest-path", - "rust/Cargo.toml", - "--locked", - "-p", - "pumas-library", - "--all-targets", - "--", - "-D", - "warnings" - ], - "environment_overrides": { - "CARGO_PROFILE_DEV_DEBUG": "0", - "CARGO_PROFILE_TEST_DEBUG": "0" - }, - "log": "default-clippy.log", - "exit": 0 - }, - { - "name": "default-mixed-size-control", - "argv": [ - "/tmp/pumas-cargo-admission/run-cargo-serialized", - "test", - "--offline", - "--manifest-path", - "rust/Cargo.toml", - "--locked", - "-p", - "pumas-library", - "--lib", - "public_hf_status_poll_tracks_mixed_size_download_through_receipt_settlement", - "--", - "--nocapture", - "--test-threads=1" - ], - "environment_overrides": { - "CARGO_PROFILE_DEV_DEBUG": "0", - "CARGO_PROFILE_TEST_DEBUG": "0" - }, - "log": "default-mixed-size-control.log", - "exit": 0 - }, - { - "name": "no-default-clippy", - "argv": [ - "/tmp/pumas-cargo-admission/run-cargo-serialized", - "clippy", - "--offline", - "--manifest-path", - "rust/Cargo.toml", - "--locked", - "-p", - "pumas-library", - "--all-targets", - "--no-default-features", - "--", - "-D", - "warnings" - ], - "environment_overrides": { - "CARGO_PROFILE_DEV_DEBUG": "0", - "CARGO_PROFILE_TEST_DEBUG": "0" - }, - "log": "no-default-clippy.log", - "exit": 0 - }, - { - "name": "no-default-mixed-size-control", - "argv": [ - "/tmp/pumas-cargo-admission/run-cargo-serialized", - "test", - "--offline", - "--manifest-path", - "rust/Cargo.toml", - "--locked", - "-p", - "pumas-library", - "--lib", - "--no-default-features", - "public_hf_status_poll_tracks_mixed_size_download_through_receipt_settlement", - "--", - "--nocapture", - "--test-threads=1" - ], - "environment_overrides": { - "CARGO_PROFILE_DEV_DEBUG": "0", - "CARGO_PROFILE_TEST_DEBUG": "0" - }, - "log": "no-default-mixed-size-control.log", - "exit": 0 - }, - { - "name": "source-diff-check", - "command": "git diff --check", - "log": "diff-check.log", - "exit": 0 - } - ] - }, - "reviews": { - "source_blob": "855fe4272889d7518d572461160b35a02a299d23", - "admission": "d3d93f8b5da09f7d71c96631aab141c6bae9fb6c", - "spec": { - "agent": "/root/q4_next_scope", - "result": "ACK; no new concrete finding; same300s phase verified handoff before unchanged30s importer-entry; all gates pending" - }, - "standards": { - "agent": "/root/installed_harness_audit", - "result": "ACK; no remaining concrete standards/lifecycle finding; reversing timing delta exactly reproduces prior reviewed c092b47d7088f54a62da53c3774578c437f53b05" - }, - "scope": "Read-only independent source review, no builds or gate acceptance" - }, - "measurements": { - "default": { - "acquisition_id": "f546deac-cbb3-47bc-bd28-dd627d85acab", - "after_settlement": { - "allocated_bytes": 536875008, - "dev": 27, - "inode": 145253, - "logical_bytes": 536870912 - }, - "artifact_relative_path": "shared-resources/models/llm/acme/acme--model__weights_gguf__a876ce07cf93__revision_0123456789abcdef0123456789abcdef01234567/weights.gguf", - "at_import": { - "allocated_bytes": 536875008, - "dev": 27, - "inode": 145253, - "logical_bytes": 536870912 - }, - "buffer_bytes": 65536, - "cancellation": null, - "changed_baseline_files": [ - { - "after": { - "allocated_bytes": 163840, - "dev": 27, - "inode": 145251, - "logical_bytes": 160712, - "paths": [ - "shared-resources/models/models.db-wal" - ] - }, - "before": { - "allocated_bytes": 0, - "dev": 27, - "inode": 145251, - "logical_bytes": 0, - "paths": [ - "shared-resources/models/models.db-wal" - ] - } - } - ], - "configured_capacity": { - "blocking": 16, - "rescue_blocking": 4, - "rescue_workers": 32, - "scopes": 256, - "workers": 32 - }, - "download_id": "b791ba5c-d485-4525-9f62-43a0a54e713e", - "filesystem": { - "mount": "/workspace", - "type": "overlay" - }, - "inventory_after": [ - { - "allocated_bytes": 163840, - "dev": 27, - "inode": 145251, - "logical_bytes": 160712, - "paths": [ - "shared-resources/models/models.db-wal" - ] - }, - { - "allocated_bytes": 0, - "dev": 27, - "inode": 145252, - "logical_bytes": 0, - "paths": [ - "state/.downloads.lock" - ] - }, - { - "allocated_bytes": 536875008, - "dev": 27, - "inode": 145253, - "logical_bytes": 536870912, - "paths": [ - "shared-resources/models/llm/acme/acme--model__weights_gguf__a876ce07cf93__revision_0123456789abcdef0123456789abcdef01234567/weights.gguf" - ] - }, - { - "allocated_bytes": 4096, - "dev": 27, - "inode": 146784, - "logical_bytes": 23, - "paths": [ - "authored-sentinel.txt" - ] - }, - { - "allocated_bytes": 32768, - "dev": 27, - "inode": 146786, - "logical_bytes": 32768, - "paths": [ - "shared-resources/models/models.db-shm" - ] - }, - { - "allocated_bytes": 8192, - "dev": 27, - "inode": 146806, - "logical_bytes": 5031, - "paths": [ - "state/downloads.json" - ] - }, - { - "allocated_bytes": 249856, - "dev": 27, - "inode": 146817, - "logical_bytes": 249856, - "paths": [ - "shared-resources/models/models.db" - ] - }, - { - "allocated_bytes": 0, - "dev": 27, - "inode": 146833, - "logical_bytes": 0, - "paths": [ - "shared-resources/models/.pumas-library-id.lock" - ] - }, - { - "allocated_bytes": 4096, - "dev": 27, - "inode": 146849, - "logical_bytes": 81, - "paths": [ - "shared-resources/models/.pumas-library-id.json" - ] - }, - { - "allocated_bytes": 4096, - "dev": 27, - "inode": 146850, - "logical_bytes": 329, - "paths": [ - "cache/hf_acme_model@0123456789abcdef0123456789abcdef01234567_files.json" - ] - }, - { - "allocated_bytes": 8192, - "dev": 27, - "inode": 146881, - "logical_bytes": 5025, - "paths": [ - "shared-resources/models/llm/acme/acme--model__weights_gguf__a876ce07cf93__revision_0123456789abcdef0123456789abcdef01234567/metadata.json" - ] - } - ], - "inventory_before": [ - { - "allocated_bytes": 0, - "dev": 27, - "inode": 145251, - "logical_bytes": 0, - "paths": [ - "shared-resources/models/models.db-wal" - ] - }, - { - "allocated_bytes": 4096, - "dev": 27, - "inode": 146784, - "logical_bytes": 23, - "paths": [ - "authored-sentinel.txt" - ] - }, - { - "allocated_bytes": 32768, - "dev": 27, - "inode": 146786, - "logical_bytes": 32768, - "paths": [ - "shared-resources/models/models.db-shm" - ] - }, - { - "allocated_bytes": 249856, - "dev": 27, - "inode": 146817, - "logical_bytes": 249856, - "paths": [ - "shared-resources/models/models.db" - ] - }, - { - "allocated_bytes": 0, - "dev": 27, - "inode": 146833, - "logical_bytes": 0, - "paths": [ - "shared-resources/models/.pumas-library-id.lock" - ] - }, - { - "allocated_bytes": 4096, - "dev": 27, - "inode": 146849, - "logical_bytes": 81, - "paths": [ - "shared-resources/models/.pumas-library-id.json" - ] - } - ], - "inventory_outcome": { - "Ok": null - }, - "io_after_promotion_before_final_hash_bytes": { - "rchar": 2687343488, - "read_bytes": 0, - "wchar": 537960551, - "write_bytes": 538148864 - }, - "io_first_chunk_bytes": { - "rchar": 2377968, - "read_bytes": 0, - "wchar": 993072, - "write_bytes": 1314816 - }, - "memory_at_import_kb": { - "VmHWM": 99864, - "VmRSS": 99004 - }, - "memory_before_kb": { - "VmHWM": 56140, - "VmRSS": 56140 - }, - "model_id": "llm/acme/acme--model__weights_gguf__a876ce07cf93__revision_0123456789abcdef0123456789abcdef01234567", - "other_new_files_allocated_bytes": 20480, - "other_new_files_logical_bytes": 10385, - "outcome": { - "Ok": null - }, - "partial": { - "allocated_bytes": 65536, - "dev": 27, - "inode": 145253, - "logical_bytes": 65536 - }, - "payload_bytes": 536870912, - "sha256": "cf4ca2aa6340e8946b852787296e6e2555ba9675d64ebedd795c14ad71996be3", - "shutdown_attempts": [ - "Ok(Ok(()))" - ], - "source_outcome": { - "Ok": null - }, - "source_payload_bytes": 536870912, - "source_requests": [ - "GET /api/models/acme/model/revision/main HTTP/1.1", - "GET /api/models/acme/model/revision/0123456789abcdef0123456789abcdef01234567 HTTP/1.1", - "GET /api/models/acme/model/tree/0123456789abcdef0123456789abcdef01234567?recursive=true HTTP/1.1", - "GET /acme/model/resolve/0123456789abcdef0123456789abcdef01234567/weights.gguf HTTP/1.1" - ], - "transfer_release_to_import_hold_ms": 60268, - "wall_elapsed_ms": 79265 - }, - "no-default": { - "acquisition_id": "0824e245-5387-45e6-b5c6-e62c0ddfdf8e", - "after_settlement": { - "allocated_bytes": 536875008, - "dev": 27, - "inode": 146789, - "logical_bytes": 536870912 - }, - "artifact_relative_path": "shared-resources/models/llm/acme/acme--model__weights_gguf__a876ce07cf93__revision_0123456789abcdef0123456789abcdef01234567/weights.gguf", - "at_import": { - "allocated_bytes": 536875008, - "dev": 27, - "inode": 146789, - "logical_bytes": 536870912 - }, - "buffer_bytes": 65536, - "cancellation": null, - "changed_baseline_files": [ - { - "after": { - "allocated_bytes": 163840, - "dev": 27, - "inode": 145242, - "logical_bytes": 160712, - "paths": [ - "shared-resources/models/models.db-wal" - ] - }, - "before": { - "allocated_bytes": 0, - "dev": 27, - "inode": 145242, - "logical_bytes": 0, - "paths": [ - "shared-resources/models/models.db-wal" - ] - } - } - ], - "configured_capacity": { - "blocking": 16, - "rescue_blocking": 4, - "rescue_workers": 32, - "scopes": 256, - "workers": 32 - }, - "download_id": "bb573653-f1b0-400b-a05f-ef5aabf50432", - "filesystem": { - "mount": "/workspace", - "type": "overlay" - }, - "inventory_after": [ - { - "allocated_bytes": 4096, - "dev": 27, - "inode": 145238, - "logical_bytes": 23, - "paths": [ - "authored-sentinel.txt" - ] - }, - { - "allocated_bytes": 249856, - "dev": 27, - "inode": 145241, - "logical_bytes": 249856, - "paths": [ - "shared-resources/models/models.db" - ] - }, - { - "allocated_bytes": 163840, - "dev": 27, - "inode": 145242, - "logical_bytes": 160712, - "paths": [ - "shared-resources/models/models.db-wal" - ] - }, - { - "allocated_bytes": 32768, - "dev": 27, - "inode": 145243, - "logical_bytes": 32768, - "paths": [ - "shared-resources/models/models.db-shm" - ] - }, - { - "allocated_bytes": 0, - "dev": 27, - "inode": 145245, - "logical_bytes": 0, - "paths": [ - "shared-resources/models/.pumas-library-id.lock" - ] - }, - { - "allocated_bytes": 4096, - "dev": 27, - "inode": 145246, - "logical_bytes": 81, - "paths": [ - "shared-resources/models/.pumas-library-id.json" - ] - }, - { - "allocated_bytes": 4096, - "dev": 27, - "inode": 145248, - "logical_bytes": 329, - "paths": [ - "cache/hf_acme_model@0123456789abcdef0123456789abcdef01234567_files.json" - ] - }, - { - "allocated_bytes": 0, - "dev": 27, - "inode": 145250, - "logical_bytes": 0, - "paths": [ - "state/.downloads.lock" - ] - }, - { - "allocated_bytes": 8192, - "dev": 27, - "inode": 146788, - "logical_bytes": 5031, - "paths": [ - "state/downloads.json" - ] - }, - { - "allocated_bytes": 536875008, - "dev": 27, - "inode": 146789, - "logical_bytes": 536870912, - "paths": [ - "shared-resources/models/llm/acme/acme--model__weights_gguf__a876ce07cf93__revision_0123456789abcdef0123456789abcdef01234567/weights.gguf" - ] - }, - { - "allocated_bytes": 8192, - "dev": 27, - "inode": 146790, - "logical_bytes": 5025, - "paths": [ - "shared-resources/models/llm/acme/acme--model__weights_gguf__a876ce07cf93__revision_0123456789abcdef0123456789abcdef01234567/metadata.json" - ] - } - ], - "inventory_before": [ - { - "allocated_bytes": 4096, - "dev": 27, - "inode": 145238, - "logical_bytes": 23, - "paths": [ - "authored-sentinel.txt" - ] - }, - { - "allocated_bytes": 249856, - "dev": 27, - "inode": 145241, - "logical_bytes": 249856, - "paths": [ - "shared-resources/models/models.db" - ] - }, - { - "allocated_bytes": 0, - "dev": 27, - "inode": 145242, - "logical_bytes": 0, - "paths": [ - "shared-resources/models/models.db-wal" - ] - }, - { - "allocated_bytes": 32768, - "dev": 27, - "inode": 145243, - "logical_bytes": 32768, - "paths": [ - "shared-resources/models/models.db-shm" - ] - }, - { - "allocated_bytes": 0, - "dev": 27, - "inode": 145245, - "logical_bytes": 0, - "paths": [ - "shared-resources/models/.pumas-library-id.lock" - ] - }, - { - "allocated_bytes": 4096, - "dev": 27, - "inode": 145246, - "logical_bytes": 81, - "paths": [ - "shared-resources/models/.pumas-library-id.json" - ] - } - ], - "inventory_outcome": { - "Ok": null - }, - "io_after_promotion_before_final_hash_bytes": { - "rchar": 2687360174, - "read_bytes": 0, - "wchar": 537936687, - "write_bytes": 538173440 - }, - "io_first_chunk_bytes": { - "rchar": 2377968, - "read_bytes": 0, - "wchar": 993072, - "write_bytes": 1310720 - }, - "memory_at_import_kb": { - "VmHWM": 96868, - "VmRSS": 96536 - }, - "memory_before_kb": { - "VmHWM": 54872, - "VmRSS": 54872 - }, - "model_id": "llm/acme/acme--model__weights_gguf__a876ce07cf93__revision_0123456789abcdef0123456789abcdef01234567", - "other_new_files_allocated_bytes": 20480, - "other_new_files_logical_bytes": 10385, - "outcome": { - "Ok": null - }, - "partial": { - "allocated_bytes": 65536, - "dev": 27, - "inode": 146789, - "logical_bytes": 65536 - }, - "payload_bytes": 536870912, - "sha256": "cf4ca2aa6340e8946b852787296e6e2555ba9675d64ebedd795c14ad71996be3", - "shutdown_attempts": [ - "Ok(Ok(()))" - ], - "source_outcome": { - "Ok": null - }, - "source_payload_bytes": 536870912, - "source_requests": [ - "GET /api/models/acme/model/revision/main HTTP/1.1", - "GET /api/models/acme/model/revision/0123456789abcdef0123456789abcdef01234567 HTTP/1.1", - "GET /api/models/acme/model/tree/0123456789abcdef0123456789abcdef01234567?recursive=true HTTP/1.1", - "GET /acme/model/resolve/0123456789abcdef0123456789abcdef01234567/weights.gguf HTTP/1.1" - ], - "transfer_release_to_import_hold_ms": 62240, - "wall_elapsed_ms": 81782 - } - }, - "archive": { - "path": "command-logs.tar.gz", - "bytes": 16821, - "sha256": "9e1bf5e60f1c84b37d95f3f9d6a338ead534f6dd72b28e86e67540a2839e64c2", - "members": [ - { - "name": "debug0-core-interrupted-before-fixture.log", - "bytes": 111, - "sha256": "e87d5468e1301e2bafce235a4b3ebda53b334542c71702a82b09e3eb44b86043" - }, - { - "name": "debug0-dependencies-interrupted-before-fixture.log", - "bytes": 283, - "sha256": "678fc0d8e520895edfe929908b65cd67c26f5851a335429f26a9f568af7bdd6e" - }, - { - "name": "default-clippy.log", - "bytes": 344, - "sha256": "780a32c77eab59dd58ddf9119d093a3968c490c00dcca86539fcc990b389df90" - }, - { - "name": "default-compile-error.log", - "bytes": 5576, - "sha256": "b57695f7c9cb9cb79fd52a7346b992acafca188edee920cd9182ac30535e0d57" - }, - { - "name": "default-interrupted-before-fixture.log", - "bytes": 111, - "sha256": "e87d5468e1301e2bafce235a4b3ebda53b334542c71702a82b09e3eb44b86043" - }, - { - "name": "default-mixed-size-control.log", - "bytes": 395, - "sha256": "2d745538fd7d838cb3704962a3a257de385ea9c20c676c3e5b6ebb8cb743f540" - }, - { - "name": "default-premature-import-deadline.log", - "bytes": 4886, - "sha256": "c58215f163218d5e625dc31a13ab26038e54513e389f60693fddd7ab57a5e893" - }, - { - "name": "default.log", - "bytes": 5011, - "sha256": "84ce33c6eeea9cdd1c06b8bd8e19b0a35c4e725f18c896ff80bc4167b0e7f6de" - }, - { - "name": "diff-check.log", - "bytes": 0, - "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" - }, - { - "name": "headroom-samples.json", - "bytes": 86, - "sha256": "081db49b98d3a531dd43b808e014bfc662a7c0751365bd3998aebca21cf4c37f" - }, - { - "name": "identity-resolution.json", - "bytes": 4449, - "sha256": "fb19c87818e07803906969111218814b544a1025bb25e2ddcad3dc4df091a3e0" - }, - { - "name": "no-default-clippy.log", - "bytes": 202, - "sha256": "f29cdf7dc2056b109a1244c2e496067011bdb4c7330cc48d7c8a74ff4fbe656d" - }, - { - "name": "no-default-mixed-size-control.log", - "bytes": 395, - "sha256": "c440c2d9308eb86168bd0e905d3e8cea9db7cfca1c6b0a72428cf63c55a710df" - }, - { - "name": "no-default.log", - "bytes": 5069, - "sha256": "541828a4abea1b506b4f09b5d0cef763d05c2a7549dc78bc1d6a599921279e1f" - }, - { - "name": "paused-for-pr42.json", - "bytes": 372, - "sha256": "842d19a1b146b6b80eaace32c95dfbe537891eb1fa9398016fd575c0a770ad43" - }, - { - "name": "preserved-work-in-progress.patch", - "bytes": 34469, - "sha256": "6799be231b06b02ae96e1a0482d052cd3a900f7ae9e56aa4bd2ec6dc8503e1fd" - }, - { - "name": "removed-inactive-core-rlibs.json", - "bytes": 1086, - "sha256": "bdc02b9541eb998d846d2567a1b925c6d02a5bcb67150b6aa134ab6b65c83005" - }, - { - "name": "removed-inactive-test-binaries.json", - "bytes": 1043, - "sha256": "d0b5087434925b323c733f07fadb7b9c2b007112a86fa9eea2f101980a00b6ec" - }, - { - "name": "removed-interrupted-core-objects.json", - "bytes": 2009, - "sha256": "da1d05a097665d6401991061031c3a579990a3905d4a6fb0aa01f29afd48e287" - }, - { - "name": "resource-stop.json", - "bytes": 72, - "sha256": "0153e54cde9fea61e4635c3365367d8f48da2ae971142bddad038f019df564d1" - }, - { - "name": "resumption-cache-headroom.json", - "bytes": 2349, - "sha256": "63ffd10a4b54d08fc23dff6486396cf1c5d1900d95fe5718676dce4b21d1b27b" - }, - { - "name": "run-cargo-serialized", - "bytes": 235, - "sha256": "42c3338ccaa7ea1d34f0a7a9b3f8e8fb0551a6f40b8aaeee9afda1359d690730" - }, - { - "name": "run-supporting-checks.py", - "bytes": 1347, - "sha256": "f322fdb6c63583b1a539e19f85a3f7677bde40246929a20cf7af14700f4632b6" - }, - { - "name": "rustfmt-initial.log", - "bytes": 0, - "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" - }, - { - "name": "source-identity-after-commit.txt", - "bytes": 317, - "sha256": "5bea9e90b996c11d229f8751829d89604bc711e164735f53e5fad41a91fdd4d2" - }, - { - "name": "source-identity-before-commit.txt", - "bytes": 124, - "sha256": "3ea55b64a84942e7be631b756d817bd332ecd0ae41ef61a9a57d99d95a5c1a61" - }, - { - "name": "pr42-cache-restored.json", - "bytes": 636, - "sha256": "f271bcf396601dc3ee06828f4af91791cfcccde778cb40cf713e903a282a19f8" - } - ] - }, - "historical_failures": [ - { - "log": "default-compile-error.log", - "kind": "UUID Serialize compile error, repaired before measurements" - }, - { - "log": "default-premature-import-deadline.log", - "source_blob": "c092b47d7088f54a62da53c3774578c437f53b05", - "kind": "30s importer-entry wait began before verification/handoff; not qualified" - }, - { - "logs": [ - "debug0-core-interrupted-before-fixture.log", - "debug0-dependencies-interrupted-before-fixture.log", - "default-interrupted-before-fixture.log" - ], - "kind": "Interrupted builds under disk guards/PR42 priority; not qualification" - } - ], - "scope": "One synthetic Linux public-core HF managed transfer/importer workload. All acceptance gates pending. No public API or production changes." -} diff --git a/docs/plans/artifact-acquisition/reports/ac10-public-hf-measurement-2026-10-06.md b/docs/plans/artifact-acquisition/reports/ac10-public-hf-measurement-2026-10-06.md deleted file mode 100644 index 06603d533..000000000 --- a/docs/plans/artifact-acquisition/reports/ac10-public-hf-measurement-2026-10-06.md +++ /dev/null @@ -1,68 +0,0 @@ -# AC10 public HF importer measurement — 2026-10-06 - -The Linux-only ignored `public_hf_large_transfer_preserves_file_identity_and_records_resource_usage` regression streams a synthetic 512 MiB GGUF-shaped object through public core HF admission, the existing acquisition owner, the real model importer and receipt-backed settlement. It adds no production hook, dependency or public API. Default and no-default runs use separate fresh processes, a workspace `overlay` filesystem and a fixed 64 KiB source/hash buffer. - -## Provenance and commands - -Base: `722245514b3bae42511aa5ea188570292ce276d4`, tree `14e8a1b36b580f2397264dd38b18329ec07bc75e`. Admission: `d3d93f8b5da09f7d71c96631aab141c6bae9fb6c`. Source: `8a147160c2b3743c549e00a89b1e48f54d7a2390`, tree `9544e16dde7802baa2033bf7ceea7d44c2ba3767`; `api/hf.rs` blob `855fe4272889d7518d572461160b35a02a299d23`, SHA-256 `6d6f4bf94d43a3095e81cb853dd9738687c0ccc7d2f35f4871911d9fe3299bce`. Branch: `qualification/ac10-public-hf-72224551`. Independent specification and standards reviews accepted this exact blob; their source-only ACKs do not accept a dependency gate. - -Rust/Cargo 1.92.0, Linux 6.18.44 x86_64. All Cargo commands use the retained serialized wrapper, `--offline --locked`, one job, incremental disabled, shared target `/workspace/Pumas-Library/rust/target`, and explicit `CARGO_PROFILE_DEV_DEBUG=0 CARGO_PROFILE_TEST_DEBUG=0`. These settings are part of the measurements, including process RSS. The repository-local author/committer identity is the owner-selected MrScripty identity, verified before and after each commit. - -```sh -CARGO_PROFILE_DEV_DEBUG=0 CARGO_PROFILE_TEST_DEBUG=0 \ - /tmp/pumas-cargo-admission/run-cargo-serialized test --offline \ - --manifest-path rust/Cargo.toml --locked -p pumas-library --lib \ - public_hf_large_transfer_preserves_file_identity_and_records_resource_usage \ - -- --ignored --nocapture --test-threads=1 -# Repeat in a separate process with --no-default-features before the test filter. -``` - -The checked-in [evidence](ac10-public-hf-2026-10-06/evidence.json) binds exact commands, exits, versions, source, JSON metrics and SHA-256 hashes of retained raw logs. The archive preserves diagnostic bytes, including failed attempts. It contains no collected environment values or credential material. Original scratch evidence remains under `/workspace/scratch/ac10-public-hf/`. - -## Supporting validation - -Both opt-in measurements and the existing public mixed-size status/import-settlement control pass 1/1 in each feature mode. Strict all-target `pumas-library` Clippy passes with warnings denied in default and no-default configurations. Scoped rustfmt and Git diff checks pass. Exact argv, exits and raw logs are bound in the evidence JSON. This scoped check set does not replace hosted current-head qualification. - -## Measurements - -| Observation | Default | No default features | -| --- | ---: | ---: | -| Wall time (ms) | 79,265 | 81,782 | -| Stream release to importer hold (ms) | 60,268 | 62,240 | -| Other new logical bytes | 10,385 | 10,385 | -| Other new allocated bytes | 20,480 | 20,480 | -| Before VmRSS (kB) | 56,140 | 54,872 | -| Before VmHWM (kB) | 56,140 | 54,872 | -| Importer hold VmRSS (kB) | 99,004 | 96,536 | -| Importer hold VmHWM (kB) | 99,864 | 96,868 | -| First chunk rchar (bytes) | 2,377,968 | 2,377,968 | -| First chunk wchar (bytes) | 993,072 | 993,072 | -| First chunk read_bytes (bytes) | 0 | 0 | -| First chunk write_bytes (bytes) | 1,314,816 | 1,310,720 | -| After promotion rchar (bytes) | 2,687,343,488 | 2,687,360,174 | -| After promotion wchar (bytes) | 537,960,551 | 537,936,687 | -| After promotion read_bytes (bytes) | 0 | 0 | -| After promotion write_bytes (bytes) | 538,148,864 | 538,173,440 | - - -Each run observed exactly four expected pinned HF metadata/tree/object requests and 536,870,912 payload bytes. The first public progress hold corresponded to a physical 65,536-byte regular `.part` file. That device/inode remained identical at the real importer metadata-write hold and after settlement. The final 536,870,912-byte file occupied 536,875,008 allocated bytes. At the importer hold, public status remained `Downloading` with full bytes, exact selected/model identity, `Using` custody, retained queue admission and no completion receipt. After release, repeated public `Completed`, metadata/index publication, `Adopted` custody, settled admission and a receipt bound to the exact acquisition/lease/demand/manifest/workspace/files were required. Independent final hashing matched source and receipt SHA-256 `cf4ca2aa6340e8946b852787296e6e2555ba9675d64ebedd795c14ad71996be3`. - -Full-root regular-file inventories before start and after settlement deduplicate device/inode without following symlinks, report changed baseline files and reject any other artifact-sized file, including a grown baseline file. The model has exactly its expected path and no retained alias; its final no-follow regular-file identity is rechecked. Other new files and the changed DB WAL are separately recorded. The authored sentinel remains intact. Source task drainage and owner shutdown succeeded. - -## Interpretation and limitations - -`VmRSS` and `VmHWM` are raw Linux kB samples before start and at the importer hold. `VmHWM` is a process-lifetime maximum, not a resettable transfer peak; its difference is not transfer-only peak RAM. `/proc/self/io` records raw `rchar`, `wchar`, `read_bytes` and `write_bytes` at the first-chunk hold and after promotion before independent final hashing. Counters include both source server and downloader in this process. Kernel block accounting does not establish physical-media writes; zero `read_bytes` does not mean no logical reads. The inventory establishes retained files at its snapshots; it cannot exclude transient removed copies, page-cache memory or reflink/shared extents. Counts are configured capacity, not a measured concurrency envelope. - -This fixture uses the existing public-core recovery fixture without watcher, IPC, global registry or background connectivity. It exercises the real managed HF transfer/importer workflow, not the installed backend resource envelope, Electron, inference or an actual provider. One synthetic Linux workload does not qualify concurrent limits, copying fallback, other filesystems/platforms, deployed durability, HTTP fault behavior or full AC10/AQ-HTTP. - -Start is bounded to 60 s, source accepts to 15 s, initial progress to 30 s, transfer/verification/handoff to 300 s, importer entry/release to 30 s, cancellation to 15 s, terminal settlement to 60 s, owner shutdown to at most two 30 s attempts and source join to 15 s. Finite getters use 30 s and final hashing cooperates between chunks under 60 s. Individual synchronous filesystem syscalls cannot be preempted by these async deadlines. Every post-start failure releases both gates, attempts cancellation and owner drainage, then signals/joins or aborts/awaits the source before assertions; undrained roots are retained. - -## Failed attempts and resource guards - -The first compiled fixture (`c092b47d7088f54a62da53c3774578c437f53b05`) failed at the 30-second importer-entry wait because that wait began when the server finished writing, before the existing owner finished verification/handoff. The run served the full body, preserved partial/final inode and drained via cancellation/shutdown, but did not qualify importer settlement. Its missing later artifact-path observation also caused a secondary inventory assertion; the recorded inventory contains one model file. The narrow repair now includes marker removal after `files_ready` and package validation in the same 300-second transfer phase before the unchanged 30-second importer wait. Independent `Using`, no-receipt, inode and final settlement assertions remain. Both reviewers accepted the exact repair. The earlier UUID Serialize compile error and interrupted builds remain archived, without passing claims. - -Builds were serialized with disk checks. Authorized inactive reproducible Cargo cache files were hashed before removal; manifests are retained. Protected source, retained custody/evidence roots, release archives, production owners and frozen S3/native write sets remain unchanged. Own temporary PR42 dependency copies were parked under `/tmp/pr42-build-cache` to recover workspace headroom; locked dependency sources/manifests/versions were not changed. After all Cargo checks completed, those temporary PR42 dependency copies were restored to their original worktree locations under a headroom guard; the restoration manifest is archived. The payload fixture itself remained on `/workspace`, not tmpfs. - -## Gate disposition and next existing-plan feature - -AC10 and AQ-HTTP remain pending. Q2 wheel-file-set acquisition/local-only Torch consumption is the next existing-plan implementation feature, gated by AQ-HTTP. Its required boundary remains an accepted exact wheel closure, shared verified local handoff, installation under denied network, a lease held through child exit/cleanup, installed-output proof, and separate resolver/bootstrap traffic accounting. Current `resolve_runtime.py --install` resolves and installs before emitting its report/lock, and `installer/torch.rs` consumes that combined post-install result; it does not provide this boundary. No Q2 source work is included. Parent owns PRs, hosted qualification, reviews and integration. Real-provider and supported-platform S3 acceptance remain separate. diff --git a/docs/plans/artifact-acquisition/reports/acceptance-matrix.md b/docs/plans/artifact-acquisition/reports/acceptance-matrix.md index 269117bc7..d8c73b32b 100644 --- a/docs/plans/artifact-acquisition/reports/acceptance-matrix.md +++ b/docs/plans/artifact-acquisition/reports/acceptance-matrix.md @@ -2,7 +2,7 @@ **2026-10-09 combined consumer reconciliation:** The pinned ec03 Linux consumer evidence and every original AC01–AC18 criterion are reconciled in -[the bounded report](combined-ec03-acquisition-acceptance-2026-10-09.md). +the [bounded report](combined-ec03-acquisition-acceptance-2026-10-09.md). A separate tests-only checkpoint adds duplicate-ETag raw HTTP regressions; all 28 core HTTP module tests pass in the recorded no-default-plus-S3 run. The qualified consumer executable remains the ec03 producer. Full criteria, @@ -469,7 +469,7 @@ at actual importer hold, exact source/file/receipt SHA, model/index publication, Adopted and settled admission are asserted. Full-root no-follow inventories show one artifact-sized retained file. Raw RSS/HWM and I/O counters, allocation, source bytes/requests and configured capacity are bound in the -[report](ac10-public-hf-measurement-2026-10-06.md). Strict all-target core Clippy +report (`ac10-public-hf-measurement-2026-10-06.md`, removed; see Git history). Strict all-target core Clippy and existing mixed-size status controls pass in both modes. The repaired timing failure and compile/interruption logs are retained. One synthetic Linux core workload does not establish concurrent admission/resource envelopes, page-cache @@ -486,7 +486,7 @@ cases in each default/no-default mode, one public HF status/import control in each, and strict Clippy in three feature modes pass. This supports bounded AC02/AC06/AC10/AC15 behavior only. Already registered writes drain before return; no hard filesystem/verification/import/child-cleanup return deadline is claimed. -See [http-elapsed-budget-qualification-2026-10-06](http-elapsed-budget-qualification-2026-10-06.md) for exact logs and independent source reviews. +See http-elapsed-budget-qualification-2026-10-06 (`http-elapsed-budget-qualification-2026-10-06.md`, removed; see Git history) for exact logs and independent source reviews. No public shape, S3/native frozen source, generator or Q2 writes. AQ-HTTP remains not ready; broader acceptance, current-head hosted checks, resource/platform/UI, public-client and deployment dispositions remain pending. Q2 exact local package diff --git a/docs/plans/artifact-acquisition/reports/coding-standards-mcp-usability.md b/docs/plans/artifact-acquisition/reports/coding-standards-mcp-usability.md deleted file mode 100644 index bd349e8cd..000000000 --- a/docs/plans/artifact-acquisition/reports/coding-standards-mcp-usability.md +++ /dev/null @@ -1,451 +0,0 @@ -# Coding-Standards MCP usability feedback - -This report records agent experience using the Coding-Standards MCP during Acquisition Q1 preparation. It is separate from acquisition acceptance: MCP routing and usability do not establish product-code compliance, and product tests do not establish that the MCP workflow was usable. - -## Primary integrator - -- **Useful calls:** `routing_facts` exposed the valid fact categories and values; an initial route with minimal facts made the router's information model clear. Compact routes with bounded content returned an explicit snapshot, selected standards, and unresolved-fact count. `read_many` let the integrator inspect the commit, planning, implementation, verification, architecture, contract, and documentation obligations. Rerouting after composition seams were clarified confirmed applicability for the actual Q1 boundary. -- **Confusing or redundant steps:** Tool discovery descriptions were verbose. The first broad route requested 32 policy contents and produced output large enough to truncate. A broad `read_many` similarly returned tens of thousands of tokens. A later route displayed policies already read, so applicability and policy reading were not easy to distinguish. -- **Additional final-route experience:** The summary carried the snapshot UUID without its required `snapshot:v1:` prefix; the MCP rejected that exact handle with a clear pattern error, after which the full opaque handle worked. A complete route still required explicit empty values for the framework and workflow-profile categories. Supplying `content.limit: 32` returned all 32 policy bodies at once (about 85,000 output tokens and truncated); a targeted `read_many` of 11 exact selected policies was more useful for checking this candidate. -- **Missing context:** The MCP did not know the repository's current accepted plan status, retained-state population, public consumers, active recovery owner, or actual CI/source evidence. Those facts had to be gathered from the repository, GitHub, and the source tree. The route cannot certify that the source or tests satisfy the selected rules. -- **Smallest sufficient workflow:** Read routing facts once; route the concrete slice without policy contents; read Core plus only the selected standards and workflows relevant to its actual changed boundary in small pages; inspect source and run the required evidence; reroute only when ownership or scope changes; then use the final review operation against the implemented candidate. -- **Recommendations:** Keep route output compact by default and separate applicability reasons from policy bodies. Make content pages token-budgeted, expose previously read policy IDs, and put unresolved facts first. Clarify in the result that a complete route means applicability was resolved, not that implementation compliance was verified. A same-snapshot “changed design” review summary could call out new or removed obligations without replaying all policy text. -- **Smallest sufficient workflow for this slice:** Preserve the complete opaque snapshot handle; call `routing_facts` only when the current fact vocabulary is not already known; route the changed boundary without inline policy text; read the exact selected obligations in a small `read_many`; inspect source and test evidence outside the MCP; reroute the final implementation. Empty framework/profile answers are needed to close applicability when those categories are not relevant. - -## Independent architecture reviewer - -- **Useful calls:** `routing_facts`, a route including content, and the pinned snapshot made it possible to identify and read Architecture, Rust Async, Persistence, Contract Evolution, Core, and Planning. The final route selected 24 standards with zero unresolved categories; this was a complete applicability result, not a compliance certificate. -- **Confusing or redundant steps:** Initial tool discovery was verbose. The broad route returned roughly 68,000 tokens and truncated, repeated relationship rationales, and later policy reads repeated content already shown inline. -- **Missing context:** The MCP could not reveal the repository's persisted-state population, source/consumer ownership, accepted plan prerequisites, or shutdown composition. The reviewer had to inspect source and plan documents outside the MCP to assess those obligations. -- **Smallest sufficient workflow:** Route concrete facts once, omit inline policy content, read only the relevant policies in small pages, inspect source/evidence independently, and reroute when the design materially changes. -- **Recommendations:** Add an output-size budget, avoid repeating policy prose and relationship explanations, show which policies have already been read, and provide a same-facts design-change summary. Keep route completeness distinct from source/evidence compliance. - -## Primary integrator — source API boundary follow-up - -- **Useful calls:** I refreshed `routing_facts`, routed the changed public API/async/network boundary, and got a complete route with 34 selected units and zero unresolved categories. Compact single-policy reads provided the specific compatibility and lifecycle rules. The route helped identify that public API compatibility and typed failure behavior mattered even though the source adapter was internal to the repository. -- **Confusing or redundant steps:** The route result still repeated long relationship rationales for each policy. A `read_many` call for nine compact policies returned enough combined policy text to exceed a practical review/output window; focused individual reads were easier to inspect, though several were still large. The route's completeness and the amount of normative text read remained separate facts that needed explicit tracking. -- **Missing context:** The MCP did not know that `GitHubAsset` is publicly re-exported, nor whether downstream crate consumers construct it directly. I had to inspect `network/mod.rs`, search the Rust tree, and inspect Cargo packaging before rejecting a breaking public-field addition. It also could not observe whether the resolver was consumed by the native installer or what current tests had run. -- **Smallest sufficient workflow:** Use current routing facts; route concrete code and contract facts without inline policy bodies; read Core and the exact contract-evolution, Rust API/async, persistence, security, resilience, and verification units needed for the slice in a bounded set; inspect source and run tests separately; re-route when the public boundary/design changes; then check the final source against the selected obligations. -- **Recommendations:** Add a strict token/byte budget to `read_many`; support section-scoped reads with a concise obligation summary and authoritative full-text links; retain a visible list of already-read policy IDs across route continuations; shorten repeated relationship rationales; and state that current consumer inventory and source evidence must be established outside the MCP. Preserve the distinction between a complete route and implementation compliance. - -## Native-custody contributor — GPT-6.1 Sol High - -- **Useful calls:** `routing_facts`, a complete `route`, and snapshot-bound `read_many` selected and returned the Core, Rust async, concurrency, persistence, contracts, and commit obligations. The first route selected 27 standards; recognizing the metadata-publication boundary required a second route, which selected 29 with no unresolved facts. These calls selected guidance; the contributor used code inspection and tests for implementation evidence. -- **Confusing or redundant steps:** Route content-pagination repeated long policy-selection rationale. Large policy results combined with source diffs exceeded a useful output window; smaller content-only reads worked better. Broad tool discovery included unrelated authoring operations. -- **Missing context:** The MCP did not know the admitted worktree, current plan/write set, actual publication semantics, source ownership, or test environment. The contributor had to inspect source to recognize the metadata boundary even though persistence files were outside its write set. -- **Where the contributor left MCP:** Git state, plan details, source ownership, filesystem behavior, Cargo checks, and fixture outputs all came from repository tools, not the MCP. -- **Smallest sufficient workflow:** One `routing_facts` call, one complete-facts route, then snapshot-bound reads of only the applicable policies; use repository source and tests to assess actual compliance. Standards authoring/revision/publication calls were unnecessary. -- **Recommendations:** Provide continuations that return policy content without repeating route rationales; make verbose relationship detail opt-in; separate implementation-guidance discovery from standards-authoring tools; and make the route surface a concise checklist for indirect boundaries such as durable metadata publication. Retain the explicit distinction between routed guidance and implementation review. - -## Native-custody independent reviewer — GPT-6.1 Sol High - -- **Useful calls:** `describe_input(route)` clarified the input contract; `routing_facts` exposed the valid fact names and values; a complete route plus snapshot-bound `read_many` selected 27 policies with no unresolved questions. Concurrency, Rust async, persistence, resilience, and verification policies supported the source review. -- **Confusing or redundant steps:** Tool discovery was verbose. The reviewer first searched for a server named Coding-Standards, which was not configured, and initially missed the `standards_engine` tool namespace in `ALL_TOOLS`. `describe_input(route)` added little beyond the exposed declaration. Reading all 27 policies at once produced excessive output and repeated policy-selection rationale. -- **Missing context:** The MCP did not bind the route to the branch, diff, baseline, plan gate, source population, or test evidence. The reviewer had to inspect Git, the plan, the worker diff, Tokio/tempfile behavior, and source to identify shutdown, metadata coordination, pending filesystem I/O, and cleanup-error obligations. -- **Where the reviewer left MCP:** Repository, dependency-source, and test inspection were required for every product finding. No tests were run during the read-only review. -- **Smallest sufficient workflow:** Discover `standards_engine` tools from the provided callable catalog; use `routing_facts`, one complete route with explicit empty categories, then read only focused applicable policies in a bounded page; evaluate the actual diff and evidence in repository tools. `describe_input` is optional when the declared shape is already clear. -- **Recommendations:** Make the tool namespace easier to discover by linking it from the configured MCP catalog; include accepted base and plan/write-set context when the caller supplies it, while clearly distinguishing context from policy authority; offer a focused policy-text continuation without relationship rationale; and provide a concise read-only code-review workflow separate from standards-corpus authoring. Do not imply that a complete route certifies implementation. - -## Shared-owner design reviewer — GPT-6.1 Sol High - -- **Useful calls:** The reviewer initially searched for a Coding-Standards server and did not find one; after I pointed it to the exposed `standards_engine` tool namespace, it called `routing_facts`, routed concrete planning/verification/persistence/Rust facts to a complete result with zero unresolved questions, and read Architecture, replay, Persistence, Contract Evolution, Code Design, and Rust Async. The pinned snapshot was `snapshot:v1:78677912-3ddc-4107-83a3-c7f83542de1d`. -- **Confusing or redundant steps:** Searching by the product name led to an incorrect `list_mcp_resources` call against a nonexistent server. Tool-callable discovery and MCP-server/resource discovery were not clearly distinguished. Correcting the search resolved the confusion. -- **Missing context:** MCP output identified its interface version and unreviewed exposure but did not provide the current Q1 source ownership, retained-store facts, or plan gate by itself; the reviewer is collecting those from repository files. -- **Smallest sufficient workflow:** Discover callable `standards_engine` methods from `ALL_TOOLS`, call `routing_facts`, complete a slice-specific route, then read the few selected policies required for architecture/persistence/concurrency. Repository inspection remains the source of implementation facts. -- **Recommendations:** Surface configured MCP tool namespaces in initial agent context, distinguish callable tools from MCP servers/resources, and make the bounded read-only workflow discoverable without exposing unrelated authoring operations first. - -## Primary integrator — shared-owner extraction preparation - -- **Useful calls:** For the new multi-root custody seam, I refreshed `routing_facts`, then routed the launcher/library, persistence/IPC, Rust API/async/cross-platform/dependency/security, concurrency, contracts/evolution, resilience, replay, and verification facts. The route completed with no unresolved facts under snapshot `snapshot:v1:ea1dc4cb-2d14-4a69-866c-ded1b097e278`. Focused snapshot-bound reads of Persistence, Concurrency, Contract Evolution, Architecture, Rust Async, Rust API, Verification, Commit, Rust Cross-Platform, Rust Dependencies, Security, Untrusted Execution, Resilience, Protocols, Schemas, Replay, and Code Design identified the relevant ownership and evidence obligations. -- **Confusing or redundant steps:** The route requested eight policy bodies and produced roughly 63,000 output tokens before truncation, even though only the applicability result and snapshot were needed. `read_many` returns full policy content without a section selector, so I filtered the structured result by headings and relevant sections. Repeating route relationship metadata alongside policy text remained a major output cost. -- **Missing context:** The MCP did not know the existing owner retained only one physical-root grant, that independently opened handles can refer to one root, or that model and native consumers need separate physical roots. Repository inspection and the shared-owner source review established those facts. It also could not report the active PR check because GitHub access failed in the current environment. -- **Where I left MCP:** Root identity semantics, async grant acquisition, the actual two-root test, Rust verification, repository state, and current CI availability were established with source and repository tools. The standards route selected obligations only; the code/test evidence is separate. -- **Smallest sufficient workflow:** Reuse the current fact vocabulary when available; call `routing_facts` only to refresh it; route without inline policy bodies; read a small set of exact selected policies in bounded calls; inspect source and run tests outside the MCP; reroute the final candidate if the owner boundary changes. -- **Recommendations:** Make route content opt-in and strictly byte-budgeted; offer section-scoped policy reads; report which policies were already read; include repository-supplied owner and candidate context as non-authoritative context; and show a compact delta when a slice adds or removes an ownership boundary. - -## Native-custody contributor — revised lifecycle review - -- **Useful calls:** A new `routing_facts`/`route` cycle selected 28 standards with no unresolved facts under snapshot `snapshot:v1:afd3e35d-bc08-4dc8-b848-597626ae279c`. The contributor reread concurrency, Rust async, persistence, and resilience against the repaired native-custody proposal and then executed source-backed lifecycle fixtures and Cargo checks. -- **Confusing or redundant steps:** Route results again carried substantial edge/handle metadata. Batched full policy content exceeded a useful output window; smaller content-only reads were easier to apply. -- **Missing context:** The MCP still did not identify the exact `VersionState` lifecycle owner or how shutdown observed metadata workers; those were discovered in repository source and through independent review. -- **Where the contributor left MCP:** All filesystem, task-registration, test, and build evidence came from the isolated worktree. The revised route did not establish AQ-HTTP or certify the native implementation. -- **Smallest sufficient workflow:** Refresh facts, route the precise changed boundary, reread only changed obligations, then inspect and test the exact candidate. -- **Recommendations:** Add a compact route with no repeated relationship graph, preserve a visible list of already-read obligations, and present changed-boundary implications without repeating unchanged policy text. - -## Native-custody contributor — canceled-worker ownership follow-up - -- **Useful calls:** The contributor reused its previously routed snapshot and reread Concurrency and Rust Async after the independent P2. That narrowed the design requirement from “retain the lock” to “retain and observe worker completion through shutdown.” The actual registry implementation and canceled-waiter completion/failure/panic fixtures were verified in the worker worktree. -- **Confusing or redundant steps:** No new discovery or broad reroute was needed. Policy text still lacked source-specific task-owner and state-construction context. -- **Missing context:** The MCP did not identify the existing `VersionState`/`InstallationTasks` owners or manager shutdown order; source inspection established how to register and drain the new mutation workers. -- **Where the contributor left MCP:** The worker registry, manager drain, repeated shutdown result, and tests were all assessed from source and exact-candidate Cargo runs. The MCP supplied obligations only. -- **Smallest sufficient workflow:** Reuse the prior route, reread only concurrency/async obligations implicated by the finding, then implement and test the source lifecycle. -- **Recommendations:** Keep exact prior-read and snapshot context visible, offer section-level policy output, and provide concrete owner/cancellation prompts without pretending the MCP knows repository lifecycle wiring. - -## Native-custody independent reviewer — revised candidate follow-up - -- **Useful calls:** The reviewer reused the prior registered facts and snapshot, routed the revised metadata/task-lifecycle scope, and read only Concurrency, Persistence, and Rust Async. That focused read directly exposed the missing terminal observer for canceled metadata workers. -- **Confusing or redundant steps:** Route rationale still repeated relation/handle metadata. Focused output improved on the earlier all-policy batch, but exact diff/base/gate facts still had to be supplied and verified externally. -- **Missing context:** MCP did not bind the review to the candidate digest or show that the new workers were omitted from `shutdown_installations`; source and test inspection were necessary. -- **Where the reviewer left MCP:** The P2 finding, exact source locations, changed-diff digest, and review status came from read-only Git/source inspection. No tests were run by this review. -- **Smallest sufficient workflow:** Reuse retained routing facts, route the actual change, read the three relevant policies, inspect source/diff and existing evidence, then report findings independently. -- **Recommendations:** Offer a narrow source-review mode that accepts an exact candidate reference as context, links only relevant policies, and says plainly that tools neither inspected the diff nor approved standards compliance. Keep standards-corpus authoring operations out of the default review entry point. - -## Native-custody independent reviewer — shutdown ownership repair verification - -- **Useful calls:** The reviewer used a snapshot-bound `route` plus a focused `read_many` of Rust Async and Concurrency. These rules directly separated retaining a metadata lock from retaining a completion observer and shutdown drain. -- **Confusing or redundant steps:** No new fact discovery was needed; the route and two policy reads were sufficient. Source inspection was still needed to confirm the lock, result channel, supervisor receipt, and shutdown guard ordering. -- **Missing context:** The MCP did not reveal the public OllamaVersionManager wrapper or its lack of a drain method; repository search did. No in-repository production caller was found, but the public wrapper remains a supported ownership surface unless its API contract says otherwise. -- **Where the reviewer left MCP:** Exact diff identity, the closed P2 disposition, fixture structure, and remaining wrapper limit came from read-only source/Git inspection. No tests were run by the reviewer. -- **Smallest sufficient workflow:** Reuse retained route facts, route the focused shutdown change, read Rust Async and Concurrency, then inspect the exact diff and tests. -- **Recommendations:** Keep the minimal policy-only workflow easy to repeat and make source review context explicit. A concise owner inventory would help identify wrappers that must delegate to a newly introduced lifecycle owner. - -## Native-custody contributor — public Ollama wrapper drain - -- **Useful calls:** The contributor reused its retained standards snapshot, routed the wrapper lifecycle boundary to 26 standards with zero unresolved categories, then read Rust Async, Concurrency and Rust API. Those obligations clarified that the public wrapper also had to close admission and retain completion receipts for its owned `VersionState` mutations. -- **Confusing or redundant steps:** No new broad discovery was necessary. The route still carried relation metadata; scoped reads were sufficient. -- **Missing context:** The MCP did not identify that `OllamaVersionManager` owns private state and runs removal/download activity inline. Repository source established the activity and shutdown order. -- **Where the contributor left MCP:** The wrapper receipt, cancellation behavior, file-write settlement, regression tests and exact-candidate Cargo results came from source inspection and execution in the worker worktree. The MCP supplied obligations only. -- **Smallest sufficient workflow:** Reuse facts and snapshot, route the newly discovered owner boundary, read async/concurrency/API, then inspect and test the exact candidate. -- **Recommendations:** Show the exact affected owner boundary and prior relevant reads in a compact view; offer section-scoped policy reads. Keep repository evidence explicitly outside the MCP compliance claim. - -## Native-custody independent reviewer — final wrapper candidate - -- **Useful calls:** The reviewer reused registered facts, routed the final wrapper scope to 27 standards with no unresolved questions, and read Concurrency and Rust Async. This was sufficient to assess close-admission ordering, completion ownership after waiter cancellation, and shutdown draining. -- **Confusing or redundant steps:** No extra discovery call was needed. Source inspection remained necessary to check the actual wrapper receipt and queued-install cancellation reset. -- **Missing context:** The MCP did not supply the candidate digest, activity registry, or exact call graph; repository/Git inspection did. -- **Where the reviewer left MCP:** Findings, exact source evidence, tests inspected, and the disposition of the previous wrapper limitation came from read-only source/diff review. The reviewer ran no tests. -- **Smallest sufficient workflow:** Reuse the prior route, read the two lifecycle policies, and inspect the exact diff and named regression tests. -- **Recommendations:** Make candidate identity and affected owner paths easy to provide as non-authoritative review context. Keep it clear that policy routing does not inspect or approve source. - -## Q1 store-cutover reviewer — source-neutral lifecycle design - -- **Useful calls:** The reviewer discovered routing facts, routed the Q1 persistence/concurrency/contract/async/replay/architecture/verification slice, and read focused selected policies. The route completed with 28 standards and no unresolved questions. It helped expose the single-writer, supported-state, no-assumed-compatibility, supervised-effect, and claim-scoped-evidence requirements. -- **Confusing or redundant steps:** Seven whole-policy reads produced excessive output and truncation; the reviewer had to retrieve obscured concurrency/async/replay bodies separately. Text and structured forms repeated content. -- **Missing context:** The MCP did not know the existing v4-to-v5 migration-on-load behavior, model-library marker semantics, hidden custody inventory, mutation-authority reader, or composition boundaries. Repository inspection supplied these facts. -- **Where the reviewer left MCP:** Exact migration populations, unknown deployed-root scope, consumer ownership and proposed cutover were established from source and plan inspection. No files were edited and no tests were run. -- **Smallest sufficient workflow:** One `routing_facts`, one concise `route`, one focused `read_many`; schema discovery only when the tool contract actually requires it. -- **Recommendations:** Keep route output free of repeated relation graphs; support section-scoped policy reads; distinguish applicability from repository compliance; avoid duplicate policy text in structured and textual results; provide examples for selecting routing facts. - -## Primary integrator — merged native-custody candidate and shared-owner boundary - -- **Useful calls:** For the merged native custody scope, I refreshed `routing_facts`, routed 32 standards with no unresolved categories under snapshot `snapshot:v1:37f8f667-71b0-4580-9084-4d202fdcc04c`, and read focused Architecture, Concurrency, Rust Async, Rust API, Persistence, Contract Evolution, Resilience, Verification and Commit standards. The final route captured the actual app-manager/RPC, async shutdown, persistence-adjacent and verification boundaries. Reading Concurrency/Async and Architecture again after lifecycle review exposed that one supervisor needs consumer-scoped handles rather than sharing the current HF owner unchanged. -- **Confusing or redundant steps:** The route summary is compact only without policy bodies; focused `read_many` still returns whole policy text and repeated handles/relationship context. The first larger batch truncated output, so I split further review into smaller groups. -- **Missing context:** The MCP did not know the current owner scans global task IDs/projections or that HF Drop supplies the owner-wide shutdown callback. Repository source and the exact reviewer identified that coupling. It also did not know that the downloaded model root initializer writes a model library marker. -- **Where I left MCP:** Candidate identities, Git ancestry, staged scope, source ownership, tests, feature checks, and CI state were verified with repository and GitHub tools. MCP routing did not inspect source or supply acceptance evidence. -- **Smallest sufficient workflow:** Discover or reuse the routing facts; route without inline policy content; read only Architecture, Concurrency, Rust Async/API, Persistence/Evolution, Verification, Resilience and Commit obligations implicated by the actual boundary; inspect source and evidence; run a final route on the completed candidate. -- **Recommendations:** Support policy-section reads and compact route deltas; keep candidate/source context clearly marked non-authoritative; expose the already-read standards list; and state explicitly that MCP applicability is neither source inspection nor compliance evidence. - -### Primary integrator — shared-custody slice routing - -- **Useful calls:** A fresh `routing_facts` snapshot and a concise route selected 34 applicable standards with zero unresolved facts after marking unrelated framework routing known-absent. The selected closure covered Rust core/API/async, acquisition ownership, concurrency, security/trust, persistence-adjacent behavior, verification and commit workflow. -- **Confusing or redundant steps:** Omitting the unrelated `routing.frameworks` fact left it as a required unresolved category; the router needs an explicit known-absent marker. A single `read_many` across 17 selected policies produced a very large repeated result and was truncated by the client, so future reads need smaller batches. Relationship and policy metadata is repeated around full policy text. -- **Missing context:** The MCP did not identify that the current HF supervisor globally scans operation IDs/projections, that HF shutdown closes the whole owner, or that `DownloadDestinationRoot` creates model-specific marker/deletion authority. Source and reviewer inspection supplied those ownership facts. -- **Where I left MCP:** Git ancestry, exact write sets, existing task APIs, migration-on-load behavior, current CI, and all executed test evidence come from Git, repository source, and command results. The route supplies obligations only. -- **Smallest sufficient workflow:** Declare every routing fact, route the actual slice, read focused Architecture, Concurrency, Rust Async/API, Persistence/Evolution, Security, Verification and Commit policies, then inspect/test the exact implementation and route it again before handoff. -- **Recommendations:** Treat omitted facts as unknown only when the fact is genuinely unknown; make known-absent explicit in concise examples. Support policy-section reads and compact incremental route output, and avoid repeating relation graphs in every result. Preserve a clear boundary between applicable standards and source compliance evidence. - -## Participation - -### Primary integrator — current Q1 shared-store routing - -- **Useful calls:** A fresh `routing_facts` snapshot plus a complete route selected 31 standards with zero unresolved categories for the durable store/service boundary. Focused reads returned Persistence, Replay, Concurrency, Contract Evolution, Schemas, Untrusted Execution, Independent Test Oracles, and Platform Verification. Those standards make supported retained-state facts, one-writer semantics, effect cessation before release/publication, version scope, delegated authority and claim-matched evidence explicit. -- **Confusing or redundant steps:** An attempted selection-only call with `content.limit: 0` was rejected because the input contract requires a minimum of one; omitting `content` produced the desired compact route. A single eight-policy `read_many` returned duplicated content/metadata and exceeded the visible output window; the read was repeated in two focused batches. -- **Missing context:** The MCP did not expose the exact `c3052583` candidate, plan gate state, schema-5 hidden custody populations, v4-on-load mutation, model deletion reader, RPC drain order, or local CI state. Repository and GitHub inspection supplied those facts. -- **Where I left MCP:** Candidate identity, supported-state source inventory, tests, current Actions run, and the exact lifecycle call graph came from Git, repository source and GitHub. The MCP supplied obligations only. -- **Smallest sufficient workflow:** Capture facts, route without inline policy content, read two or three relevant policies at a time, inspect the exact source and evidence, then reroute when the implementation boundary changes. -- **Recommendations:** Make route selection-only the obvious default, reject or normalize a zero content limit with a direct hint, return policy bodies once without repeating them in another result representation, and support section-scoped reads with a visible already-read list. - -### Independent Q1 next-slice architecture investigator — GPT-6.1 Sol High - -- **Useful calls:** One `routing_facts`, one snapshot-bound `route`, and three focused `read_many` calls selected 28 standards with zero unresolved categories. Reads covered architecture/replay, persistence, contract evolution, concurrency, Rust async/API, security/trust, resilience, verification and planning. The route helped surface the one-writer, complete migration preconditions, consumer-specific proof, nested-effect drainage, and scoped-evidence obligations. -- **Confusing or redundant steps:** Broad discovery by “coding/standards/policy” returned unrelated tool descriptions. A route containing several whole policy bodies and an initial six-policy read exceeded the response window; the agent had to re-extract individual bodies. Relationship rationale and continuation metadata repeated around policy content. -- **Missing context:** The MCP did not know the source call graph, `DownloadPersistence` schema 5 and its v4 migration-on-load behavior, hidden admission/quarantine custody, the mutation-authority reader, library marker semantics, public constructors, or shutdown order. Those came from source, plan and contract inspection. -- **Where the agent left MCP:** Exact candidate/base identity, native asset selection semantics, state populations encoded by the source, and the proposed consumer/store composition were established with Git and repository inspection. The investigator edited nothing and ran no tests. -- **Smallest sufficient workflow:** Discover the namespace and fact vocabulary, route explicit facts without policy text, read a few selected standards in small batches, then inspect source and required evidence independently. -- **Recommendations:** Offer a read-only investigation entry point, compact route output with optional explanations, section-scoped policy reads, no duplicate body representations, and a clear indicator that routing does not inspect or certify application code. - -### Q1 durable-store implementation admission follow-up — GPT-6.1 Sol High - -- **Useful calls:** The worker refreshed routing facts, completed an implementation/verification/commit route with 26 selected policies and no unresolved categories, then read Persistence, Evolution, Replay, Commit, Concurrency, Rust Async, Security and Verification. That supplied the applicable obligations while source inspection located the migration-on-load and strict-schema behavior. -- **Confusing or redundant steps:** Whole-policy batches still exceeded a practical output window. The worker also reached an implementation boundary the MCP could not resolve: it routed migration obligations but did not select the exact operation/API or default builder behavior needed to satisfy them. The integrator had to make and record that product-contract decision before source changes could begin. -- **Missing context:** The MCP did not know the exact accepted schema versions, that v4 migration currently publishes during load, whether older processes might retain cached state, or that live retained roots are explicitly out of bounds. The worker established those facts from source and the plan, then paused for contract ownership. -- **Where the worker left MCP:** The exact schema version, migration authorization, API behavior, and production evidence scope were settled in the shared contract and plan by the integrator. The worker made no source edits and ran no tests before that decision. -- **Smallest sufficient workflow:** One current routing-facts snapshot, one complete route without inline content, focused reads of persistence/evolution/concurrency/async/security/verification/commit policies, then inspect the source and plan. A concrete source migration proposal still requires an owning human/agent to choose the API and rollout policy. -- **Recommendations:** Keep policy batches bounded; add a prompt that distinguishes normative obligations from design choices the caller must resolve; include a direct migration-cutover checklist for old readers/writers, default-open behavior, explicit authorization, and fixture versus deployed-state evidence. Continue to state that routing does not decide product semantics or certify code. - -The primary integrator, independent architecture reviewer, native-custody contributor, native-custody independent reviewer, shared-owner design reviewer, and Q1 next-slice architecture investigator used the MCP and are represented above. The bounded source-inventory reviewer did not use it, so there is no MCP usability report from that agent. - -The architecture reviewer’s narrow follow-up inspected the repaired current source without making a new MCP call and reused the prior routed obligations; its findings confirm the two identified integrity paths are closed at source level, not that Q1 is accepted. The MCP `review` operation is an authoring workflow for changes to the standards corpus; it does not review application source. Application compliance was checked by final routing, standards reads, source/test inspection, and the independent code review. - -## Import-receipt feasibility investigator — GPT-6.1 Sol High - -- **Useful calls:** Reused the existing routing facts and selected snapshot for a focused route over persistence, architecture/replay, contract evolution/schema, concurrency, Rust/API/async and verification concerns. Snapshot `snapshot:v1:869927cd-0134-4833-89c9-c545393f1dff` selected 21 standards with zero unresolved facts. Focused reads of Persistence and Architecture informed the separation between the model-owned completion proof and acquisition's exact lease/workspace custody. A final same-snapshot route confirmed the design scope. -- **Confusing or redundant steps:** No confusing or redundant operation was reported beyond long full policy text; source-specific questions were not answered by another MCP call. -- **Missing context:** The MCP did not expose the exact schema-6 partition writer, importer effects, held root grant, or orphan adoption call graph. Those required source inspection. -- **Where the investigator left MCP:** Candidate identity, schema decoder behavior, finalizer publication ordering, and concrete required tests were established in repository source, not by routing. -- **Smallest sufficient workflow:** Reuse the fact vocabulary/snapshot, route the exact slice, read two focused policies, reroute the final design, then verify the actual source boundaries and evidence separately. -- **Recommendations:** Offer section-scoped policy reads and make the distinction between a complete standards route and source/evidence qualification explicit. - -## Primary integrator — initial combined receipt/guard routing, later split by source review - -- **Useful calls:** I refreshed `routing_facts` at snapshot `snapshot:v1:af0c1e53-2199-4992-9b93-a00d526934fe`, then routed persistence, schema/evolution, replay, concurrency, delegated-execution security, test-oracle, verification, documentation and commit facts. The final same-snapshot route selected 32 standards with zero unresolved facts. Focused reads of Persistence, Contract Evolution, Architecture Replay, Concurrency, Untrusted Execution, Independent Test Oracles and Commit Workflow made conditional publication, exact replay authority, effect-boundary guards and candidate-matched tests explicit. -- **Confusing or redundant steps:** `ALL_TOOLS` keyword discovery returned long descriptions for both app-code routing/read operations and standards-authoring operations. The first route omitted the explicitly required empty framework category and returned `needs-facts`; correcting that on the same snapshot was straightforward. A 21-policy `read_many` produced more text than the visible output window, so I read the seven relevant policies in two smaller batches. Repeating the same complete route to inspect the selected count was unnecessary but provided a precise record. -- **Missing context:** The MCP did not know the current `d0b71b5` source boundary, schema-6 partition decoder, exact `Using` lease, importer side effects, metadata durability, mutation authority, or orphan-adoption entry points. Repository source and the separate exact-candidate design review are establishing those facts. Routing does not decide receipt schema/ownership or prove behavior. -- **Where I left MCP:** Git/PR/CI state, store and importer ownership, publication failure semantics, all adoption paths, and local test evidence came from repository/GitHub inspection. No standards-corpus authoring, attestation, or approval operation was performed. -- **Smallest sufficient workflow:** Capture the fact vocabulary once, route the exact library/persistence/lifecycle/security/verification/commit scope with every required category explicit, read three or four applicable policies at a time, inspect source and tests, and reroute the final candidate after implementation. -- **Recommendations:** Filter initial tool discovery to application-routing/read operations before exposing authoring tools; keep selection-only routing compact; surface required empty applicability facts before policy evaluation; cap `read_many` by a practical byte budget; show the selected count without another call; and provide section-scoped policy reads. Continue to distinguish a complete applicability route from implementation evidence and acceptance. - -This is MCP usability feedback only. The Q1 product boundary and its acceptance state are recorded in the acquisition plan and execution ledger, not inferred from this report. - -## Primary integrator — current importer/adoption custody-guard slice - -- **Useful calls:** A fresh `routing_facts` snapshot (`snapshot:v1:9881b6be-4a0e-4d72-b0cd-4e4307cdc710`) and a complete route selected 26 standards with zero unresolved facts. Focused `read_many` covered Concurrency, Rust Async, Persistence, Rust API, Untrusted Execution, and Verification. This narrower route made effect-boundary ownership, cancellation retention, configured-authority refusal, and negative lifecycle evidence applicable without carrying receipt/output-proof policies into the current implementation slice. -- **Confusing or redundant steps:** The same empty `routing.frameworks` value had to be supplied explicitly despite no framework being used. The earlier combined route and broad 21-policy read remain separate historical discovery for receipt feasibility; neither is needed to implement this guard. The current focused reads were sufficient. -- **Missing context:** Routing did not identify the common importer shortcut, Diffusers delegation, HF use lease, already-held root grant, exact queue admission, or the unconfigured `ModelLibrary::new` path. Source inspection and a separate read-only architecture review supplied those facts. -- **Where I left MCP:** The precise private capability contents, caller cancellation behavior, and stale-scan race are grounded in Rust source and tests. The MCP supplied obligations, not the design choice or evidence. -- **Smallest sufficient workflow:** Refresh the facts once when the slice boundary changes, route the exact guard scope without inline policy text, read the six focused obligations in one bounded call, inspect source and lifecycle tests, then route the final implemented candidate. -- **Recommendations:** Make applicability-empty facts visible before route evaluation; retain the selection-only route and compact policy reads; allow a slice-oriented policy view that separates immediate obligations from later-slice closure; keep route completion distinct from source/test compliance. - -This MCP usability report is separate from product acceptance. The guard was subsequently implemented on candidate `8b6c5f70c55a3d124189d0cd88dc85c780f47c84`; it remains under independent review and is not an accepted Q1 gate. - -## Primary integrator — revised partial-HF-stage custody guard route - -- **Useful calls:** After source inspection changed the guard boundary, I refreshed `routing_facts` and captured a new snapshot (`snapshot:v1:0ed9c25a-060e-4970-a5ca-a7286eda1601`). A complete route for the revised implementation scope selected 28 standards with zero unresolved fact categories. Focused reads included Independent Test Oracles, Code Design and Ownership, Commit Workflow, Verification, Rust, Architecture, and Security; earlier reads on the same guard work covered Concurrency, Rust Async, Persistence, Rust API, and Untrusted Execution. This surfaced the one-owner, exact-effect-boundary, cancellation-custody, typed-unavailable, and decision-fixture obligations relevant to the partial metadata stage. -- **Confusing or redundant steps:** The no-framework fact still needed an explicit `known-absent` value. A seven-policy `read_many` returned roughly 40,000 tokens of full policy text, exceeding the visible output window and truncating the result; compact reads do not provide a practical section-level summary for a narrow code slice. Routing the complete set was still useful, but rereading long whole policies was not. -- **Missing context:** The MCP did not identify the HF partial-stub call before weights, the fact it also indexes, or that index projection can rewrite metadata and custom runtime projections. Repository tracing established those concrete effects and showed that the design needed a separate exact `Transferring` stage capability. -- **Where I left MCP:** Source call chains, queue admission, stage timing, existing owner contexts, root grants, index side effects, tests, and Git/PR state were established from repository and service evidence. The MCP supplied applicable obligations; it did not choose or validate the code design. -- **Smallest sufficient workflow:** Refresh the fact vocabulary at the changed slice boundary; complete one exact route with all required categories; read only the handful of policy sections for ownership, persistence, async cancellation, delegated authority, and verification; inspect the source; then route the final implemented candidate. -- **Recommendations:** Add section-scoped obligation reads with an output-byte budget; show required empty applicability values before route evaluation; make the selected set and unresolved count visible in the initial response; and distinguish immediate slice obligations from downstream closure. Keep source and test evidence explicitly outside the route result. - -This MCP usability feedback is separate from product acceptance. The revised partial-stage guard was implemented on candidate `8b6c5f70c55a3d124189d0cd88dc85c780f47c84`; implementation evidence does not certify its acceptance. - -## Q1 importer custody-guard implementer — GPT-6.1 Sol High - -- **Useful calls:** `describe_input` and `routing_facts` exposed the exact registered fact vocabulary; snapshot-bound routes made the scope reproducible. Focused reads covered Concurrency, Rust Async, Persistence, Rust API, Untrusted Execution and Verification. The worker rerouted after the partial-stage capability and aggregate-effect lifecycle boundaries changed, then routed the final candidate. The final route selected 24 standards with zero unresolved categories. -- **Confusing or redundant steps:** Discovery and schema descriptions were large, and some MCP results duplicated content between textual and structured forms. This was cumbersome; consuming the structured result avoided part of the duplication. No standards-corpus mutation or application-source attestation operation was useful or performed. -- **Missing context:** The MCP did not know the repository call graph, exact `TaskContext` lifecycle, admitted write set or candidate diff. Those were established locally and translated into registered routing facts. -- **Where the worker left MCP:** It used source inspection, tests, Git and local evidence for implementation and verification, returning to MCP when the design boundary materially changed and for final routing. Routing supplied obligations but did not certify the code. -- **Smallest sufficient workflow:** Discover input shape and routing facts once; route known facts on a pinned snapshot; read focused applicable policies; implement and verify locally; reroute when ownership changes and against the final candidate. -- **Recommendations:** Make discovery/results compact, avoid duplicate text and structured bodies, allow concise routing summaries with selected IDs and unresolved questions, and provide a clearly non-authoritative place to associate candidate/tree/write-set context with an evidence record. - -## Q1 importer custody-guard independent reviewer — GPT-6.1 Sol High - -- **Useful calls:** The reviewer reused `routing_facts` snapshot `snapshot:v1:9881b6be-4a0e-4d72-b0cd-4e4307cdc710`, ran a selection-only route with implementation/verification, library, persistence, Rust/API/async/security/cross-platform, architecture/concurrency/contracts/security/resilience/diagnostics and code-design/evolution/delegated-authority/oracle details, and received 24 selected standards with zero unresolved facts. Two focused `read_many` calls covered Rust Security, Untrusted Execution, Independent Test Oracles, Concurrency, Rust Async and Persistence. These obligations helped assess resource/stage authority, coherent reads, held capabilities, effect drainage, failure ownership and no-effect tests. -- **Confusing or redundant steps:** No MCP errors or schema-discovery calls were needed. Route explanations and repeated continuation suggestions were verbose. -- **Missing context:** The MCP did not expose the repository HF effect envelope or capability-relative metadata publisher. Source inspection was needed to trace those actual boundaries. -- **Where the reviewer left MCP:** Candidate identity, diff, source lifecycle and test claims were checked with Git and repository tools. The reviewer ran `git diff --check`, but no build or tests. -- **Smallest sufficient workflow:** Reuse the pinned snapshot, route the concrete review scope, read focused policies, then inspect the exact diff and tests independently. -- **Recommendations:** Return a compact selected-policy/count view by default and provide task-focused policy excerpts while keeping source and evidence qualification outside the routing result. - -The review found no P0–P3 issue in its slice. That source-review conclusion and the writer-reported test evidence remain separate. - -## Q1 receipt/reopen design reviewer - -- **Useful calls:** The reviewer used one initial route and a final route on snapshot `snapshot:v1:968b380d-c352-496b-9a5f-f522222e09ab`; both selected 21 standards with zero unresolved questions. Two focused `read_many` calls read Persistence and Replay, then Contract Evolution and Schemas. Those obligations clarified that a receipt follows durable output publication, that current projections cannot stand in for exact historical completion, and that the receipt format must be explicit and versioned. -- **Confusing or redundant steps:** No vocabulary rediscovery was needed. Whole-policy reads were long, and the final route repeated the same facts because the slice workflow requires a final route. -- **Missing context:** The MCP could not identify actual schema writers, metadata no-op publication, startup index rebuild, cache fingerprint inputs, custody guard, or cancellation order. Source inspection was necessary and cannot establish deployed retained-state population. -- **Where the reviewer left MCP:** It inspected the repository for each persistence writer, output effect, migration/reopen path, startup rebuild, package-facts cache, and cancellation boundary; no tests or edits were performed. -- **Smallest sufficient workflow:** Route retained facts, read four focused policies, inspect source lifecycle, then route the final design. -- **Recommendations:** Add section-scoped policy reads, compact obligation references, and an explicit result label saying routing is complete while implementation and evidence remain unverified. - -This design review is not product acceptance. Its source audit found no existing exact importer completion receipt; schema-7 implementation, cold-reopen tests, and independent final-candidate review remain required. - -## Primary integrator — Q1 receipt/reopen slice routing - -- **Useful calls:** A fresh `routing_facts` snapshot and route selected 28 standards with zero unresolved categories for persistence/replay, schema evolution, concurrency, Rust APIs/async/security, implementation, verification, planning and commit obligations. Focused reads on the same snapshot covered Persistence, Replay, Schemas, Contract Evolution, Concurrency, Code Design, Rust Async, Untrusted Execution, Verification Oracles, Resilience, Rust API, Commit, Platform Verification, Implementation and Documentation. Explicit policy text made the transaction boundary, old-reader handling, exact publication, platform evidence scope and commit obligations concrete. -- **Confusing or redundant steps:** The first five-policy read response was too large for the visible output window, duplicating full policy text across structured and text results; later small batches were more useful. The complete route is necessary at slice start, but verbose continuation explanations added little. -- **Missing context:** Routing could not tell that schema-6 `legacy` flattening would either drop or contaminate a receipt, that current schema-6 import metadata is capability-published but can no-op without a fresh barrier, or that package-facts fingerprints omit payload bytes and serialize `HashMap` metadata. Repository source and a read-only feasibility review established those facts. -- **Where I left MCP:** Exact reader/writer inventories, output formats, startup rebuild effects, marker order, and current CI/PR state came from source/GitHub tools. The package-facts fingerprint investigation and feasibility review are design evidence, not MCP evidence. -- **Smallest sufficient workflow:** Snapshot-bound route once; read the selected ownership, schema, replay, async, security and oracle policies in small focused batches; inspect exact source; reroute the implemented candidate before handoff. -- **Recommendations:** Add section-scoped reads with a practical byte budget; avoid returning policy bodies twice; surface the selected count and unresolved questions in compact form; keep routing status distinct from implementation evidence and acceptance. - -This usability record is separate from product acceptance. At the time of this entry, the local candidate did not yet implement a receipt or reopen path; a later uncommitted worktree update is now being verified. - -## Primary integrator — resumed Q1 acquisition and native-consumer route - -- **Useful calls:** Reused the accepted snapshot `snapshot:v1:425e276a-fc0b-4282-9889-a76742027c42`, refreshed its fact definitions with `routing_facts`, and completed the route for launcher/library consumers, durable receipts, async lifecycle, security, platform/UI evidence, implementation, planning, release and commit work. The route selected 43 standards with zero unresolved facts. Paginated policy reads returned the full selected set in six bounded batches. -- **Confusing or redundant steps:** The first expanded route remained `needs-facts` until the workflow-profile condition was answered. The valid answer was `known-absent` for concurrent plan integration in this serial Q1 slice. The route accepted that fact and completed on the same snapshot. Policy retrieval is bounded by record count, but each selected item still contains its full policy text; reading 43 policies required six calls and substantial output handling. -- **Missing context:** The standards service did not expose repository state, current acquisition schema, the previously uncommitted receipt implementation, production RPC composition, or the Passeur service failure. These came from Git/source and separate Passeur diagnostics. Routing did not establish any implementation or acceptance claim. -- **Where I left MCP:** The route and policy reads supplied obligations only. Source review, test evidence, GitHub PR/CI state and exact plan-gate status remain separate repository or service observations. -- **Smallest sufficient workflow:** Reuse the accepted snapshot when its authority still applies; refresh facts, state every conditional applicability question explicitly, route, then page selected policy text in small batches. Reroute the completed source/evidence boundary after implementation. -- **Recommendations:** Let callers request focused policy sections from a completed route, preserve the compact selected-ID/count summary while paging, and show the exact missing fact prompt in a directly actionable form. Continue to label routing as obligations rather than implementation certification. - -This usability feedback is separate from product acceptance. The schema-7 receipt implementation and native consumer changes remain subject to source review and their required real-consumer evidence. - -## Independent Q1 composed reviewer — GPT-6.1 Sol High - -- **Useful calls:** The pinned standards snapshot supported fact discovery, routing, and focused reads. The reviewer routed 29 standards with zero unresolved facts. A focused three-policy `read_many` returned complete, usable policy text. -- **Confusing or redundant steps:** Requesting 32 full policy texts exceeded the visible output window. The smaller focused read was easier to use. -- **Missing context:** Routing supplied applicable obligations but did not provide repository-specific source facts or establish implementation compliance or product acceptance. -- **Where the reviewer left MCP:** The reviewer inspected the exact current diff and source independently. It did not run tests or builds. -- **Smallest sufficient workflow:** Reuse the pinned snapshot, route the focused review scope, read a small number of relevant policies, then verify source and evidence separately. -- **Recommendations:** Keep complete policy reads bounded by output size; label a completed route as obligations only, separate from source compliance and acceptance. - -This reviewer’s source findings are recorded separately from the MCP observations and do not certify the candidate. - -## Shared native-consumer contributor — GPT-6.1 Sol Medium fallback - -- **Useful calls:** After correcting the route tool's input shape, the contributor completed a focused standards route and used its selected obligations to inform implementation. -- **Confusing or redundant steps:** `describe_input({tool: "route"})` failed because the operation discriminator was missing and `tool` was an extra field; `describe_input({operation: "route"})` worked. Invented fact keys `language` and `scope` were rejected with a generic `/facts` message that did not identify the invalid keys; the contributor had to discover `routing_facts`. Route output repeated full content in both text and structured results, risking truncation. -- **Missing context:** The route did not identify the repository-specific acquisition service boundary; the contributor found that in source. Its route selected 28 standards and left two facts unresolved; the primary integrator separately completed the broader accepted route with zero unresolved facts. -- **Where the contributor left MCP:** It reported route obligations, not whether source changes complied or passed product acceptance. -- **Smallest sufficient workflow:** Describe the operation using its actual discriminator, retrieve the supported fact vocabulary before routing, resolve all returned facts explicitly, and keep full policy reads bounded. -- **Recommendations:** Make input descriptions work with the public tool name or provide a direct schema index; report each invalid fact key and valid alternatives; avoid duplicating large route bodies in text and structured output; retain the route's unresolved-fact count and distinguish obligations from evidence. - -This feedback documents actual MCP usability only; it is not an implementation approval. - -## Primary integrator — final Q1 candidate route - -- **Useful calls:** Reused the accepted snapshot `snapshot:v1:425e276a-fc0b-4282-9889-a76742027c42`, refreshed its registered fact vocabulary, and routed the final implementation/verification scope. It selected 40 standards with zero unresolved questions. The route remained compact and returned actionable policy IDs. -- **Confusing or redundant steps:** A six-policy compact `read_many` still returned full policy bodies, exceeding the visible output window. Earlier bounded batches and the already-read policies supplied the remaining applicable obligations. -- **Missing context:** The route did not know the final native attempt identity, local HTTP fixture, current CI head, or platform execution results; those were checked in source, test output, and repository state. -- **Where I left MCP:** The route supplied obligations only. Review, exact source checks and test evidence were performed independently. -- **Smallest sufficient workflow:** Refresh facts, complete a snapshot-bound route, read only the relevant small policy subset, and check implementation/evidence separately. -- **Recommendations:** Add section-scoped reads and budget the response by serialized bytes, not number of policy records. Return selected IDs/count without repeating full bodies across structured and text output. - -This is final-route usability evidence, not a Coding-Standards compliance or product-acceptance result. - -## Primary integrator — resumed exact-candidate route - -- **Useful calls:** A fresh route on snapshot `snapshot:v1:10b3e01e-6a86-4185-83e0-65ca7b0db870` selected 44 standards with zero unresolved questions. Two bounded `read_many` calls read the focused `core`, persistence, and concurrency policies. -- **Confusing or redundant steps:** The earlier snapshot handle was unavailable after session restart, so the route facts had to be refreshed and the same scope routed on a fresh handle. The small policy reads returned complete policy text and remained usable. -- **Missing context:** The standards service still supplied obligations rather than the actual Git diff, candidate test output, Passeur service health, or hosted CI status; these were checked separately. -- **Where I left MCP:** The current route and focused policy reads inform the final candidate obligations. They do not establish source compliance or gate acceptance. -- **Smallest sufficient workflow:** Refresh routing facts after a session restart, route the actual implementation/verification scope on the new snapshot, then read only the relevant policies in small batches. -- **Recommendations:** Provide a safe snapshot-refresh path after session loss and retain the clear distinction between standards obligations and independent source/test evidence. - -This entry records the resumed candidate route only; implementation review and acceptance evidence remain separate. - -## Primary integrator — finite acquisition admission and direct-installer candidate - -- **Useful calls:** A fresh snapshot `snapshot:v1:28c08446-d4d8-4bab-bf4c-5122700bbd60` routed the library/launcher Rust implementation, concurrency, persistence, IPC error, compatibility, verification, documentation, and commit scope to 25 standards with zero unresolved fact categories. The 24 normative policy targets were read in one `read_many` call; the remaining route entry was the Router navigation index. Core and Rust profile obligations were available for the implementation review. -- **Confusing or redundant steps:** The first fact set over-reported cross-language binding, platform-target, and release detail; narrowing it to actual IPC/persistence, Rust API/async and resource-lifecycle concerns reduced the route from 35 to 25 while retaining zero unresolved facts. Adding `include_routing: true` to a policy `read_many` rejected the whole batch with `NAVIGATION.ROUTING_TARGET_INVALID` (“Routing definitions are available when reading Router”). Omitting that option allowed policy reads. Expanding all 24 full compact policy bodies still exceeded the visible output window even though the request stayed within the 2 MiB service limit; count limits alone do not bound what the caller can review. -- **Missing context:** The standards service did not know the current source diff, final Sol High review findings, Passeur agent lookup failure, or local command results; those came from source inspection and separate tools. -- **Where I left MCP:** The route supplies obligations, not code compliance or acceptance. A final source repair and review pass remain in progress; Q1 gates stay pending. -- **Smallest sufficient workflow:** Refresh routing facts, route the exact changed boundary, preserve the snapshot handle, read canonical policy bodies without `include_routing`, and focus output on the obligations relevant to the change. -- **Recommendations:** Separate Router navigation reads from canonical policy reads in the input contract; make `include_routing` invalidity specific to the affected target instead of rejecting a multi-policy batch; and add section-scoped or byte-budgeted reads so full route coverage can be reviewed without flooding the response. - -This is tool-usability evidence only and does not certify implementation or product acceptance. - -## Primary integrator — AC06 cleanup-custody regression route - -- **Useful calls:** A fresh snapshot `snapshot:v1:e6fcc079-e95a-4f2e-a39e-47a7e667a20f` routed the Rust service test and durable-cleanup change to 20 standards with zero unresolved facts. Explicitly recording no framework and the observed concurrent-plan-integration condition completed the route. The selected guidance identified the library API, persistence, async custody, concurrency, verification-oracle, implementation, documentation and commit obligations. -- **Confusing or redundant steps:** The initial route returned `needs-facts` for framework applicability and whether outstanding proposals could stale before serial integration. A single `read_many` request for 18 compact policies returned complete policy bodies but exceeded the caller-visible output window and was truncated. Record-count limits do not ensure the bodies can be reviewed together. -- **Missing context:** The standards service did not describe the test harness's actual shared `TaskContext`, local HTTP endpoint, exact retained acquisition state, Passeur preflight error, or test result; those came from repository inspection and execution. -- **Where I left MCP:** The route supplies obligations only. Focused service tests, review of the exact code diff, and plan-gate evidence remain separate. -- **Smallest sufficient workflow:** Route all registered applicability facts explicitly, then read a few canonical policies per call and inspect service source/tests independently. -- **Recommendations:** Offer section-scoped reads or a byte-budgeted result option so a bounded policy count also stays within a reviewable response; keep completed routing clearly separate from implementation and acceptance. - -This records MCP usability only; it does not certify implementation compliance or AC06 acceptance. - -## Primary integrator — AC06 resume-after-pause route - -- **Useful calls:** Snapshot `snapshot:v1:dbfe3a19-c99a-4a48-b98c-1647722d3219` routed the Rust service-test change to 29 standards with zero unresolved facts. Focused reads of concurrency, Rust async, verification oracles, architecture replay, and commit workflow supplied the applicable obligations. -- **Confusing or redundant steps:** One combined `read_many` response repeated results in structured and textual forms and exceeded the useful output window. A `workflow.commit` read returned a transient auto-review timeout message; the tool allowed one retry, and the exact retry succeeded. No approval was rejected. -- **Missing context:** The MCP did not know the current service fixture, test result, candidate diff, independent reviewer findings, or Passeur profile/coordination errors. These were checked with repository and service tools. -- **Where I left MCP:** Routing and policy reads supplied obligations only. Source inspection, `cargo test`, Clippy, formatting, diff checks and independent review provide the separate implementation evidence. None of these close AC06 or AQ-HTTP. -- **Smallest sufficient workflow:** Preserve the full snapshot handle, route the changed implementation/verification boundary, and read only the focused obligations in small batches. Inspect the candidate and run its evidence checks separately. -- **Recommendations:** Avoid repeating full policy results in both structured and text output; keep read results within a caller-reviewable byte budget; make transient auto-review timeout/retry status explicit without obscuring a successful retry. - -This records tool usability only; it does not certify source compliance or product acceptance. - -## Primary integrator — AC04 strict downloads.json duplicate-member reader - -- **Useful calls:** Routing snapshot `snapshot:v1:59cc5242-a838-4fec-b13d-63e6687dacbd` selected 20 standards with zero unresolved applicability facts for the Rust persistence/schema/security boundary. Focused reads covered Core, Rust language and security, implementation, verification, persistence, schema contracts, resilience, code design, commit, security, documentation, planning, and concurrent plan integration. The guidance favored using Serde's existing parser, applying the stricter policy only at the canonical store boundary, preserving fail-closed durable state, and keeping local tests distinct from migration/deployment acceptance. -- **Confusing or redundant steps:** The route returned a complete selected-policy list, while the useful work depended on a smaller set of policy bodies. Keeping the count, unresolved status, and focused read list separate made the scope easier to audit. -- **Missing context:** The MCP did not surface the concrete `serde_json::Value` duplicate-key collapse or enumerate every production downloads.json read path. Source tracing identified both; direct regressions then exercised store eligibility, acquisition/model projections, and consumer receipt paths. -- **Where I left MCP:** It supplied implementation and evidence obligations only. The custom Serde visitor, source diff, 29-test filtered run, strict Clippy result, formatting checks, and independent review are separate evidence. The route does not accept AC04, prove deployed schema-6 safety, or make AQ-HTTP ready. -- **Smallest sufficient workflow:** Reuse the pinned scope snapshot while the admitted boundary is unchanged; read focused persistence, schema, parser-security, verification, documentation, and commit policies; trace every reader; then verify and review the exact candidate independently. -- **Recommendations:** Return policy bodies by section or a response-byte budget, and expose the selected route summary without repeating selection rationale. Keep routing completion clearly separate from code review and acceptance. - -This records Coding-Standards MCP usability only; it is not source review or product acceptance. - -## Primary integrator — AC06 concurrent stale-worker handoff regression - -- **Useful calls:** The post-restart routing-facts read and exact-scope route used snapshot `snapshot:v1:2eab787a-b1be-424e-8195-405814f86ede`; the route selected 24 standards with zero unresolved applicability questions. A focused `read_many` call read 17 relevant policies covering core, Rust/API/async, persistence, concurrency, contracts, architecture, security, planning, implementation, documentation, verification oracles, and concurrent integration. -- **Confusing or redundant steps:** A route request with `detail:"full"` and a 32-policy content page returned a very large response that exceeded the useful output window. Repeating the route compactly and reading the selected policies through a bounded `read_many` response produced a usable result. This repeats the observed need for response byte budgets, not only item-count limits. -- **Missing context:** The MCP did not know the Passeur task result, the exact service-test diff, the Cargo test outcome, or that no other Rust compile was running. Repository inspection and the serialized test command established those facts. -- **Where I left MCP:** The route and policy reads supplied obligations only. Manual source review, the focused passing test, formatting, and diff checks are separate implementation evidence. This neither accepts AC06 nor opens AQ-HTTP. -- **Smallest sufficient workflow:** Refresh registered routing facts, route the exact source and verification boundary, read only applicable policies in compact bounded batches, then record source and test evidence independently. -- **Recommendations:** Keep results byte-bounded even when a whole-policy count is within the declared maximum. Avoid repeating policy bodies in a full route response when a compact route plus focused reads is sufficient. - -This records MCP usability only; it is not source review or product acceptance. - -## Primary integrator — AC02 duplicate `Content-Range` refusal - -- **Useful calls:** Reused routing-facts snapshot `snapshot:v1:60843683-da0a-4154-a24c-df49bda2a6d2`, routed the exact Rust library protocol-parser/test/docs slice, and received a complete 21-standard selection with zero unresolved questions or policies. A focused `read_many` covered contract invariants, protocol adapters, Rust security and independent test oracles before the implementation write set was admitted. -- **Confusing or redundant steps:** `routing_facts` and the compact route exposed usable inputs/results. The route's full result repeated selection reasons across the reading plan; displaying only its status, selected count and unresolved count was easier to inspect. A four-policy read batch returned complete policy bodies with metadata, reinforcing the value of targeted small batches. -- **Missing context:** The MCP did not know that `parse_content_range` selects one value while a resumed 206 can contain duplicate fields, that this value controls append admission, or that the existing ETag parser already rejects duplicates. Source and test inspection established the defect and its minimal boundary. -- **Where I left MCP:** Routing and policy reads supplied obligations only. Repository code, raw HTTP fixtures, independent review and serial tests determine whether the fix works; no route result accepts AC02 or AQ-HTTP. -- **Smallest sufficient workflow:** Reuse the pinned fact snapshot while the slice boundary is unchanged; route the exact protocol/parser/test/docs facts; read the contract, security and oracle policies in a small set; inspect source and tests; then reroute after the final candidate is complete. -- **Recommendations:** Keep complete route status and unresolved facts compact; expose already selected/read policy IDs; make policy text byte-bounded or section-addressable; and preserve a visible distinction between applicability resolution and source/test compliance. -- **Final route refresh:** Reused snapshot `snapshot:v1:60843683-da0a-4154-a24c-df49bda2a6d2` after implementation and evidence review. The exact library/Rust/protocol scope selected 21 standards with zero unresolved applicability questions or policies. It supplies obligations only; the code review, focused test and Q1 gate determine product evidence. - -This records Coding-Standards MCP usability only. Product acceptance and Passeur availability remain recorded separately. - -## Primary integrator — AC06 stale-generation boundary regression route - -- **Useful calls:** The initial route `snapshot:v1:6e207013-b615-4b8e-85ca-4170c3bc1408` and the final source/evidence route `snapshot:v1:a2e24e74-b8f8-40cb-a3b4-762857343697` each selected 17 standards with zero unresolved applicability facts. Ten focused policy reads were repeated against the final snapshot and completed successfully for Rust, async, implementation, verification, oracle, concurrency, replay, contracts, resilience, and persistence guidance. -- **Confusing or redundant steps:** The first route left framework and concurrent-plan-integration applicability unresolved; explicitly setting both to known-absent produced the complete route. The first expanded route response exceeded the useful output window, so the final read was narrowed to the ten policies relevant to this service-level test. -- **Missing context:** The MCP did not know the actual two-generation fixture, the exact `files_ready` guard, the 8/8 focused test result, Clippy result, or Sol High review limits; these came from repository inspection and independent tools. -- **Where I left MCP:** The final route supplied obligations only. The test, focused checks, and review establish a sequential service boundary regression, not full AC06 acceptance. -- **Smallest sufficient workflow:** State framework and concurrent-integration applicability explicitly, route the exact Rust/persistence boundary, then read only directly applicable canonical policies in a caller-reviewable batch. -- **Recommendations:** Bound route response output by bytes as well as selected-policy count, and retain a concise selection summary when full policy text would exceed the caller's useful review window. - -This records tool usability only; it does not certify source compliance or AC06 acceptance. - -## Primary integrator — live-consumer and acceptance-record update - -- **Useful calls:** A fresh route on snapshot `snapshot:v1:ba87accb-a675-4209-8a1a-2163140b4a96` selected 46 standards with zero unresolved applicability facts. The focused reads covered documentation, commit, release, and verification guidance. They reinforced recording real consumer boundaries and evidence scope, staging only the declared documentation slice, and keeping backend system evidence distinct from packaged/UI acceptance. -- **Confusing or redundant steps:** The first route requested six whole policy reads and returned a response large enough to exceed the useful output window. Repeating the route with one content item preserved the complete route summary and zero-unresolved result; focused reads were then issued separately. Fact refresh and routing worked consistently after the session restart. -- **Missing context:** The MCP did not know the actual HF LFS digest, llama.cpp asset ID/digest, isolated host/root facts, Build #357 retry result, or the transient RPC status error. Those were established through the product RPC, acquisition receipt, filesystem, and GitHub run tools. -- **Where I left MCP:** It supplied documentation, commit, release, and verification obligations only. It did not accept AC03/AC15, certify the Rust code, or decide AQ-HTTP readiness; those statuses are grounded in the recorded product and CI observations and remain scoped. -- **Smallest sufficient workflow:** Refresh routing facts, route the full implementation/evidence scope on a fresh snapshot with a small content page, then read only the policies needed for the final docs/commit/verification boundary. -- **Recommendations:** Return route counts and unresolved facts separately from policy bodies; cap results by response bytes as well as whole-policy count, and avoid duplicating selected policy text across content and structured output. - -This records MCP usability only. Product acceptance and source review remain separate. - -## Primary integrator — AC02 validator-bound warm-resume candidate - -- **Useful calls:** The pinned final route (`snapshot:v1:faff0add-81ef-42b1-a2d1-043b012c9643`) selected 30 standards with zero unresolved applicability facts. Focused reads covered Core, persistence boundary, Rust API/async/security, concurrency, contracts and contract evolution, architecture, resilience, code design, verification, build, documentation, and commit workflow. The routing result and the direct source/test evidence remained separate. -- **Confusing or redundant steps:** The route's initial broad policy page was too large to review as one response. Smaller `read_many` batches were usable, but still returned complete policy bodies; the policies' metadata, `next_operations`, and prose were included together. -- **Missing context:** The MCP did not know the exact candidate tree, the twice-reproduced baseline failure, post-fix Cargo results, the shared target/build serialization, or the loopback llama.cpp integration fixture. Git and the repository test output established those facts. -- **Where I left MCP:** The 30-standard route resolved applicability only. It did not inspect or approve the code, verify test execution, or accept AC02/AQ-HTTP. -- **Smallest sufficient workflow:** Reuse the exact snapshot, read only the selected obligations that apply to the final boundary in small batches, and establish candidate identity, review, tests, and acceptance independently from repository evidence. -- **Recommendations:** Keep route counts and unresolved facts visible without repeating policy-selection rationales; make policy reads section-scoped or byte-budgeted; and make the non-certifying role of a completed route explicit. - -This records MCP usability only; it is not evidence of implementation compliance or product acceptance. - -## Primary integrator — AC01 desktop revision pinning implementation - -- **Useful calls:** Refreshed routing facts and routed the completed Rust library/API implementation and verification boundary on snapshot `snapshot:v1:a37ceadd-a5ff-4805-a3b9-b3362c3ea219`. The route selected 25 standards with zero unresolved applicability facts. Focused reads covered Core, the library and Rust API/async/security profiles, persistence, concurrency, contracts/evolution/protocols, architecture/replay, resilience, verification/oracles, planning, documentation, implementation, proportionality, and commit guidance. -- **Confusing or redundant steps:** A large `read_many` request returned complete policy bodies with metadata and continuation records, beyond the useful output window. Narrowing to nine policies reduced irrelevant material but still produced a large response. The route itself gave a concise selected count and unresolved-fact result. -- **Missing context:** The MCP did not know the `start_hf_download` call path, exact local-server request sequence, missing-SHA fixture, lifecycle-task accounting behavior, test results, or strict Clippy result. Those facts came from source inspection and serial local verification. -- **Where I left MCP:** Routing supplied obligations only. The controlled public-entrypoint tests, closed-lifecycle regression, strict Clippy, formatting, and source diff are the separate implementation evidence. None accepts AC01 or AQ-HTTP. -- **Smallest sufficient workflow:** Refresh facts, route the completed boundary with explicit application, language, topic, workflow, and evidence facts, then read only focused policies in small batches and check the source/test contract independently. -- **Recommendations:** Keep policy reads byte-bounded as well as item-bounded; avoid repeating whole policy bodies together with metadata and continuation records; show the route's compact count and unresolved facts separately from policy text. - -This records tool usability only; it does not certify source compliance or product acceptance. - -## Primary integrator — AC10 warm-checkpoint retention admission - -- **Useful calls:** Refreshed facts and routed the Q1 bounded-retention implementation/evidence scope on snapshot `snapshot:v1:f476feaf-6487-405b-8d2d-7742115e342d`. The route selected 22 standards with zero unresolved fact categories. The selected Rust, lifecycle, contracts, architecture/replay, resilience, performance, code-design, oracle, planning, integration, and commit policies supplied the scope and typed-outcome obligations before source changes. -- **Confusing or redundant steps:** `read_many` correctly returned complete policy bodies, but even a four-policy batch exceeded the useful response window because body text and metadata were bundled. Smaller two-policy batches were readable; section-scoped or byte-budgeted retrieval would reduce review overhead. -- **Missing context:** The MCP did not know the current checkpoint map's ownership, cloned-record size, service-view sharing, pause outcome, or existing byte-zero fallback. Repository source and Sol High's read-only architecture audit established those facts. -- **Where I left MCP:** The 22-standard route and policy reads are guidance only. Source review identified the defect; focused tests, exact diff review, and final code review will provide implementation evidence. This does not accept AC10 or AQ-HTTP. -- **Smallest sufficient workflow:** Refresh facts, route the exact slice, read the selected policies in small batches, and record the candidate's real checks independently. -- **Recommendations:** Keep full policy bodies available, but return only requested sections or enforce a response-byte budget so metadata and continuations do not obscure the normative content. -- **Final route refresh:** After implementation, the route was refreshed on snapshot `snapshot:v1:b187217e-0e3f-4b16-b101-74eca1357d5b`; it selected 22 standards with zero unresolved applicability facts and matched the admitted pre-edit scope. The route remains guidance only. Sol High's independent review and the serial local test/lint evidence are recorded separately in the execution ledger. - -This records tool usability only; it does not certify source compliance or product acceptance. - -## Primary integrator — AC01/AC02 Unicode and HTTP header validation - -- **Useful calls:** Refreshed routing facts and routed the exact library/Rust, protocol parsing, Unicode dependency, security, test-oracle, target-evidence, documentation, and commit scope on snapshot `snapshot:v1:01845ea1-06ec-420f-b2f5-678de01c3eee`. The route selected 28 standards with zero unresolved applicability questions. The read request covered Rust, protocol adapters, Rust dependencies/security, verification oracles/platforms, commit, and documentation. -- **Confusing or redundant steps:** One eight-policy `read_many` response exceeded the useful caller output window and was truncated. The route itself remained compact and identified the selected count; smaller policy batches would make the normative text easier to inspect. -- **Missing context:** Routing did not know the exact NFC/lowercase/NFC comparison, which manifest collision namespaces it covered, the duplicate `Content-Encoding` bypass, the module test results, or the separate macOS/hosted-CI evidence gaps. Repository inspection and serial Cargo output established those facts. -- **Where I left MCP:** It supplied implementation, dependency, protocol, test-oracle, platform-evidence, documentation, and commit obligations only. The manifest and HTTP unit modules passed 10/10 and 20/20 respectively; these results and source review are independent evidence. The route does not accept either criterion or AQ-HTTP. -- **Smallest sufficient workflow:** Refresh routing facts after the source boundary changes, provide explicit applicability facts, route once, and read only the policies that govern the changed boundary in small batches. Record the exact candidate and test result separately. -- **Recommendations:** Bound policy responses by bytes as well as item count, and keep selected-policy summaries separate from full policy bodies and continuation metadata. - -This records Coding-Standards MCP usability only; it is not evidence of source compliance or product acceptance. diff --git a/docs/plans/artifact-acquisition/reports/dependency-gates.md b/docs/plans/artifact-acquisition/reports/dependency-gates.md index a4a241b11..d84c41996 100644 --- a/docs/plans/artifact-acquisition/reports/dependency-gates.md +++ b/docs/plans/artifact-acquisition/reports/dependency-gates.md @@ -2,7 +2,9 @@ **Owner:** acquisition integration, with one serial cross-plan integrator. This is the single status record for acquisition-provided gates. The runtime plan references these rows and does not independently declare them ready. -**Local S3 follow-up:** The staging-event and version-qualified identity fixes at verified remote `a606c80b0be41580c7af0583703d9f9af5f2cb44` have focused regression evidence. A test-only successor covers a valid large binding/bundle under the normal live watcher and public GetModel/cold output proof; [qualification](s3-staging-discovery-qualification.md) records 57 focused integration tests, strict Clippy, the failed notifier-replacement experiment and remaining limits. This supports parts of AC13/AC14, without closing AQ-S3 or authorizing live-provider credentials/configuration. +**Status review (2026-11-04, v0.8.0):** All four gates remain **not ready**. Q1 (PR #34) and Q3 (PRs #38, #42, #52 and the 2026-10-09 v0.8 integrations) are merged and ship in 0.8.0, but no gate claim has been accepted on current `main`. The evidence paragraphs below are bound to pre-merge heads and are historical; a gate opens only on fresh current-head evidence. Runtime R1 remains blocked on AQ-HTTP. + +**Local S3 follow-up:** The staging-event and version-qualified identity fixes at verified remote `a606c80b0be41580c7af0583703d9f9af5f2cb44` have focused regression evidence. A test-only successor covers a valid large binding/bundle under the normal live watcher and public GetModel/cold output proof; qualification (`s3-staging-discovery-qualification.md`, removed; see Git history) records 57 focused integration tests, strict Clippy, the failed notifier-replacement experiment and remaining limits. This supports parts of AC13/AC14, without closing AQ-S3 or authorizing live-provider credentials/configuration. **Historical gate evidence before integration:** All gates were not ready. AC03 has real HF and llama.cpp consumer evidence for one Linux x86_64 source-built RPC scope. AC15 is accepted only for its recorded earlier candidate/scope. At Q1 handoff head `b0fef68bb4fdc5b5adc5f1e1a1bdeb4aea467dde`, the app-manager library suite passed 268 tests with 1 ignored in both default and no-default-features configurations; strict all-target Clippy passed in both configurations and scoped rustfmt passed. This is local evidence for the changed app-manager slice only, not branch-wide AC15 qualification. The latest PR-head combined commit status reported CodeRabbit success only; manual Build #36934392505 is recorded separately below. CI on prior remote Q1 head `96a1cbe8999576ca8dc70143201e6e98b0c6a37d` failed the orphan-partial recovery fixture in both default and no-default configurations. The corrected working-tree fixture passed its focused test in both configurations; full exact-head CI remains pending. Native AC05 evidence includes same-process receiptless and returned-error recovery fixtures plus a Linux x86_64 subprocess fixture killed by SIGKILL after durable destination rename and parent-directory syncs but before installed metadata publication. The subprocess test verifies cold-owner settlement and no request to its controlled loopback endpoint through both recoveries and a bounded drain. This establishes one process-loss boundary only, not power-loss or full AC05 evidence; the receiptless fixture retains only a partial orphan output. The real HF near-settlement `get_model_download_status` error (`-32603`), mutable `main` reference, schema-7 deployment population, old-writer exclusion, rollback and root disposition remain open. Independent AC18 source review found no substantiated ownership defect in migrated HF and llama.cpp paths; public-caller dispositions, future wheel/S3 composition, and complete architecture acceptance remain pending. Build #358 passed on the earlier documentation-only PR head, including Windows native QA. The other required Q1 claims and broader desktop, deployment, resource, public-client, shutdown and platform scopes remain open. **Current integration qualification:** [Build 37141872406](https://github.com/MrScripty/Pumas-Library/actions/runs/37141872406) passed all seven ordinary jobs on `0dd38c707125facfdaae29c82704213e85ceb155` (tree `7611df7a568d56807589bb2dca2bfbb03e484dd0`): workflow/release contracts, frontend/desktop, strict Rust quality, headless without inference, and native Linux/macOS/Windows. This is exact-head supporting AC15 evidence for the checks that ran. Release archives and native model E2E remain unqualified; AQ-HTTP, external review disposition and maintainer integration remain pending. Review repairs after this head require fresh exact-head qualification. Outstanding AQ-HTTP evidence includes the broader acceptance matrix, retained-deployment migration/old-writer safety, representative resource bounds and public-client compatibility. @@ -17,7 +19,7 @@ | Gate | Provider milestone / claims | Required consumer observation | Unblocks | Current status | | --- | --- | --- | --- | --- | -| AQ-HTTP | Q1 / AC01–AC10, AC15, AC16, AC18 | Existing HF model acquisition reaches awaited model import; existing llama.cpp installer consumes the same neutral verified-file handoff and reaches its own validated extraction/publication. Cancellation/restart/UI evidence included. | Runtime R1 on the qualified targets. | Q1 in progress; not ready; AC03 accepted for recorded scope; AC15 integration-head ordinary checks passed in Build 37141872406; review-repair head requalification pending; AC07 has one bounded Linux local controlled-403/explicit-refresh consumer regression; AC01/AC08/AC16 have one bounded Linux public-core mixed-size status-poll/import-settlement fixture, one header percentage projection regression (`0.42` → `42%`, 28 component tests), one retained paused-status `/rpc` regression (1/1, stable identity/bytes/fraction, bounded shutdown), one retained paused cancellation/isolation/reopen `/rpc` regression (1/1, target-only cleanup, keeper preservation, durable inventory and same-process reconstruction), one retained weak-selection resume-refusal `/rpc` regression (1/1, exact public error and unchanged paused projection, full inventory and files across refusal/reopen), and one digest-backed retained resume/import-settlement `/rpc` regression (1/1, complete 24-byte payload stays `Downloading` at the held real importer write, then settles to receipt-backed `Completed`). AC10 has one bounded local two-worker HF saturation regression (1/1, typed admission refusal preserves durable/source state, retry reaches import after worker drainage), which does not measure representative resource envelopes; bounded AC18 source review found no defect in migrated HF/native paths but full scope remains open. The new RPC fixture uses complete retained bytes and does not exercise live HTTP continuation or diagnose the historical `-32603` | +| AQ-HTTP | Q1 / AC01–AC10, AC15, AC16, AC18 | Existing HF model acquisition reaches awaited model import; existing llama.cpp installer consumes the same neutral verified-file handoff and reaches its own validated extraction/publication. Cancellation/restart/UI evidence included. | Runtime R1 on the qualified targets. | Q1 merged (PR #34); not ready; AC03 accepted for recorded scope; AC15 integration-head ordinary checks passed in Build 37141872406; review-repair head requalification pending; AC07 has one bounded Linux local controlled-403/explicit-refresh consumer regression; AC01/AC08/AC16 have one bounded Linux public-core mixed-size status-poll/import-settlement fixture, one header percentage projection regression (`0.42` → `42%`, 28 component tests), one retained paused-status `/rpc` regression (1/1, stable identity/bytes/fraction, bounded shutdown), one retained paused cancellation/isolation/reopen `/rpc` regression (1/1, target-only cleanup, keeper preservation, durable inventory and same-process reconstruction), one retained weak-selection resume-refusal `/rpc` regression (1/1, exact public error and unchanged paused projection, full inventory and files across refusal/reopen), and one digest-backed retained resume/import-settlement `/rpc` regression (1/1, complete 24-byte payload stays `Downloading` at the held real importer write, then settles to receipt-backed `Completed`). AC10 has one bounded local two-worker HF saturation regression (1/1, typed admission refusal preserves durable/source state, retry reaches import after worker drainage), which does not measure representative resource envelopes; bounded AC18 source review found no defect in migrated HF/native paths but full scope remains open. The new RPC fixture uses complete retained bytes and does not exercise live HTTP continuation or diagnose the historical `-32603` | | AQ-PACKAGES | Q2 / AC11, AC12 plus affected AQ-HTTP regressions | Existing Torch package integration consumes an approved exact wheel set locally with network denied during installation; no new adapter registry needed. | Runtime R2 after R1. | Not ready | | AQ-S3 | Q3 / AC13, AC14 plus source-independent regressions | The same manifest/transfer/handoff contract works with version/credential/range conditions on AWS S3, one non-AWS compatible service and local MinIO; an S3-sourced model completes import and is observed through GetModel or EnsureModel. | Runtime or model S3 acquisition on qualified endpoint/target combinations. | Not ready | | AQ-COMPLETE | Q4 / AC01–AC18 and all milestones accepted | Actual installed/public/native consumers and source-migration/deletion dispositions satisfy the complete acquisition scope. | Acquisition plan acceptance; not a hidden prerequisite for HTTP-only runtime work. | Not ready | @@ -80,7 +82,7 @@ A worker may propose a contract change but cannot independently change the share `9544e16dde7802baa2033bf7ceea7d44c2ba3767`) passes one Linux synthetic 512 MiB public HF transfer through the real importer/receipt settlement in separate default/no-default processes. Inode continuity, retained-file inventory and raw memory/I/O are bound in the -[report](ac10-public-hf-measurement-2026-10-06.md); broader resource/platform/ +report (`ac10-public-hf-measurement-2026-10-06.md`, removed; see Git history); broader resource/platform/ provider claims remain unqualified. AC10 and AQ-HTTP stay pending. Q2 remains gated and has no new admitted source work: approved exact wheel closure, shared verified local wheel handoff, denied-network local-only child consumption, @@ -97,7 +99,7 @@ cases in each default/no-default mode, one public HF status/import control in each, and strict Clippy in three feature modes pass. This supports bounded AC02/AC06/AC10/AC15 behavior only. Already registered writes drain before return; no hard filesystem/verification/import/child-cleanup return deadline is claimed. -See [http-elapsed-budget-qualification-2026-10-06](http-elapsed-budget-qualification-2026-10-06.md) for exact logs and independent source reviews. +See http-elapsed-budget-qualification-2026-10-06 (`http-elapsed-budget-qualification-2026-10-06.md`, removed; see Git history) for exact logs and independent source reviews. No public shape, S3/native frozen source, generator or Q2 writes. AQ-HTTP remains not ready; broader acceptance, current-head hosted checks, resource/platform/UI, public-client and deployment dispositions remain pending. Q2 exact local package diff --git a/docs/plans/artifact-acquisition/reports/hf-status-diagnostics-2026-10-09.md b/docs/plans/artifact-acquisition/reports/hf-status-diagnostics-2026-10-09.md deleted file mode 100644 index c9c05f633..000000000 --- a/docs/plans/artifact-acquisition/reports/hf-status-diagnostics-2026-10-09.md +++ /dev/null @@ -1,30 +0,0 @@ -# Sanitized HF download-status diagnostics — 2026-10-09 - -This bounded change preserves the existing public `get_model_download_status` response and error contract while distinguishing failure stages in private structured logs. It is based on commit `23f783b4d7d06965d623a6b809b1c9ec69bdb059` (tree `9c8872353d41b8f02d156dac4ccb5dc40458d9ff`). It does not diagnose or repair the historical HF `-32603` observation. - -## Behavior and privacy - -The production getter feeds a shared private projection helper. Failed state lookups emit `state_lookup` / `domain_lookup`. The existing DTO validation path emits `outcome_validation` with a closed `library_model_id` or `numeric_evidence` category. Validation predicate order, original domain errors, DTO fields, missing-download behavior and public error envelopes remain unchanged. There is no category inferred by parsing domain messages. - -An INFO-level async request span covers dispatch, projection, serialization and final response construction. It adds a process-local `rpc_call_id`, an allowlisted method label and the existing numeric-only safe request ID. String request IDs still echo on the wire but are omitted from logs. Parameters, download/repository/model identifiers, raw domain errors, raw progress numeric evidence, paths, credentials and URLs are not added to diagnostic events. Serialization failures have a static `serialization` / `outcome_serialization` label. Successful status calls add no INFO event with the default subscriber configuration. - -Correlation requires the consumer to retain these logs. The process-local counter is neither durable nor a global identity, and does not recover missing historical evidence. Serialization failure labeling was source-reviewed; no synthetic serializer-failure runtime witness is claimed. - -Dispatch is heap-pinned at the request boundary to avoid increasing the nested async future's stack footprint. This adds one bounded allocation per admitted RPC. An initial unboxed implementation aborted the unit suite with a stack overflow; the boxed implementation passes that exact regression without changing thread stack limits. - -## Validation - -All Rust commands use locked, offline official dependencies, `ORT_SKIP_DOWNLOAD=1`, one build job and the existing shared target directory. The diagnostic fixtures are synthetic projection/transport tests: they exercise the same projection helper and response construction, not an HF transfer or a historical snapshot. - -- Final RPC binary suite with `--no-default-features --features s3,export-contract,test-support`: 248 passed, 0 failed, 2 existing ignored; 92.16 seconds test runtime. Log SHA256 `53971d99a16b5ab510810ab72570e7c29f83d5f39e9e1c753bb63e7d4e38eb8a`. -- RPC-only Clippy (`--no-deps`, binary and tests, `-D warnings -A dead_code`): passed. Log SHA256 `bee41ca6d69824a800e7de6689da2b150e5311f33065e17909157a8e5312864e`. The dead-code allowance covers inherited no-inference contract fields. -- All-feature production compile check (`cargo check --locked --offline -p pumas-rpc --all-features --bin pumas-rpc`): passed. Log SHA256 `485db2640383513f7e230a4588f1821e9eecdffd4b68ef34a1497097882b7c6c`. This compiles gated routes; it executes no inference. -- Formatting (`cargo fmt --all -- --check`) and whitespace (`git diff --check`) checks: passed. - -The fixtures cover state-lookup, invalid-library-ID and nonfinite-numeric failures; exact original static public errors and string-ID wire echo; omitted private sentinels; unchanged valid/missing responses; and concurrent calls that yield between stage and final events while retaining distinct request correlation. The previously failing backend-setup admission case also passed separately after boxing. - -Dependency-inclusive Clippy is blocked by four existing lints in unchanged core files: `nonminimal_bool` in `model_library/library/projection.rs:164`, and `type_complexity` in `api/reconciliation.rs:547,556,732`. No unrelated core fix or repository-wide Clippy pass is claimed. Earlier failed compilation, stack-overflow and target-only Clippy iterations are retained as failed iterations in local evidence, not qualifying runs. - -## Boundaries - -This is source and Linux unit/compile qualification. It does not qualify a newly released executable, real model inference, a provider campaign or a native consumer against this new source. The earlier pinned Chrema consumer qualification and its binary remain separate and unchanged. No Cargo ONNX download, untrusted ONNX load, model inference, S3 retry, credentials, global Python, physical-store recovery, main merge, release, tag or version bump is included. diff --git a/docs/plans/artifact-acquisition/reports/http-elapsed-budget-2026-10-06/command-logs.tar.gz b/docs/plans/artifact-acquisition/reports/http-elapsed-budget-2026-10-06/command-logs.tar.gz deleted file mode 100644 index 8d0396a6c..000000000 Binary files a/docs/plans/artifact-acquisition/reports/http-elapsed-budget-2026-10-06/command-logs.tar.gz and /dev/null differ diff --git a/docs/plans/artifact-acquisition/reports/http-elapsed-budget-2026-10-06/evidence.json b/docs/plans/artifact-acquisition/reports/http-elapsed-budget-2026-10-06/evidence.json deleted file mode 100644 index 0bd1a4de0..000000000 --- a/docs/plans/artifact-acquisition/reports/http-elapsed-budget-2026-10-06/evidence.json +++ /dev/null @@ -1,572 +0,0 @@ -{ - "schema_version": 1, - "manifest": { - "branch": "feat/acquisition-http-budget-0c02dcfb", - "base": "0c02dcfb81a0f7ab2a3858c2b5cee329816b3ce5", - "base_tree": "78c663ed397264284cb95662d49a3354380755d4", - "final_source_blob": "83478facd105a08f8a52e36e6ce9780d09e76d2a", - "final_source_sha256": "3e611252c15f6c87aa2f4f22519d1ed80b2dbe1f22855089b77cb8aeec839c4f", - "selected_feature": "enforce existing positive HTTP per-file elapsed source-wait budget across headers/body/retries/backoff", - "versions": { - "rustc": "1.92.0 (ded5c06cf 2025-12-08)", - "cargo": "1.92.0 (344c4567c 2025-10-21)", - "tokio_locked": "1.49.0" - }, - "build_settings": { - "CARGO_BUILD_JOBS": "1", - "CARGO_INCREMENTAL": "0", - "CARGO_PROFILE_DEV_DEBUG": "0", - "CARGO_PROFILE_TEST_DEBUG": "0", - "CARGO_TARGET_DIR": "/workspace/Pumas-Library/rust/target", - "offline": true, - "locked": true - }, - "reviews": { - "spec": { - "agent": "/root/q4_next_scope", - "source_blob": "83478facd105a08f8a52e36e6ce9780d09e76d2a", - "result": "ACK; no remaining concrete finding; per-poll clock guard resolves cooperative-timer finding" - }, - "standards": { - "agent": "/root/installed_harness_audit", - "source_blob": "83478facd105a08f8a52e36e6ce9780d09e76d2a", - "result": "ACK; no actionable finding; effect drainage, fixture root retention and S3 preservation confirmed" - } - }, - "public_API": "No public shape or signature changes. Positive elapsed now bounds HTTP source waits; explicit zero remains opt-out. Attempt limits and S3 behavior unchanged.", - "scope_limits": [ - "Guard is cooperative: does not preempt an active poll or filesystem syscall.", - "Registered effects drain even after expiry; no hard caller return deadline.", - "Local verification, consumer/import/install and cleanup have no new transfer deadline.", - "Linux synthetic loopback/core evidence only; hosted, real provider, supported platform and full AQ-HTTP acceptance remain pending." - ], - "source_head": "0950c4d5839608c8dd5f52afcb3fd2424a9a1656", - "source_tree": "55c7dea28bae397ee9d70995897c5ff0c8e2a672" - }, - "commands": { - "cwd": "/workspace/Pumas-Library-s3-installed-prefix-main95", - "commands": [ - { - "name": "red", - "argv": [ - "/tmp/pumas-cargo-admission/run-cargo-serialized", - "test", - "--offline", - "--manifest-path", - "rust/Cargo.toml", - "--locked", - "-p", - "pumas-library", - "--lib", - "http_elapsed_budget_", - "--", - "--nocapture", - "--test-threads=1" - ], - "environment_overrides": { - "CARGO_PROFILE_DEV_DEBUG": "0", - "CARGO_PROFILE_TEST_DEBUG": "0" - }, - "log": "red.log", - "exit": 101, - "source_blob": "5a6bf253b9cd3c0048570388d6cec8f8e0ea784e" - }, - { - "name": "intermediate-nine", - "argv": [ - "/tmp/pumas-cargo-admission/run-cargo-serialized", - "test", - "--offline", - "--manifest-path", - "rust/Cargo.toml", - "--locked", - "-p", - "pumas-library", - "--lib", - "http_elapsed_budget_", - "--", - "--nocapture", - "--test-threads=1" - ], - "environment_overrides": { - "CARGO_PROFILE_DEV_DEBUG": "0", - "CARGO_PROFILE_TEST_DEBUG": "0" - }, - "log": "green-intermediate-nine-controls.log", - "exit": 0, - "source_blob": "0c7c312bc980f9c4879f2749c4b8ea96d2b417dd" - }, - { - "name": "before-clock-guard", - "argv": [ - "/tmp/pumas-cargo-admission/run-cargo-serialized", - "test", - "--offline", - "--manifest-path", - "rust/Cargo.toml", - "--locked", - "-p", - "pumas-library", - "--lib", - "acquisition::", - "--", - "--nocapture", - "--test-threads=1" - ], - "environment_overrides": { - "CARGO_PROFILE_DEV_DEBUG": "0", - "CARGO_PROFILE_TEST_DEBUG": "0" - }, - "log": "default-acquisition-before-clock-guard.log", - "exit": 0, - "source_blob": "091cab4e73317a9d8f047a01a4deb9392dca1bda" - }, - { - "name": "no-default-acquisition", - "argv": [ - "/tmp/pumas-cargo-admission/run-cargo-serialized", - "test", - "--offline", - "--manifest-path", - "rust/Cargo.toml", - "--locked", - "-p", - "pumas-library", - "--lib", - "--no-default-features", - "acquisition::", - "--", - "--nocapture", - "--test-threads=1" - ], - "environment_overrides": { - "CARGO_PROFILE_DEV_DEBUG": "0", - "CARGO_PROFILE_TEST_DEBUG": "0" - }, - "log": "no-default-acquisition.log", - "exit": 0, - "source_blob": "83478facd105a08f8a52e36e6ce9780d09e76d2a" - }, - { - "name": "intermediate-compile-error", - "argv": [ - "/tmp/pumas-cargo-admission/run-cargo-serialized", - "test", - "--offline", - "--manifest-path", - "rust/Cargo.toml", - "--locked", - "-p", - "pumas-library", - "--lib", - "http_elapsed_budget_", - "--", - "--nocapture", - "--test-threads=1" - ], - "log": "green-compile-error.log", - "exit": 101, - "source_blob": "5f1d0bd5a7a85d8c8ee53c8cb36157d0f1a8ada9", - "note": "TempDir moved before later path assertion; repaired using owned state_path" - }, - { - "name": "default-acquisition", - "argv": [ - "/tmp/pumas-cargo-admission/run-cargo-serialized", - "test", - "--offline", - "--manifest-path", - "rust/Cargo.toml", - "--locked", - "-p", - "pumas-library", - "--lib", - "acquisition::", - "--", - "--nocapture", - "--test-threads=1" - ], - "environment_overrides": { - "CARGO_PROFILE_DEV_DEBUG": "0", - "CARGO_PROFILE_TEST_DEBUG": "0" - }, - "log": "default-acquisition.log", - "exit": 0, - "source_blob": "83478facd105a08f8a52e36e6ce9780d09e76d2a" - }, - { - "name": "default-hf-download", - "argv": [ - "/tmp/pumas-cargo-admission/run-cargo-serialized", - "test", - "--offline", - "--manifest-path", - "rust/Cargo.toml", - "--locked", - "-p", - "pumas-library", - "--lib", - "model_library::hf::download::tests::", - "--", - "--test-threads=1" - ], - "environment_overrides": { - "CARGO_PROFILE_DEV_DEBUG": "0", - "CARGO_PROFILE_TEST_DEBUG": "0" - }, - "log": "default-hf-download.log", - "exit": 0, - "source_blob": "83478facd105a08f8a52e36e6ce9780d09e76d2a" - }, - { - "name": "default-hf-public-control", - "argv": [ - "/tmp/pumas-cargo-admission/run-cargo-serialized", - "test", - "--offline", - "--manifest-path", - "rust/Cargo.toml", - "--locked", - "-p", - "pumas-library", - "--lib", - "public_hf_status_poll_tracks_mixed_size_download_through_receipt_settlement", - "--", - "--test-threads=1" - ], - "environment_overrides": { - "CARGO_PROFILE_DEV_DEBUG": "0", - "CARGO_PROFILE_TEST_DEBUG": "0" - }, - "log": "default-hf-public-control.log", - "exit": 0, - "source_blob": "83478facd105a08f8a52e36e6ce9780d09e76d2a" - }, - { - "name": "default-clippy", - "argv": [ - "/tmp/pumas-cargo-admission/run-cargo-serialized", - "clippy", - "--offline", - "--manifest-path", - "rust/Cargo.toml", - "--locked", - "-p", - "pumas-library", - "--all-targets", - "--", - "-D", - "warnings" - ], - "environment_overrides": { - "CARGO_PROFILE_DEV_DEBUG": "0", - "CARGO_PROFILE_TEST_DEBUG": "0" - }, - "log": "default-clippy.log", - "exit": 0, - "source_blob": "83478facd105a08f8a52e36e6ce9780d09e76d2a" - }, - { - "name": "no-default-hf-download", - "argv": [ - "/tmp/pumas-cargo-admission/run-cargo-serialized", - "test", - "--offline", - "--manifest-path", - "rust/Cargo.toml", - "--locked", - "-p", - "pumas-library", - "--lib", - "--no-default-features", - "model_library::hf::download::tests::", - "--", - "--test-threads=1" - ], - "environment_overrides": { - "CARGO_PROFILE_DEV_DEBUG": "0", - "CARGO_PROFILE_TEST_DEBUG": "0" - }, - "log": "no-default-hf-download.log", - "exit": 0, - "source_blob": "83478facd105a08f8a52e36e6ce9780d09e76d2a" - }, - { - "name": "no-default-hf-public-control", - "argv": [ - "/tmp/pumas-cargo-admission/run-cargo-serialized", - "test", - "--offline", - "--manifest-path", - "rust/Cargo.toml", - "--locked", - "-p", - "pumas-library", - "--lib", - "--no-default-features", - "public_hf_status_poll_tracks_mixed_size_download_through_receipt_settlement", - "--", - "--test-threads=1" - ], - "environment_overrides": { - "CARGO_PROFILE_DEV_DEBUG": "0", - "CARGO_PROFILE_TEST_DEBUG": "0" - }, - "log": "no-default-hf-public-control.log", - "exit": 0, - "source_blob": "83478facd105a08f8a52e36e6ce9780d09e76d2a" - }, - { - "name": "no-default-clippy", - "argv": [ - "/tmp/pumas-cargo-admission/run-cargo-serialized", - "clippy", - "--offline", - "--manifest-path", - "rust/Cargo.toml", - "--locked", - "-p", - "pumas-library", - "--all-targets", - "--no-default-features", - "--", - "-D", - "warnings" - ], - "environment_overrides": { - "CARGO_PROFILE_DEV_DEBUG": "0", - "CARGO_PROFILE_TEST_DEBUG": "0" - }, - "log": "no-default-clippy.log", - "exit": 0, - "source_blob": "83478facd105a08f8a52e36e6ce9780d09e76d2a" - }, - { - "name": "s3-clippy", - "argv": [ - "/tmp/pumas-cargo-admission/run-cargo-serialized", - "clippy", - "--offline", - "--manifest-path", - "rust/Cargo.toml", - "--locked", - "-p", - "pumas-library", - "--features", - "s3", - "--all-targets", - "--", - "-D", - "warnings" - ], - "environment_overrides": { - "CARGO_PROFILE_DEV_DEBUG": "0", - "CARGO_PROFILE_TEST_DEBUG": "0" - }, - "log": "s3-clippy.log", - "exit": 0, - "source_blob": "83478facd105a08f8a52e36e6ce9780d09e76d2a" - }, - { - "name": "rustfmt-missing-env", - "argv": [ - "/workspace/.pumas-tools/cargo/bin/rustfmt", - "--edition", - "2021", - "--check", - "rust/crates/pumas-core/src/acquisition/service.rs" - ], - "exit": 1, - "log": "rustfmt-missing-env.log", - "source_blob": "83478facd105a08f8a52e36e6ce9780d09e76d2a", - "note": "tool invoked without repository toolchain environment; rustup attempted unwritable default home; no formatting ran" - }, - { - "name": "final-rustfmt", - "argv": [ - "rustfmt", - "--edition", - "2021", - "--check", - "rust/crates/pumas-core/src/acquisition/service.rs" - ], - "exit": 0, - "log": "final-rustfmt.log", - "source_blob": "83478facd105a08f8a52e36e6ce9780d09e76d2a", - "environment_setup": "source /workspace/.pumas-tools/env.sh" - }, - { - "name": "final-diff-check", - "argv": [ - "git", - "diff", - "--check" - ], - "exit": 0, - "log": "final-diff-check.log", - "source_blob": "83478facd105a08f8a52e36e6ce9780d09e76d2a", - "environment_setup": null - } - ] - }, - "archive": { - "name": "command-logs.tar.gz", - "bytes": 27892, - "sha256": "57dbd811aff7d00665a881bed8360d1ed701bf9cf0c56aba80d699a5122a1674", - "members": [ - { - "name": "cache-restoration.json", - "bytes": 1730, - "sha256": "1d799944ff540946970742161de7a0215788ead1786ccbaaae37ef698d4291b7" - }, - { - "name": "commands.json", - "bytes": 9629, - "sha256": "98caad12ac5b213b9df8c236e3a141c0831a7f8d12b4a9ef5591f47085200d0d" - }, - { - "name": "default-acquisition-before-clock-guard.log", - "bytes": 19678, - "sha256": "b311a4a84ebd1527327b4deeb1ef73d11bc935abe3bbe3060ddbaa11f4d5a946" - }, - { - "name": "default-acquisition.log", - "bytes": 19678, - "sha256": "f95511e288b7d259c0b4b305ccd2486bd8d99566f16b58ddcc056f7d5132b8da" - }, - { - "name": "default-clippy.log", - "bytes": 172, - "sha256": "401ebcf92f2d03393101abf5f589be4b38fd914c9798c7406da81ca48302772f" - }, - { - "name": "default-hf-download.log", - "bytes": 22221, - "sha256": "7652a33821c55e5eaeb2b5d47fbb2b4467fdfdaa2a6ce3118638acc35a9da715" - }, - { - "name": "default-hf-public-control.log", - "bytes": 395, - "sha256": "904874c03a19df116868bae5c7900fd8cba7bb99796cf503dd9819f908514809" - }, - { - "name": "final-diff-check.log", - "bytes": 0, - "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" - }, - { - "name": "final-rustfmt.log", - "bytes": 0, - "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" - }, - { - "name": "green-compile-error.log", - "bytes": 1112, - "sha256": "de48093a6ed9fff58a773c4bf4c8edea644a3f4d7fea614e83c6776c22af9bd7" - }, - { - "name": "green-intermediate-nine-controls.log", - "bytes": 1223, - "sha256": "be4084edd9b4f127e17f489912173bdfd132caa0ae5d0cd220f9543744db5823" - }, - { - "name": "identity-after-source.json", - "bytes": 234, - "sha256": "990d29f36403185d49079f7064d902e72b502e3d1ee9e417f4e8b7cec1273231" - }, - { - "name": "identity-before-source.json", - "bytes": 160, - "sha256": "e8b0de26f9aeb4af0a2175e3d9b74815f9d091f60b88ff6370d258a6866e9127" - }, - { - "name": "no-default-acquisition.log", - "bytes": 19678, - "sha256": "11bc3acd208b78ec543bf5168e1a3804886e0bbdfddbf354d9d6fec88d32bd66" - }, - { - "name": "no-default-clippy.log", - "bytes": 172, - "sha256": "87b4fa688e6ddda7bfb9df2c38f9343f25eae14ed7e9f35aed132c46a98d34b9" - }, - { - "name": "no-default-hf-download.log", - "bytes": 22221, - "sha256": "b66a8e7c298043211d0c997fd435e086867844fb42a6560d60a6a15a1be16f59" - }, - { - "name": "no-default-hf-public-control.log", - "bytes": 395, - "sha256": "55bb1e39e79af8e277ad7b4ff82694fcaed462cd63bd90d97072d574847dd299" - }, - { - "name": "onnx-build-policy.json", - "bytes": 470, - "sha256": "b3935f8ee43e2a6e19fcee087e3cc5d32afa9e37f34725f376cde3fafb62d2d9" - }, - { - "name": "parked-owned-cache.json", - "bytes": 450, - "sha256": "7ec032023eca7f782783edf7ddd25dc8c1e17559042f15bb0d6bffb5e40b1df3" - }, - { - "name": "red-source-blob.txt", - "bytes": 41, - "sha256": "7c3ab77ce0784636001e177448e84d3ce19d33c84d032963141cbdd288fae600" - }, - { - "name": "red-test-only.patch", - "bytes": 19923, - "sha256": "b1c75ac0d6cc3b0a7a5c9b495e794273906c92b8650f54f727da86c17a602957" - }, - { - "name": "red.log", - "bytes": 3235, - "sha256": "ce14cbedbcc2fa03e5a37d9b430558df797cdebb4ad74f54931e6c4d3803745e" - }, - { - "name": "removed-intermediate-default-cache.json", - "bytes": 322, - "sha256": "3707da80f5af5fd6dabcfaefdb1d272604f79275fd186490fd2dd8c279683622" - }, - { - "name": "removed-owned-unit-cache.json", - "bytes": 597, - "sha256": "a2253de561099733ef15ef86ed66452736fdc4f8da70705e6c7d19a33d16d20e" - }, - { - "name": "run-cargo-serialized.sh", - "bytes": 235, - "sha256": "42c3338ccaa7ea1d34f0a7a9b3f8e8fb0551a6f40b8aaeee9afda1359d690730" - }, - { - "name": "run-checks.py", - "bytes": 1654, - "sha256": "e6c05ccb468eb87ab296030c65cde16f15d30e7a420d642ad1adb227ba2bf19c" - }, - { - "name": "run-manifest.json", - "bytes": 2092, - "sha256": "082103281f75888f9b9c8341e28dcb57761ab8c02b64d2e6da4b538bd0381743" - }, - { - "name": "rustfmt-missing-env.log", - "bytes": 99, - "sha256": "ff4d4f6fe753fcbc5e86a231ea2e8eb2ab546a884d5aa7c3b545dfae4f45d6fd" - }, - { - "name": "rustfmt.log", - "bytes": 0, - "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" - }, - { - "name": "s3-clippy.log", - "bytes": 172, - "sha256": "bb89a8d2d9e68bf04ff2f19f6e8aa73c6bfc6e77a6bfa900f2ae6bd2e9d11965" - } - ] - }, - "final_results": "Final-source acquisition-filter tests pass **153/153 in default and 153/153 in no-default** (including all ten new controls). HF download tests pass **192/192 in each configuration**; mixed-size public HF status/import/receipt controls pass **1/1 in each**. Strict all-target core Clippy with warnings denied passes in default, no-default and default-plus-S3. Scoped rustfmt and `git diff --check` pass. These are affected-slice checks, not full workspace or hosted qualification.", - "historical_failures": "red and intermediate compile exit101 retained; historical passes do not qualify final blob", - "identity_note": "source commit before/after evidence archived; evidence successor effective identities verified at commit" -} diff --git a/docs/plans/artifact-acquisition/reports/http-elapsed-budget-2026-10-06/post-main-evidence.json b/docs/plans/artifact-acquisition/reports/http-elapsed-budget-2026-10-06/post-main-evidence.json deleted file mode 100644 index 27bd76470..000000000 --- a/docs/plans/artifact-acquisition/reports/http-elapsed-budget-2026-10-06/post-main-evidence.json +++ /dev/null @@ -1,105 +0,0 @@ -{ - "schema_version": 1, - "merge_head": "6385a4931ca2ebd21f7c8af83b087d5f2cf6b9a1", - "merge_tree": "a2d461188d622cf123fb4d7464602fc913fc831a", - "parents": [ - "9470f4882216097f86114ec53e086d9f15b24e00", - "1c1c7875ff8fc43b3ad1957fb2a94d44c850716c" - ], - "accepted_main": "1c1c7875ff8fc43b3ad1957fb2a94d44c850716c", - "accepted_main_tree": "8c27d77e7d31ed13f85db77a8c155f15a7fbe693", - "rust_subtree": "0bd482ac031078865f944efeec6dad4d7d825530", - "rust_subtree_matches_tested_source_0950c4d5": true, - "http_owner_blob": "83478facd105a08f8a52e36e6ce9780d09e76d2a", - "commands": [ - { - "name": "post-main-default", - "argv": [ - "/tmp/pumas-cargo-admission/run-cargo-serialized", - "test", - "--offline", - "--manifest-path", - "rust/Cargo.toml", - "--locked", - "-p", - "pumas-library", - "--lib", - "http_elapsed_budget_", - "--", - "--nocapture", - "--test-threads=1" - ], - "log": "post-main-default.log", - "exit": 0, - "environment_overrides": { - "CARGO_PROFILE_DEV_DEBUG": "0", - "CARGO_PROFILE_TEST_DEBUG": "0" - } - }, - { - "name": "post-main-no-default", - "argv": [ - "/tmp/pumas-cargo-admission/run-cargo-serialized", - "test", - "--offline", - "--manifest-path", - "rust/Cargo.toml", - "--locked", - "-p", - "pumas-library", - "--lib", - "--no-default-features", - "http_elapsed_budget_", - "--", - "--nocapture", - "--test-threads=1" - ], - "log": "post-main-no-default.log", - "exit": 0, - "environment_overrides": { - "CARGO_PROFILE_DEV_DEBUG": "0", - "CARGO_PROFILE_TEST_DEBUG": "0" - } - } - ], - "result": "10/10 deadline controls in each default/no-default; original 9 Cargo checks retained on identical Rust subtree; no broad/hosted requalification claim", - "archive": { - "name": "post-main-logs.tar.gz", - "bytes": 1350, - "sha256": "4cdb4f46b8e41cd1e81ed0c11fce0a2715839ed4409261beb3268d8585c9f4d3", - "members": [ - { - "name": "post-main-default.log", - "bytes": 1216, - "sha256": "2fb7d436d06e93cd2396a8b23afa8ee4c4443a6e10388dd3c5ea8e76384af169" - }, - { - "name": "post-main-no-default.log", - "bytes": 1216, - "sha256": "925eb8b8d12b3dfe6c1eb23012db3bf696cde5916636570dc395841f4a16b1e6" - }, - { - "name": "post-main-commands.json", - "bytes": 1086, - "sha256": "eebc3837daec2ab5fd57d623f6ee25b9b93c23b0b15c041ee14ecad56bdb7b13" - }, - { - "name": "identity-before-main-merge.json", - "bytes": 160, - "sha256": "7bc8b19ee271e6043d3ba4df21fa61f8cf87a9a4d44d8eb789bdb8e22d62333f" - }, - { - "name": "identity-after-main-merge.json", - "bytes": 332, - "sha256": "fcb3f30cb70dcdbeccc4d4163249283ac332c44e1cd03d67c1f4c8679890a509" - } - ] - }, - "original_archive_sha256": "57dbd811aff7d00665a881bed8360d1ed701bf9cf0c56aba80d699a5122a1674", - "preserved_ancestry": [ - "0c02dcfb81a0f7ab2a3858c2b5cee329816b3ce5", - "63123fd8f9f866064a8315096ab3fb1fc81e8f0f", - "05717338c2aea737483fb4b28c3ed4053a65de96" - ], - "scope": "Normal merge; no source rewrite, failure-log replacement, credential provisioning or ONNX acquisition. Parent monitors postmerge main CI independently." -} diff --git a/docs/plans/artifact-acquisition/reports/http-elapsed-budget-2026-10-06/post-main-logs.tar.gz b/docs/plans/artifact-acquisition/reports/http-elapsed-budget-2026-10-06/post-main-logs.tar.gz deleted file mode 100644 index 029294e9a..000000000 Binary files a/docs/plans/artifact-acquisition/reports/http-elapsed-budget-2026-10-06/post-main-logs.tar.gz and /dev/null differ diff --git a/docs/plans/artifact-acquisition/reports/http-elapsed-budget-qualification-2026-10-06.md b/docs/plans/artifact-acquisition/reports/http-elapsed-budget-qualification-2026-10-06.md deleted file mode 100644 index d58178b30..000000000 --- a/docs/plans/artifact-acquisition/reports/http-elapsed-budget-qualification-2026-10-06.md +++ /dev/null @@ -1,71 +0,0 @@ -# HTTP elapsed-budget qualification — 2026-10-06 - -The selected Q1 feature enforces the existing positive HTTP per-file source-wait budget. It repairs a concrete AQ-HTTP prerequisite for Q2: a wheel acquisition must not wait indefinitely on response headers, a stalled successful body or retry backoff while ignoring the caller's elapsed budget. It does not implement the package installer or declare AQ-HTTP ready. - -## Existing pieces and the missing behavior - -The public shared HTTP consumer already admits an exact manifest/source set, loops over all selected files, seals the complete set, grants a retained verified `Using` lease, executes consumer prepare/publication, and settles a bound receipt. Exact multi-file selection, SHA-256 verification, workspace capabilities and consumer receipts were present before this slice. Package resolution and installation semantics stay with the package owner. - -Before this repair, `AcquisitionSource::Http::transfer_deadline` returned None, HTTP open/header waiting had no owner deadline, and HTTP body streaming had no response deadline. `elapsed` was checked only after retryable errors, and backoff had no remaining HTTP deadline to clamp against. A server could hold headers or a successful partial response indefinitely under an explicitly positive budget. This is missing behavior, not a need for more S3 failure fixtures. - -## Source and public compatibility - -Branch `feat/acquisition-http-budget-0c02dcfb` retains base `0c02dcfb81a0f7ab2a3858c2b5cee329816b3ce5`, tree `78c663ed397264284cb95662d49a3354380755d4`. Tested source `0950c4d5839608c8dd5f52afcb3fd2424a9a1656`, tree `55c7dea28bae397ee9d70995897c5ff0c8e2a672`; `acquisition/service.rs` blob `83478facd105a08f8a52e36e6ce9780d09e76d2a`, SHA-256 `3e611252c15f6c87aa2f4f22519d1ed80b2dbe1f22855089b77cb8aeec839c4f`. Production code changes only that owner file, with co-located tests; core README, the owner contract and admission/evidence documentation describe the change. - -There are no public struct/signature, persisted schema, source identity, retry-attempt, authorization, verification or receipt-shape changes. A positive `AcquisitionRetryPolicy.elapsed` now creates one absolute deadline per file before local preparation, reused across response headers, body streaming, attempts and capped backoff. A new selected member gets its own deadline; a retry does not. Unrepresentable positive clock budgets fail before public worker/store admission. Explicit HTTP elapsed zero remains the legacy opt-out. The HF consumer already supplies its configured positive elapsed field; its source waits now honor that field. The native archive consumer explicitly supplies zero, which remains unchanged. - -HTTP waits use biased deadline selection and a small per-poll clock check. Locked Tokio 1.49.0 `Timeout::poll` polls its inner future before the timer; `Sleep` can also yield under exhausted cooperative budget. The clock guard checks expiry before polling Sleep and before the request/body branch can be polled on that decision. It creates no new task, retry owner or capacity policy. Existing outer pause/cancel priority and body control flags remain. This remains cooperative: it cannot preempt an already-running poll or filesystem syscall. - -Already registered writes retain their descriptor/workspace execution capability and are joined through the existing drainage path before retry or return. Timeout retains Transferring custody and partial bytes, without consumer preparation/publication or a completion receipt. Local verification, effect drainage, import/install and child cleanup are not given this source-wait deadline; no hard caller-return latency is claimed. S3 deadline branches, diagnostics and all S3 reader/manifest/native production write sets are unchanged. - -## Acceptance controls and validation - -The ten public HTTP controls use owned synthetic loopback sources: - -1. A header wait expires without consumer handoff. -2. A successful response stalls after two observed partial bytes; expiry retains exactly those bytes and Transferring/no-receipt state. -3. Ten-second backoff cannot exceed a five-second remaining budget or issue another request. -4. Four seconds before a first 503 plus two seconds at the next header wait exceed one five-second file budget; retry cannot reset it. -5. An admitted write remains gated across expiry; the operation and workspace capability remain held until the write drains, then retain its bytes without publication. -6. A partial-open effect is gated after headers/body bytes are buffered; after expiry/release no buffered-body write starts and the partial stays empty. -7. Explicit zero survives six seconds of simulated source hold and settles normally when released. -8. Three exact SHA-pinned members each consume three seconds under independent five-second budgets; the nine-second set completes with its original exact manifest and a validated bound receipt. -9. Cancellation paired with header expiry retains its cancellation outcome. -10. Overflow refuses before any accepted source connection, callback, durable row or file preparation. - -Clocks advance only after actual source/effect observations; guards are separate from configured production budgets. Every started fixture releases gates and performs bounded cleanup before assertions. Unconfirmed owner drainage retains the disposable root. Source monitors stay owned through drainage; the overflow monitor also observes a bounded quiet window. Held capability probes do not claim OS-level exclusion. Cancellation under body/backoff and warm pause/resume are existing-suite coverage, not additional claims of the header-cancellation control. - -Final-source acquisition-filter tests pass **153/153 in default and 153/153 in no-default** (including all ten new controls). HF download tests pass **192/192 in each configuration**; mixed-size public HF status/import/receipt controls pass **1/1 in each**. Strict all-target core Clippy with warnings denied passes in default, no-default and default-plus-S3. Scoped rustfmt and `git diff --check` pass. These are affected-slice checks, not full workspace or hosted qualification. - -All Cargo runs use Rust/Cargo 1.92.0, one serialized job, incremental disabled, offline/locked dependency resolution and explicit dev/test debug=0. The unchanged workspace ort dependency disables defaults, enables `load-dynamic` and does not enable `download-binaries`; explicit runtime acquisition remains unchanged. No ONNX runtime/model was downloaded or provisioned. Repository-local MrScripty identity is verified before/after commits. Parent owns PRs, hosted qualification and integration; no external reviewer was contacted. - -[Evidence JSON](http-elapsed-budget-2026-10-06/evidence.json) binds exact commands, source profiles, exits and SHA-256 hashes of a raw-log archive. Original scratch is `/workspace/scratch/http-elapsed-budget/`. Diagnostic bytes are preserved; collected environment values are limited to named build settings, not credential stores or full environments. - -## Failures and review corrections - -The initial test-only old-owner run failed six controls and passed three compatibility controls (exit 101). Its exact patch/blob/log remain retained. These are the pre-refinement fixtures; later review strengthened root retention, overflow source-I/O observation and cumulative multi-file timing. An intermediate compile failed because a conditional TempDir.keep moved the root before a later path assertion; saving an owned state path repaired it. The nine-control repair then passed. The timer-ready variant passed 153 acquisition-filter cases before final cooperative clock refinement. Those intermediate results are historical and do not qualify the final blob by themselves. A final rustfmt invocation without the repository toolchain environment failed before formatting (read-only default rustup home); the ordinary configured-environment invocation passes, and both logs are retained. Both independent specification and standards reviews accepted the exact final blob with no remaining concrete finding. - -Authorized inactive reproducible test binaries were hashed before removal, and own temporary PR42 dependency copies were parked to preserve build headroom. Source, retained custody/evidence roots, release archives and frozen branches remain intact. All three temporary PR42 dependency directories were restored to their original paths after Cargo drainage, with before/after tree digests matching; the restoration manifest is archived. - -## Remaining gate and next feature - -This completes the bounded positive HTTP source-wait feature. AQ-HTTP remains pending on the broader AC01–AC10/AC15/AC16/AC18 acceptance, hosted/current-head qualification, public-client and deployment dispositions, representative resources, actual UI and supported-platform evidence. Linux loopback/core tests do not establish those claims. - -The next existing-plan implementation feature remains Q2 accepted exact wheel closure → shared verified local handoff → local-only installation under denied network → installed-output proof, with input custody held through package child exit/cleanup and resolver/bootstrap traffic separately recorded. `resolve_runtime.py --install` currently resolves/installs before reporting its lock/result, and the Torch installer consumes that combined result; this missing package boundary is not implemented here. Q2 remains gated until the applicable AQ-HTTP scope is accepted. PR42 generator source/evidence and AC10 source/evidence remain separate and frozen. - -## Accepted current-main composition — 2026-10-06 - -After parent accepted PR42, normal merge `6385a4931ca2ebd21f7c8af83b087d5f2cf6b9a1` (tree -`a2d461188d622cf123fb4d7464602fc913fc831a`) incorporates current main -`1c1c7875ff8fc43b3ad1957fb2a94d44c850716c` (tree -`8c27d77e7d31ed13f85db77a8c155f15a7fbe693`) with parents -`9470f4882216097f86114ec53e086d9f15b24e00` and `1c1c7875ff8fc43b3ad1957fb2a94d44c850716c`. -The merge adds only the accepted generator repair and its evidence. The entire -Rust subtree `0bd482ac031078865f944efeec6dad4d7d825530` matches tested HTTP source `0950c4d5`; -the owner blob and all S3/native sources remain byte-identical. All ten deadline -controls pass again in default and no-default (10/10 each) on this merge. The -original failed controls, qualified checks, raw archive and AC10/PR42 evidence -are preserved. [Post-main evidence](http-elapsed-budget-2026-10-06/post-main-evidence.json) -binds exact commands/logs, identities, merge parents/tree and Rust subtree -agreement. Parent separately monitors main's postmerge CI; no new hosted or full -AQ-HTTP acceptance is claimed. Q2 remains the next gated implementation feature. diff --git a/docs/plans/artifact-acquisition/reports/main95-readiness-checkpoint-2026-10-06.md b/docs/plans/artifact-acquisition/reports/main95-readiness-checkpoint-2026-10-06.md deleted file mode 100644 index 363666b86..000000000 --- a/docs/plans/artifact-acquisition/reports/main95-readiness-checkpoint-2026-10-06.md +++ /dev/null @@ -1,140 +0,0 @@ -# Main95 integrated readiness checkpoint - -Execution was available after the disconnect notification: normal shell `pwd`, -Git status/object lookup and commands succeeded in `/workspace`. This bounded -checkpoint stops before prefix enumeration and does not merge or update a PR. -No further feature or optional Content-Length hardening was added. - -## Exact ancestry - -Qualification branch: `qualification/s3-hf-ac08-main95`. - -| Input | Head | Tree | -| --- | --- | --- | -| Approved main | `95a0baad2d0aea4650fc36ad4afd969ac9391bf5` | `3ee66988eb1668188011b2124890b10031403ebd` | -| SDK reader | `9077ec90e02a75fc1bf789d361e423187ddeec86` | `1b45dabe2fe8a941a921de8a795a674ae94300e4` | -| AC08 repair | `10f39431c1c4a447d21d34b42670cd26b4b3efff` | `d1ae65f9bc67cb8066f62d2b5ad9a6a87580da59` | -| HF target repair | `4eb273b329631efcd82022206aba7636b7a4ac20` | `483d6a2aa52abbec4dff779962f2abd40152e79c` | - -Normal merge chain, with ordered parents: - -1. `0e021b0003ffd4b7de66fab1eb7fedcae87050c5`, tree - `ee41da489d766abb521c7e2d966b669fc92cd1bd`: main95, then SDK9077. -2. `7c8aac72b04478f6d07fa5c36b156457f312ec31`, tree - `9b04a393e64c6978eb15f39f404ae2b9ae5ccd6a`: 0e021b00, then AC0810f39431. -3. `9a1466f5b127c6bcd815059ca0d2780a0508abe3`, tree - `cc7e9cbc05c706427b27800834663f84fe49b0f3`: 7c8aac72, then HF4eb273b3. - -All four inputs are ancestors. Original refs are unchanged; no rebase, squash, -force push or PR merge occurs. SDK9077 descends from composed S3 production -`493b935c6a41d4d4aeca8e8a66f10b4aba114365`, bringing its earlier Q3 prerequisites. -AC08 and HF both depend on package completeness `aca0ef2a5dcffecfb98c2ba42fc87886b2210ebe`, -which descends from mixed-file `04b0459eedfea1336f200355c37f881e7d2b4f88` and -approved-main second parent `26a84e323cae566a46a8f76bef48fa1010aed48b`. -Thus the main-relative composition includes these prerequisites, beyond the -isolated three recent review deltas. - -SDK/main conflicts were Cargo.lock and generated attribution inventory. The -resolved manifest retains main's dynamic ORT configuration and SDK's sole owner; -Cargo resolved the existing SDK lock against that manifest offline. Final lock -has 502 versions. Attribution was regenerated after all merges. Ledger conflicts -retain both histories and unique HF/AC08 sections. A helper assertion about a -shared section's trailing blank line failed, and the shell inadvertently committed -ledger conflict markers in intermediate 7c8aac72. The next merge 9a1466f5 corrects -the ledger from the good 0e021b00 plus both immutable incoming ledgers; shared -sections compare equal after trailing whitespace. The final ledger contains no -markers. This intermediate documentation defect is retained honestly in history. - -## Isolated review scopes and regression evidence - -- **SDK:** compare 493b935c to 9077ec90: ten files, core Cargo/lock, private - reader/SDK transport, synthetic auth tests, two reader/acquisition integration - files, README, ledger and qualification report. Public constructors, receipts, - immutable/range/retry policy remain compatible. Parent independent review found - no blocking source defect; runtime results remain author evidence. SDK reader, - manifest and frozen native source bytes match 9077 exactly in composition. -- **AC08:** compare aca0ef2a to 10f39431: four hook/test files plus ledger. - Code commit `b64332e07cb6a27aac36febf41cdbdecfed00ea6` is followed by a - documentation-only child. Valid full pushed snapshots supersede delayed - unversioned startup lists; late startup cannot resurrect completed/empty state - or erase a newer error. Unchanged code failed five regressions; paused merge - remained a control. Header presentation stays downloading at 100% bytes until - backend Completed. Hook source/tests match this milestone exactly here. -- **HF:** compare aca0ef2a to 4eb273b3: private package selection helper, API - regressions, README and ledger. Targets must be selected weight payloads in - the index's SafeTensors/PyTorch format; config/index-self/wrong-format targets - are refused while valid bin/pt/pth and known part naming remain controls. - Actual unchanged Rust ran 45 passing index cases and two failures: the public - config target reached Completed. The first failure stopped that red public - loop before self-reference; final passing tests exercise both. Failures retain - partial marker/stub and lack an Adopted receipt. Parent accepted this repair - independently. The helper and public API source match 4eb exactly here. - -## ONNX feature and runtime selection boundary - -Approved-main Cargo configuration has `load-dynamic` and no `download-binaries`, -`copy-dylibs` or ONNX TLS features. Resolved ort 2.0.0-rc.12 enables dynamic -loading/preload-dylibs, std, ndarray, tracing, half and APIs 17 through 24; -ort-sys enables disable-linking/std/APIs 17 through 24. Both core and RPC default -plus S3 graphs validate on Linux, macOS and Windows without build-download/copy/ -TLS features, object_store, aws-config or an AWS default HTTP client. -The repository's 12 feature contracts also pass. Graphs are not platform builds. - -The approved runtime loader/real backend remain byte-identical to main95: -absolute explicit `ORT_DYLIB_PATH` has priority; invalid explicit selection fails -without fallback. With no explicit path, select only the OS library beside the -executable, then canonicalize that exact file. The loader validates OrtGetApiBase, -version compatibility and C API 24, and passes the same canonical path to ort. -There is no build-time runtime acquisition. Actual separately provisioned runtime, -model inference and installed/platform acceptance remain outside this checkpoint. - -## Composed checks and attribution - -Rust 1.92, locked/offline, defaults plus `s3,test-support`, one worker, debug zero, -no incremental compilation and writable task-local XDG configuration: - -| Actual check | Result | -| --- | --- | -| Package filter, including HF target regressions | 52 passed | -| Public HF API | 39 passed | -| S3 units | 13 passed; global-trace and ambient child cases executed by parents | -| S3 acquisition / native workflow / reader | 44 / 7 / 14 passed; cold child executed | -| ONNX library path selection | 2 passed | -| Renderer hooks/completion | 121 passed in three files | -| Header/local actions/remote menu | 32 passed in three files | -| Frontend types / zero-warning lint | Passed | -| Feature contracts / six explicit ORT+SDK graphs | 12 / 6 passed | -| Dependency ownership / attribution tests | Passed / 6 passed | -| Canonical attribution generator/check | 365 default-release entries, validated | - -Internal logs live in `/workspace/scratch/readiness-main95/`: `package.log`, -`hf-api.log`, `s3-unit.log`, `s3-integration.log`, `ort-selection.log`, -`ort-features.log`, `feature-contracts.log`, `ort-sdk-platform-graphs.log`, -`renderer.log`, `renderer-presentation.log`, `frontend-types.log`, -`frontend-lint.log`, `attribution-generate.log`, `attribution-check.log`, -`attribution-tests.log` and `dependency-ownership.log`. Cached Node dependencies -were linked after manifest/lock byte comparison and every exact link was retired. -An initial renderer invocation used three nonexistent presentation path filters; -its 121 valid tests passed, then the three actual repository presentation files -ran separately for 32 passes. No browser access workaround was attempted. - -Canonical default-release notices/inventory are refreshed using the unchanged -generator and actual composed inputs. They describe the default release profile, -which does not enable optional S3. The prior SDK report's authoritative optional -S3 license evidence covers its separate closure; an S3-enabled distribution must -include those additional terms. Frozen earlier evidence/inventories are retained. -No S3-enabled release attribution or production package is falsely certified by -this default-only regeneration. - -The composed targeted source tests pass; individual milestone lint/evidence -remains preserved. A new full RPC/default suite, broad strict RPC test-target -lint, hosted checks, live providers, desktop browser/focus/accessibility and -hard-kill/platform qualification were not added to this bounded checkpoint. -The earlier 11 inference-disabled RPC test-target dead-code warnings remain a -scoped limitation, with no suppression. No acquisition/runtime gate is advanced. -Workspace disk was about 440 MiB free after affected Rust checks; no shared -cache/evidence cleanup or additional build was undertaken. - -Parent owns remaining review/PR/integration decisions. No real credentials, -account provisioning, paid services, runtime downloads or new feature work occur. -Execution stops at this checkpoint as requested for the weekly usage ceiling. diff --git a/docs/plans/artifact-acquisition/reports/passeur-mcp-usability.md b/docs/plans/artifact-acquisition/reports/passeur-mcp-usability.md deleted file mode 100644 index 2af499284..000000000 --- a/docs/plans/artifact-acquisition/reports/passeur-mcp-usability.md +++ /dev/null @@ -1,296 +0,0 @@ -# Passeur MCP usability feedback - -This report records observed contributor-tool usability, separately from -artifact-acquisition implementation and acceptance evidence. It does not claim -that Passeur has been notified or that any proposed improvement has shipped. - -## 2026-09-30 — repository service unavailable - -### Reproduction - -From the Pumas-Library MCP session: - -1. `passeur_agents({ limit: 100 })` and - `passeur_tasks({ schema_version: 1, limit: 100 })` return argument - validation errors. The backend reports maximum limits of 4 and 16, - respectively, while the published tool declarations do not state those - bounds. -2. Retry with `passeur_agents({ limit: 4 })`. It returns - `PATH_NOT_FOUND` from `profile.open` without identifying the missing - profile resource. -3. Retry with `passeur_tasks({ schema_version: 1, limit: 16 })`. It returns - `SERVICE_PROFILE_CONFLICT` with “Use the same approved profile path for - clients of this repository service”. -4. Call `passeur_status({})`. The frontend is running, but the repository - service is unavailable with `SERVICE_PROFILE_CONFLICT`. - -No task was submitted or started during this reproduction. Agent availability -could not be inspected because the valid agent-list request failed. - -### Suggested improvements - -- Publish the actual maximums in the tool schemas so callers can validate - requests before sending them. -- Make `PATH_NOT_FOUND` identify which profile lookup failed and give a safe, - concrete recovery action. -- Make profile-conflict diagnostics identify the conflicting approved profile - selection, or provide a non-sensitive correlation identifier and a supported - way for the operator to find the required value. The current message says to - use the same path but does not reveal which path the service expects. -- Return one consistent service-unavailable diagnosis from agent discovery, - task listing, and status. In this run those calls produced two different - errors for what status reported as an unavailable repository service. - -### Evidence limits - -These observations are from one repository/session configuration. They show -the errors returned by the tools in that session; they do not establish the -cause of the approved-profile mismatch or whether another configured profile -would work. - -## 2026-09-30 — retry after reported service recovery - -After the user reported that Passeur should work, the current session retried -`passeur_agents({ limit: 4 })`, -`passeur_tasks({ schema_version: 1, limit: 16 })`, -`passeur_status({})`, `passeur_prepare({})`, and the coordination identity -read. Agent discovery again returned `PATH_NOT_FOUND` from `profile.open`; -task listing, prepare, and identity returned `SERVICE_PROFILE_CONFLICT`. -Status now reports the repository service as unavailable with that conflict. -No task was submitted. Because the available tools could not provide an agent -ID or bind a coordinated request, this implementation continued through the -authorized GPT-6.1 Sol Medium fallback instead of guessing an agent or -submitting to an unverified worker. - -## 2026-09-30 — status after session restart - -After the user restarted the session, `passeur_status({})` reported a running -frontend with a new process/build identity, but the repository service still -returned `SERVICE_PROFILE_CONFLICT` and “Use the same approved profile path for -clients of this repository service”. No agent discovery or task submission was -attempted in this check. The user authorized GPT-6.1 Sol implementation until -the repository service becomes available, so the cancellation recovery repair -continues under that fallback. - -## 2026-09-30 — fresh repository-service check - -In the resumed session, `passeur_status({})` still reports the repository service -unavailable with `SERVICE_PROFILE_CONFLICT`. A valid `passeur_agents({ limit: 4 })` -request still fails at `profile.open`, now including the generic next action to -check configured path/access and preserve the existing namespace; it still does -not identify the unavailable profile. An initial request above the documented -maximum (`limit: 50`) was rejected by validation, confirming the agents bound is -4. No task was submitted, and implementation remains on the user-authorized -GPT-6.1 Sol fallback until the repository service becomes available. - -## 2026-09-30 — coordinator connected, contributor discovery unresolved - -A later status check changed from `unavailable` to `not_checked`. -`passeur_prepare({})` connected the repository service with open admission and a -ready coordination authority. Task listing succeeded and returned zero tasks; -the coordination identity read also succeeded. However, -`passeur_agents({ limit: 4 })` still failed at `profile.open` with -`PATH_NOT_FOUND`, and connected status reported execution profile/provider/ -approval as `not_checked`. No agent ID for the requested Muse Spark contributor -could be verified, so no implementation task was submitted or started. The -service can coordinate/read metadata, but this session still cannot safely -select the requested execution profile. - -## 2026-09-30 — resumed check after the Passeur update - -The current installed build connected through `passeur_prepare({})` with open -admission and ready coordination authority. `passeur_status({})` reports the -execution profile, provider, and approval as `not_checked`; a valid -`passeur_tasks({ schema_version: 1, limit: 16, offset: 0 })` returned zero -tasks. `passeur_agents({ limit: 4, offset: 0 })` still fails with -`PATH_NOT_FOUND` at `profile.open`, without a contributor identity. No task -was submitted. Implementation therefore continues using the user's GPT-6.1 -Sol fallback until contributor discovery works. - -This confirms that metadata coordination is ready while execution-profile -discovery is not. The smallest useful recovery signal would identify the -unavailable profile lookup (or expose a safe configured-agent status) so a -caller can distinguish a missing profile from a service-wide failure without -guessing an agent ID. - -## 2026-09-30 — updated frontend with contributor lookup still unavailable - -The installed frontend changed build identity to -`6a43daa6eec45ddceadea0ba2e2a623d7fc8e81e330237c7762a7f1c63c33f63` and -attached to repository service generation `269decac-59b5-4028-9bac-8d09ee9a35c2`. -`passeur_prepare({})` reports open admission and ready coordination authority; -task listing succeeds with zero tasks. `passeur_status({})` still reports the -execution profile, provider, and approval as `not_checked`. - -A valid `passeur_agents({ limit: 4, offset: 0 })` request again fails at -`profile.open` with `PATH_NOT_FOUND`, without returning a configured agent ID. -No assignment was submitted. The requested contributor cannot be selected -reliably from metadata readiness alone. The already-authorized GPT-6.1 Sol -fallback completed the bounded implementation slice; final review then found -three source defects that are being corrected before verification. Passeur has -not yet contributed source work in this session. - -This update narrows the earlier feedback: coordination reads now work, but -contributor discovery still needs to expose which configured profile lookup -failed or provide a safe status/readiness result, and execution-profile, -provider, and approval readiness need explicit values before binding a task. - -## 2026-09-30 — contributor availability rechecked after user update - -After the user reported that Passeur was available and requested Muse Spark 1.3 -Contributor implementation, this session ran `passeur_status`, -`passeur_prepare`, `passeur_agents({limit:4,offset:0})`, -`passeur_tasks({schema_version:1,limit:16,offset:0})`, and coordination identity -and status reads. The installed frontend remains build -`6a43daa6eec45ddceadea0ba2e2a623d7fc8e81e330237c7762a7f1c63c33f63`; the repo -service connects with open admission and `passeur_prepare` reports coordination -ready/held. Identity reads succeed and the task list is empty. However, -`passeur_agents` still returns `PATH_NOT_FOUND` at `profile.open`, and the -expected project profile path -`` does -not exist. Separately, `passeur_coordination` status reports `not_enabled`, -which conflicts with the `passeur_prepare` readiness report. Execution profile, -provider, and approval remain `not_checked`. No agent ID was returned and no -task was submitted or started. - -The readiness output should distinguish repository-service connection, -metadata-coordination enablement, project-profile existence, and contributor -execution/provider readiness. Agent-list failure should identify the missing -profile resource (or expose a safe status field) instead of returning only -`profile.open`; the current state is not sufficient to choose an agent safely. - -## 2026-10-01 — coordinated contributor preflight - -The service status still reports connected/open admission and ready/held -metadata coordination. A valid agent-list request -`passeur_agents({limit:4,offset:0})` again returned `PATH_NOT_FOUND` at -`profile.open`; the task list returned zero tasks. `passeur_prepare({})` -completed, but did not enable coordination for execution: after correcting a -caller-side `target_ref` validation error (the request must use a -`refs/heads/...` ref), `passeur_preflight` returned -`COORDINATION_NOT_ENABLED` with “Coordination has not been explicitly -initialized.” No assignment was submitted. The tool guidance reserves -initialization for the operator CLI, so the caller cannot safely recover this -state by guessing an agent ID or writing profile/coordination data. - -The current errors expose two distinct setup problems: configured contributor -discovery cannot open the project profile, and coordinated admission says the -coordination metadata is uninitialized despite status/prepare reporting it -ready. Readiness should make these states consistent, and preflight should -identify the supported operator recovery path without implying that successful -prepare enabled execution. - -## 2026-10-01 — status ready, but contributor discovery still fails - -After the user requested Sol 6.1, I rechecked the installed Passeur frontend -build `6a43daa6eec45ddceadea0ba2e2a623d7fc8e81e330237c7762a7f1c63c33f63` and -repository service generation `e1e32585-e963-495d-b46b-05102aff09f1`. -`passeur_status({})` reports the service connected, repository binding valid, -and coordination ready/held. The valid task-list request -`passeur_tasks({schema_version:1,limit:16,offset:0})` succeeds with zero tasks. -The valid agent-list request `passeur_agents({limit:4,offset:0})` still fails -with `PATH_NOT_FOUND` at `profile.open`; execution profile/provider/approval -are not reported ready by this endpoint. There is no returned Muse Spark agent -identity and no active Passeur task, so no Passeur subagent is working on the -implementation. No task was submitted. Work continued directly under the -user's Sol 6.1 instruction. - -The failure has narrowed to configured-agent discovery: service connectivity -and task inspection work, but `profile.open` prevents safe agent selection. -Keep these readiness states separate in status output and return the missing -profile resource or a safe configured-agent status instead of a generic path -failure. No product correctness or acceptance conclusion follows from this -MCP observation. - -## 2026-10-01 — Muse contributor lookup during parallel implementation - -Seven GPT-6 Luna XHigh CLI orchestrators checked Passeur while handling -separate Q1 write sets. A valid `passeur_models` request returned the model -`muse-spark-1.3-contributor`, but valid `passeur_agents({limit:4,offset:0})` -requests repeatedly failed with `PATH_NOT_FOUND` at `profile.open`. Coordinated -submission also reached that profile failure after the caller corrected its -`target_ref` to a full `refs/heads/...` ref. No Passeur task was admitted or -started; implementation used the authorized GPT-6.1 Sol Medium fallback. - -This confirms that model-catalog visibility is not evidence that a configured -contributor profile is discoverable or spawnable. Passeur should expose these -states separately and return a safe, actionable agent-discovery result that -identifies the missing profile resource or its readiness state. A caller should -not have to infer whether the model is unavailable, the profile is missing, or -the execution provider is not ready from the generic `profile.open` path error. - -## 2026-10-01 — bounded recovery-fixture assignment attempt - -For the orphan-partial recovery fixture, the current session retried the -contributor route after the user had authorized Muse Spark 1.3 Contributor for -implementation. `passeur_tasks({schema_version:1,limit:16})` returned zero -tasks; agent discovery failed at `profile.open` with `PATH_NOT_FOUND`; and a -scope-aware coordinated submission for `work/acquisition-q1-http` failed with -the same profile error. No Passeur task was admitted or started. The bounded -fixture/documentation change therefore used the authorized GPT-6.1 Sol Medium -fallback and was independently reviewed by GPT-6.1 Sol High. - -This is a separate contributor-profile failure from task-list availability: -the task list is readable and empty, but execution assignment cannot resolve a -configured contributor. Keep the model catalog, project profile, coordination -readiness and execution-provider readiness distinct in diagnostics. A -successful task-list read must not imply that a requested contributor can be -selected or that a coordinated task was accepted. - -## 2026-10-01 — coordinated Muse task and terminal-disposition recovery - -After the user reported Passeur availability, the operator CLI initialized the -coordination metadata and `passeur_agents` exposed the configured Muse agent. -The model catalog reported `muse-spark-1.3-contributor`; coordinated preflight -and submission then admitted the AC06 service-test task -`b22767c4-48ac-4cc3-99e4-c91d5e5e51b2` against one allowed source file. The -worker changed only that file and returned a bounded diff artifact, but its -delivery was incomplete because the worker had not made a commit. It ran no -checks; the integrator separately applied and tested the change. - -The first completed native turn did not include the required terminal -`PASSEUR_MESSAGE` v2 assignment-disposition envelope. Passeur surfaced the same -generic clarification (“Supply an explicit continuation instruction, or cancel -the task”) twice without exposing the parser's missing-marker/schema reason. -Providing the documented `PASSEUR_MESSAGE` marker and exact final JSON shape in -the clarification let the native task complete. The adapter should include the -disposition contract in the initial native instructions and return the concrete -bounded parse failure (missing marker, invalid JSON, or schema mismatch) in the -clarification. Repeating a generic continuation prompt made it unclear what -response would end the task. - -The first `muse_result` request used `limit: 12000` and was rejected because the -runtime maximum is 8192 bytes; retrying at 8192 succeeded. Expose this maximum -in the tool schema/description so clients can page correctly without a failed -call. - -These observations come from one coordinated Muse 1.3 implementation task. -The worker report is not code verification: it had no checks, the Passeur -delivery was uncommitted, and acceptance remains the integrator's responsibility. - -## 2026-10-01 — contributor recheck with frozen coordination - -The current `passeur_status` call reports a connected repository service and a -valid execution profile. `passeur_agents({limit:4,offset:0})` returns the -configured `muse` agent, and `passeur_models({limit:2,offset:0})` returns -`muse-spark-1.3-contributor`. Agent runtime readiness, provider, and approval -remain `not_checked`. The first catalog request used `limit:16` and was -rejected because the current schema requires at most 2; retrying with limit 2 -succeeded. - -Task listing shows task -`ad1668f3-6588-4ce6-86a0-33813b7856cf` in `needs_attention`, with native state -`unknown` and an unconfirmed shutdown/input-delivery disposition. Repository -coordination is consequently `frozen` and names that task as requiring -reconciliation. No new assignment was submitted. This is a distinct state -from contributor discovery: the contributor identity and model catalog are -available, but the service refuses coordinated new work while the prior -native session remains unresolved. The current calls establish the returned -state only; they do not prove that the native session stopped. - -The catalog limit should match the declared tool contract, and a connected -service should expose contributor runtime readiness explicitly. More -importantly for this session, task recovery needs an operator-visible, -evidence-based reconciliation path that distinguishes cancellation requested, -native shutdown confirmed, and input delivery confirmed before unfreezing -coordination. diff --git a/docs/plans/artifact-acquisition/reports/pr42-desktop-contract-2026-10-06/README.md b/docs/plans/artifact-acquisition/reports/pr42-desktop-contract-2026-10-06/README.md deleted file mode 100644 index bce0cd8e5..000000000 --- a/docs/plans/artifact-acquisition/reports/pr42-desktop-contract-2026-10-06/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# PR42 desktop generation repair evidence - -Exact tested source is `75d7e426acdb4f2ed25c6063653ae517a56528aa`, tree -`93018997501ae9ec503508028767345298828abc`, based on frozen PR42 -`722245514b3bae42511aa5ea188570292ce276d4`. This successor adds evidence only; -source 75d7 remains unchanged. `repair-evidence.json` preserves the original -command/result/source/hash record; `commands.json` identifies observed exits -and retained setup failures. All named hashed files are included unchanged. Raw diagnostic logs are in -`command-logs.tar.gz` under their original names; JSON/text files are alongside -the archive. Original log whitespace is preserved, not normalized. - -The hosted and local stale-check failure and working-directory regression are -retained. Final generation, strict byte parity from root and Electron working -directories, generator 9/9, actual producer Electron conformance 41/41, bundled -preload renderer conformance 48/48, Electron build/lint and syntax/diff checks -passed. All six normally regenerated outputs equal the source base byte for byte. -The checker is unchanged. No dependencies, authentication, network policy, API -or schemas were changed. Local execution and Git push work; shell gh reads were -Forbidden, while authorized GitHub connector reads succeeded. Hosted repair -qualification and PR42 advancement belong to the parent. AC10 remains separate. - -The exact final root-versus-Electron regression was rerun with only -`absWorkingDir` removed (exit 1), then with source 75d7 restored byte-for-byte -(exit 0). `exact-regression-red-green.json` binds commands, versions, source/test -hashes, exact red/green log hashes and all six generated output hashes. diff --git a/docs/plans/artifact-acquisition/reports/pr42-desktop-contract-2026-10-06/command-logs.tar.gz b/docs/plans/artifact-acquisition/reports/pr42-desktop-contract-2026-10-06/command-logs.tar.gz deleted file mode 100644 index 70c47281e..000000000 Binary files a/docs/plans/artifact-acquisition/reports/pr42-desktop-contract-2026-10-06/command-logs.tar.gz and /dev/null differ diff --git a/docs/plans/artifact-acquisition/reports/pr42-desktop-contract-2026-10-06/commands.json b/docs/plans/artifact-acquisition/reports/pr42-desktop-contract-2026-10-06/commands.json deleted file mode 100644 index a48fc50ab..000000000 --- a/docs/plans/artifact-acquisition/reports/pr42-desktop-contract-2026-10-06/commands.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "source_head": "75d7e426acdb4f2ed25c6063653ae517a56528aa", - "source_tree": "93018997501ae9ec503508028767345298828abc", - "commands": [ - "(cwd electron) node scripts/generate-desktop-contract.mjs", - "(cwd electron) node scripts/generate-desktop-contract.mjs --check", - "(cwd repo) node electron/scripts/generate-desktop-contract.mjs --check", - "(cwd electron) node scripts/generate-desktop-contract.test.mjs", - "(cwd electron) node scripts/with-desktop-contract-fixtures.mjs node scripts/desktop-contract-conformance.test.mjs", - "(cwd electron) node node_modules/typescript/bin/tsc && node scripts/bundle-preload.mjs", - "(cwd electron) node node_modules/eslint/bin/eslint.js . --report-unused-disable-directives --max-warnings 0", - "(cwd frontend) node ../electron/scripts/with-desktop-contract-fixtures.mjs node node_modules/vitest/vitest.mjs run --config vitest.conformance.config.ts" - ], - "observed_success_exit_code": 0, - "red_controls": { - "check-before.log": 1, - "cwd-regression-before.log": 1 - }, - "setup_failures_preserved": [ - "pnpm-dependency-setup-error.log", - "frontend-before-preload-bundle.log", - "electron-lint-before-url-import.log", - "scoped-lint.log" - ], - "identity_verified_before_source_commit": true, - "sanitization": "All published bytes checked for common credential-value patterns; no environment values, auth stores or full hosted job logs collected. Exact original repair-evidence.json and all its hashed files preserved.", - "raw_log_container": { - "path": "command-logs.tar.gz", - "sha256": "78b748596bc2a286a9c5849a49eb3ffd101d9ef97389e299a0d7aab31cded2ef", - "format": "gzip tar; original log names and exact bytes; diagnostic whitespace preserved" - }, - "exact_repair_regression": "exact-regression-red-green.json: Node24.19.0, esbuild0.25.12, AJV8.20.0; only absWorkingDir removed gives exit1; restored repair gives exit0; six output hashes retained" -} diff --git a/docs/plans/artifact-acquisition/reports/pr42-desktop-contract-2026-10-06/exact-regression-red-green.json b/docs/plans/artifact-acquisition/reports/pr42-desktop-contract-2026-10-06/exact-regression-red-green.json deleted file mode 100644 index c4780f54c..000000000 --- a/docs/plans/artifact-acquisition/reports/pr42-desktop-contract-2026-10-06/exact-regression-red-green.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "source_head": "75d7e426acdb4f2ed25c6063653ae517a56528aa", - "cwd": "/workspace/Pumas-Library-pr42-desktop-contract/electron", - "command": [ - "node", - "--test", - "--test-name-pattern=independent of the invocation working directory", - "scripts/generate-desktop-contract.test.mjs" - ], - "test_sha256": "ee98926c401a794f6948cad7109c591a55d220d074fdeb1febce3ef34425b126", - "generator_green_sha256": "6893e2e4cf7c60628b03eadd77c44db2bb8cb81e874e1f82ad6779ac81f8f2fc", - "node": "v24.19.0", - "esbuild": "0.25.12", - "ajv": "8.20.0", - "generator_red_sha256": "a29dcff1fcb1f63620015ebc39e5d6aab917ac68194f132423bf51f3da09c5b5", - "red_exit": 1, - "green_exit": 0, - "logs_sha256": { - "exact-regression-red.log": "50e3ad6f39d668a51631bb48b6e9f98cd2ecca83f371b1ada676b1fdac389761", - "exact-regression-green.log": "676224b938edc9d66cce7de4a7d77b46ae4d0d5b59b165c7ae383a24ec89555d" - }, - "six_generated_outputs": [ - { - "path": "electron/src/generated/desktop-contract.ts", - "baseline_sha256": "0e1458103f2a89aac072bcb4efdfc2855aac1d6a7246f480058539ad1b25efbc", - "generated_sha256": "0e1458103f2a89aac072bcb4efdfc2855aac1d6a7246f480058539ad1b25efbc", - "identical": true - }, - { - "path": "electron/src/generated/desktop-contract.validators.d.ts", - "baseline_sha256": "e0be7d121fcb4719aac68940bf8a254622fffae41e7728b220f2710209ee4995", - "generated_sha256": "e0be7d121fcb4719aac68940bf8a254622fffae41e7728b220f2710209ee4995", - "identical": true - }, - { - "path": "electron/src/generated/desktop-contract.validators.js", - "baseline_sha256": "47ec935b38f6109b533843406dd78b55c0a72d380d30cbfb9bf7051f828088f2", - "generated_sha256": "47ec935b38f6109b533843406dd78b55c0a72d380d30cbfb9bf7051f828088f2", - "identical": true - }, - { - "path": "frontend/src/generated/desktop-contract.ts", - "baseline_sha256": "0e1458103f2a89aac072bcb4efdfc2855aac1d6a7246f480058539ad1b25efbc", - "generated_sha256": "0e1458103f2a89aac072bcb4efdfc2855aac1d6a7246f480058539ad1b25efbc", - "identical": true - }, - { - "path": "frontend/src/generated/desktop-contract.validators.d.ts", - "baseline_sha256": "e0be7d121fcb4719aac68940bf8a254622fffae41e7728b220f2710209ee4995", - "generated_sha256": "e0be7d121fcb4719aac68940bf8a254622fffae41e7728b220f2710209ee4995", - "identical": true - }, - { - "path": "frontend/src/generated/desktop-contract.validators.js", - "baseline_sha256": "47ec935b38f6109b533843406dd78b55c0a72d380d30cbfb9bf7051f828088f2", - "generated_sha256": "47ec935b38f6109b533843406dd78b55c0a72d380d30cbfb9bf7051f828088f2", - "identical": true - } - ], - "red_mutation": "Only absWorkingDir:root removed; exact repair test unchanged; generator restored byte-for-byte before green." -} diff --git a/docs/plans/artifact-acquisition/reports/pr42-desktop-contract-2026-10-06/generated-parity.json b/docs/plans/artifact-acquisition/reports/pr42-desktop-contract-2026-10-06/generated-parity.json deleted file mode 100644 index 2214ec234..000000000 --- a/docs/plans/artifact-acquisition/reports/pr42-desktop-contract-2026-10-06/generated-parity.json +++ /dev/null @@ -1,38 +0,0 @@ -[ - { - "path": "electron/src/generated/desktop-contract.ts", - "baseline_sha256": "0e1458103f2a89aac072bcb4efdfc2855aac1d6a7246f480058539ad1b25efbc", - "generated_sha256": "0e1458103f2a89aac072bcb4efdfc2855aac1d6a7246f480058539ad1b25efbc", - "identical": true - }, - { - "path": "electron/src/generated/desktop-contract.validators.d.ts", - "baseline_sha256": "e0be7d121fcb4719aac68940bf8a254622fffae41e7728b220f2710209ee4995", - "generated_sha256": "e0be7d121fcb4719aac68940bf8a254622fffae41e7728b220f2710209ee4995", - "identical": true - }, - { - "path": "electron/src/generated/desktop-contract.validators.js", - "baseline_sha256": "47ec935b38f6109b533843406dd78b55c0a72d380d30cbfb9bf7051f828088f2", - "generated_sha256": "47ec935b38f6109b533843406dd78b55c0a72d380d30cbfb9bf7051f828088f2", - "identical": true - }, - { - "path": "frontend/src/generated/desktop-contract.ts", - "baseline_sha256": "0e1458103f2a89aac072bcb4efdfc2855aac1d6a7246f480058539ad1b25efbc", - "generated_sha256": "0e1458103f2a89aac072bcb4efdfc2855aac1d6a7246f480058539ad1b25efbc", - "identical": true - }, - { - "path": "frontend/src/generated/desktop-contract.validators.d.ts", - "baseline_sha256": "e0be7d121fcb4719aac68940bf8a254622fffae41e7728b220f2710209ee4995", - "generated_sha256": "e0be7d121fcb4719aac68940bf8a254622fffae41e7728b220f2710209ee4995", - "identical": true - }, - { - "path": "frontend/src/generated/desktop-contract.validators.js", - "baseline_sha256": "47ec935b38f6109b533843406dd78b55c0a72d380d30cbfb9bf7051f828088f2", - "generated_sha256": "47ec935b38f6109b533843406dd78b55c0a72d380d30cbfb9bf7051f828088f2", - "identical": true - } -] diff --git a/docs/plans/artifact-acquisition/reports/pr42-desktop-contract-2026-10-06/identity-before-commit.txt b/docs/plans/artifact-acquisition/reports/pr42-desktop-contract-2026-10-06/identity-before-commit.txt deleted file mode 100644 index aca8615f5..000000000 --- a/docs/plans/artifact-acquisition/reports/pr42-desktop-contract-2026-10-06/identity-before-commit.txt +++ /dev/null @@ -1,2 +0,0 @@ -GIT_AUTHOR_IDENT=MrScripty 1791274810 +0000 -GIT_COMMITTER_IDENT=MrScripty 1791274810 +0000 diff --git a/docs/plans/artifact-acquisition/reports/pr42-desktop-contract-2026-10-06/repair-evidence.json b/docs/plans/artifact-acquisition/reports/pr42-desktop-contract-2026-10-06/repair-evidence.json deleted file mode 100644 index 24fa998f1..000000000 --- a/docs/plans/artifact-acquisition/reports/pr42-desktop-contract-2026-10-06/repair-evidence.json +++ /dev/null @@ -1,87 +0,0 @@ -{ - "base": "722245514b3bae42511aa5ea188570292ce276d4", - "base_tree": "14e8a1b36b580f2397264dd38b18329ec07bc75e", - "head": "75d7e426acdb4f2ed25c6063653ae517a56528aa", - "tree": "93018997501ae9ec503508028767345298828abc", - "branch": "fix/pr42-desktop-contract-72224551", - "author_committer": "MrScripty |MrScripty ", - "source": { - "electron/scripts/generate-desktop-contract.mjs": { - "blob": "447775724e07953defad7895e2db32f28146b8d2", - "sha256": "6893e2e4cf7c60628b03eadd77c44db2bb8cb81e874e1f82ad6779ac81f8f2fc" - }, - "electron/scripts/generate-desktop-contract.test.mjs": { - "blob": "3e515ebfab8dac633c563542fe20405a83c406cd", - "sha256": "ee98926c401a794f6948cad7109c591a55d220d074fdeb1febce3ef34425b126" - } - }, - "tests": { - "generator": { - "passed": 9, - "failed": 0 - }, - "electron_actual_producer_conformance": { - "passed": 41, - "failed": 0 - }, - "renderer_actual_bundled_preload_conformance": { - "passed": 48, - "failed": 0 - }, - "parity_root_cwd": "pass", - "parity_electron_cwd": "pass", - "normally_regenerated_outputs": "6/6 identical to base", - "electron_build": "tsc + normal bundle-preload pass", - "electron_lint": "pass, warnings denied", - "node_syntax": "pass", - "git_diff_check": "pass" - }, - "diagnosis": "esbuild used invocation cwd to print dependency module paths; absWorkingDir is now the repository root; the byte-for-byte stale check is unchanged", - "hosted_failure": { - "run": 37432261429, - "job": 112165944055, - "head": "722245514b3bae42511aa5ea188570292ce276d4" - }, - "environment": "local commands, source builds, owned loopback and Git push work; shell gh API reads return Forbidden; authorized GitHub connector reads succeed", - "public_api_changes": false, - "hosted_repair_validation": "not requested/run; parent owns PR42 integration and hosted qualification", - "ac10": "WIP preserved separately at qualification/ac10-public-hf-72224551, admission d3d93f8b5da09f7d71c96631aab141c6bae9fb6c; no successful final measurement yet; source a885 needs verified-handoff marker condition before 30s importer wait", - "commands": [ - "(cwd electron) node scripts/generate-desktop-contract.mjs", - "(cwd electron) node scripts/generate-desktop-contract.mjs --check", - "(cwd repo) node electron/scripts/generate-desktop-contract.mjs --check", - "(cwd electron) node scripts/generate-desktop-contract.test.mjs", - "(cwd electron) node scripts/with-desktop-contract-fixtures.mjs node scripts/desktop-contract-conformance.test.mjs", - "(cwd electron) node node_modules/typescript/bin/tsc && node scripts/bundle-preload.mjs", - "(cwd electron) node node_modules/eslint/bin/eslint.js . --report-unused-disable-directives --max-warnings 0", - "(cwd frontend) node ../electron/scripts/with-desktop-contract-fixtures.mjs node node_modules/vitest/vitest.mjs run --config vitest.conformance.config.ts" - ], - "build_settings": { - "CARGO_BUILD_JOBS": "1", - "CARGO_INCREMENTAL": "0", - "CARGO_PROFILE_DEV_DEBUG": "0", - "CARGO_PROFILE_TEST_DEBUG": "0", - "CARGO_TARGET_DIR": "/workspace/Pumas-Library/rust/target", - "cargo_serialization": "flock /tmp/pumas-cargo-admission/cargo.lock" - }, - "limits": "PNPM wrapper tried dependency setup and failed before the check; checks were run directly through the unchanged Node script bodies and existing locked dependencies. First renderer setup used unbundled tsc output and failed; normal preload bundling fixed setup before final 48/48 pass. Initial lint found missing URL import, fixed before final lint.", - "evidence_files": { - "check-after-electron.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "check-after-root.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "check-before.log": "a7d53a00a9f8cdbc9fb608a64f94e317f55b1900ad6944affb3304acac8d3f45", - "cwd-regression-before.log": "03848b889c90c9c9d3333756826a02ee9ec5a90b5392bd79b37f023b57df26bb", - "electron-build.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "electron-conformance.log": "0b63b10ed087250d7cc67b2a55a15dd1b0b728b966c5aaa86b80c3a53f4857a9", - "electron-lint-before-url-import.log": "7e0bc4ee5510d7c180bdaa841d90adce78330f6e5b549dcd904c4785a97d243f", - "electron-lint.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "frontend-before-preload-bundle.log": "0c0a688debc95cc5a083c83cd1f7b8dc23ba21e950ccf7bf6f3eb766a90862ba", - "frontend-conformance.log": "aca53346fd587074747ebe90ab1167724bd5e976895cc2561f0e03bd12ae4d58", - "generate.log": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "generated-parity.json": "ce45addf6b7905fd88c809b0238df681a8c956e37444ffe1b3df4e8f8e5d3c6b", - "generator-tests.log": "708ddda8a689326282453267d609ffec0a169fda4dc5323d42b93dffd9376515", - "hosted-failure-excerpt.log": "d12f84582664c73168bbaa156ff1c2a4f03c0aa100f223975ddef7971358292b", - "identity-before-commit.txt": "46a371a3e13dfba73e0461ba4868a01eaeb36894ce950374020cbdda0dbec140", - "pnpm-dependency-setup-error.log": "1e0d6b8430858d0a51abaac92b48a30a64cb4da158dc1c49cb01f55de2b5ed06", - "scoped-lint.log": "f1747fe38113e193c296778410fe504c8ab702a18c54b52e2372c048480ecdb2" - } -} diff --git a/docs/plans/artifact-acquisition/reports/q1-starting-state.md b/docs/plans/artifact-acquisition/reports/q1-starting-state.md deleted file mode 100644 index 2be57f410..000000000 --- a/docs/plans/artifact-acquisition/reports/q1-starting-state.md +++ /dev/null @@ -1,53 +0,0 @@ -# Q1 starting state and source inventory - -**Captured:** 2026-09-29. **Evidence type:** read-only repository, GitHub PR/CI, and source review. **Acceptance effect:** none; all Q1 claims remain pending. - -## Repository and history - -- Repository: `/media/jeremy/OrangeCream/Linux Software/repos/owned/ai-systems/Pumas-Library`. -- Starting `HEAD`, `origin/main`, and local `main`: `e37bbf4b964a0e2aadf25f80ab71edd8fa6b3eb3`. `HEAD` was equal to `origin/main` before task work. -- Requested plan commit: `a8359512a580aa25fb2f9c9e4cd7e0dd64fd970d`. It is a child of `04e7f1568f00693c0ef26c77e0150e5e4dd112ea`, which is the merge base with current `main`; it is not an ancestor of current `main`. The commit contains the coordinated plans and shared contract. It is preserved as an ancestor of the Q1 task branch through merge commit `f4dd7ff9`. -- Initial local branches: `main`; the only advertised remote heads were `main` and `ci/windows-native`. Existing archive refs and unrelated detached worktrees were left untouched. The task created no extra worktree. -- Initial worktree state contained the unrelated untracked [`docs/breif/future.md`](../../../breif/future.md). It remains unmodified and unstaged. `pumas-coordinated-plans.zip` was not present in this checkout. No stash, reset, clean, or deletion was performed. -- The primary branch is `work/acquisition-q1-http`, created from the exact accepted base above. The first commit `f4dd7ff9` integrates only the original plan/contract documentation and the docs index; it preserves the original `a8359512` commit. - -## Current PR and CI state - -The read-only GitHub query found no open pull requests. The latest relevant merged PRs are: - -- [PR #6 — Torch installation flow, package validation, and progress](https://github.com/MrScripty/Pumas-Library/pull/6), merged 2026-09-29. -- [PR #5 — Managed Torch runtime foundation and cross-platform installation](https://github.com/MrScripty/Pumas-Library/pull/5), merged 2026-09-29. -- [PR #4 — Torch image adapter integration and dimension fixes](https://github.com/MrScripty/Pumas-Library/pull/4), merged 2026-09-29. - -On starting SHA `e37bbf4b964a0e2aadf25f80ab71edd8fa6b3eb3`, [Build run 36624219733](https://github.com/MrScripty/Pumas-Library/actions/runs/36624219733) and [Scorecard run 36624219480](https://github.com/MrScripty/Pumas-Library/actions/runs/36624219480) both completed successfully. They qualify only the starting base, not this Q1 candidate. - -## Current acquisition owners and paths - -| Concern | Current source owner | Q1 boundary | -| --- | --- | --- | -| HF repository/revision/file selection and model destination | `rust/crates/pumas-core/src/api/hf.rs`; `rust/crates/pumas-core/src/model_library/hf/{metadata,types,download}.rs` | Preserve model selection and destination authorization at the model consumer. | -| HF worker generation, transfer state and finalization | `rust/crates/pumas-core/src/model_library/hf/lifecycle.rs` and `hf/download.rs`; `import_completed_download` awaits the importer | Move shared transfer custody coherently; keep model import/publication distinct. | -| Durable current HF attempt state | `rust/crates/pumas-core/src/model_library/download_store.rs`; recovery/root grants in `model_library/download_recovery.rs` | This is HF-specific today; it cannot silently become the neutral runtime store. | -| Normal intent acquisition | `rust/crates/pumas-core/src/intent/acquisition.rs` through prepared/owned HF operations | Keep this normal model-facing path connected to the canonical acquisition owner. | -| llama.cpp release/build selection and installation | `rust/crates/pumas-app-manager/src/version_manager/installer.rs` | Keep selection, extraction, install verification and installed metadata with app-manager; replace its independent byte-transfer lifecycle. | -| Existing generic HTTP helper | `rust/crates/pumas-core/src/network/download.rs`, exported from `network` | Public API; no internal production caller was found. External compatibility is unknown, so its removal or delegation is unresolved. | - -The HF transfer loop builds revision-scoped URLs, sends Range requests, writes guarded partial files, observes cancellation/pause, validates selected content, promotes bytes and then waits for importer settlement. A focused existing local TCP fixture, `pinned_aux_and_payload_retry_resume_after_reopen_and_import_exact_revision`, exercises truncated transfer, failed/successful range resume, reopen, byte identity and import. It is not a live Hugging Face service run. - -The llama.cpp path calls `download_archive` from `installer.rs`, keeps an installer-owned retry/progress/cancel loop, and caches under `launcher-data/cache/downloads`. `is_cached_download_valid` currently accepts matching file size; `GitHubAsset` has name, size, URL and content type but no digest. `do_llama_cpp_install` removes the existing tag directory and extracts directly into the final directory before `finalize_llama_cpp_installation` writes metadata. Existing tests cover platform asset selection and extraction/wrapper behavior, not a full live archive acquisition/reopen/publication sequence. Historical real llama.cpp and model-serving observations remain scoped to their recorded older candidates. - -## Retained-state and recovery facts - -Current code reads download-store schema 5 and has a specific schema 4 to 5 migration. The durable document contains download snapshots, recovery revocations, lifecycle cleanup quarantines, admission attempts, queue admissions, and released queue-admission proofs. Snapshots include model repository, filenames, model destination, status, request, revision and optional Hugging Face evidence; destination authority is separately reconstructed from the model root. - -The current standards-remediation plan accepts selected incremental recovery and local-intent operations within their recorded Linux evidence. It explicitly leaves broader C3 recovery and hard-process-crash claims open and refuses unresolved admission/quarantine cleanup replay. The active local-intent plan records M1–M4 complete within its own bounded scope; those results do not accept the proposed shared acquisition owner. - -Source-supported formats are visible, but no actual deployed retained root or older running writer inventory was read. Therefore the deployed record population, old-reader/writer retirement, and safe rollout/rollback facts are **unavailable**. Do not modify live roots or claim migration safety until an owner records those facts. Disposable v4/v5 fixtures and current-reader reopen tests are independent and may proceed. - -## Plan and authority dispositions - -- Acquisition Q1 is the only active implementation slice. AQ-HTTP, AQ-PACKAGES, AQ-S3 and AQ-COMPLETE remain not ready. -- The Torch package resolver/install path remains with the current Torch plans until acquisition Q2; Q1 does not change package resolution or attempt a network-denied install. -- Runtime R1 remains unstarted until AQ-HTTP passes at its target scope and the prerequisite is merged into current `main`. Runtime R2 remains gated by R1 and AQ-PACKAGES. -- No task-created worktree exists. All pre-existing `.muse` and `passeur_cache` worktrees, archived branches, and user-owned files remain untouched. -- Q1 real HF service/import, current llama.cpp archive/install, desktop control, capacity, deployed migration, and old-writer evidence have not run. No production code or live data changed in the preparation recorded here. diff --git a/docs/plans/artifact-acquisition/reports/s3-authentication-qualification-2026-10-05.md b/docs/plans/artifact-acquisition/reports/s3-authentication-qualification-2026-10-05.md deleted file mode 100644 index 409b0555e..000000000 --- a/docs/plans/artifact-acquisition/reports/s3-authentication-qualification-2026-10-05.md +++ /dev/null @@ -1,172 +0,0 @@ -# Explicit request-scoped S3 authentication - -Status: implemented and locally qualified; independent review, exact-head hosted -qualification and integration are coordinator-owned. AC13/AC14 and AQ-S3 remain -pending. This does not establish real-provider acceptance. - -## Exact source and authority - -Branch: `feat/acquisition-s3-auth-63123fd8`. - -- Base/PR40 head: `63123fd8f9f866064a8315096ab3fb1fc81e8f0f`. -- Base tree: `163ef2442695b44555ac0e42ff79a6a88de9e817`. -- Preserved main: `05717338c2aea737483fb4b28c3ed4053a65de96`. -- Tested code milestone: `d74114c63a9717692fa7051ef5146d7253a2c5c5`. -- Code tree: `bd21dd5e46970b74e18706076adc9defa7de9586`. - -The selected environment initially contained older `work` source at `0dd38c70`. -Normal fetch obtained current PR40 and main; the expected PR40 head/tree were -checked before creating the distinct feature branch. Implementation uses that -verified base. Main is an ancestor. No history rewrite, old seed reuse, external -review contact, PR creation, merge, native repair, or provider provisioning ran. -The frozen watcher/importer/reconciliation and both S3 manifest implementations -are byte-identical to the base, as are Cargo manifests and lockfile. - -No applicable AGENTS or `.agents/skills` files exist in this environment/checkout. -CONTRIBUTING, architecture/development docs, Q3 plan and credential contract were -read. The documented local Coding-Standards path is absent; the normal connected -GitHub reads and a temporary clone supplied current standards -`188beda1fa477d21d576c233dd8c7f4c4c267d23`. Its native executable Router returns -`complete` for the actual library/Rust/API/async/security/diagnostic/contract, -implementation/verification/documentation/commit and test-oracle facts, including -required closure. This records applicability, not a whole-repository compliance -certificate or independent review. - -## Public behavior and implementation - -The additive public exports are `S3Credentials`, its fallible -`new(String, String, Option)`, and -`S3Reader::new_authenticated(S3ReaderConfig, S3Credentials)`. -`S3ReaderConfig` and anonymous `S3Reader::new` retain their shape and behavior. - -Credential construction validates printable nonempty ASCII without whitespace; -access-key IDs also exclude `/`, `,`, `=`. Authenticated signing regions are -ASCII alphanumerics/hyphens. These admitted inputs prevent the pinned signer's -infallible header conversions from receiving malformed values. Validation errors -never echo inputs. All credential fields, including the access-key ID, are -redacted by `Debug`. Credentials have private fields and no serialization, -cloning, discovery, refresh or persistence API. - -The authenticated constructor requires HTTPS even with `allow_http: true` and -retains normal peer verification. A private `cfg(test)` authentication variant -admits literal IPv4/IPv6 loopback HTTP only for unit fixtures. It is absent from -production and from the public `test-support` feature. Tests through the actual -public API refuse plaintext loopback with that feature enabled. - -Both paths explicitly install a static credential provider; anonymous signing -remains disabled and uses empty credentials. The authenticated path supplies -only the owned explicit key/secret/token and enables the maintained -`object_store = 0.12.4` SigV4 implementation. Reader/selection memory owns that -capability; selections may outlive the reader, and callers scope them to their -bounded acquisition. No expiry/rotation mechanism or memory-erasure guarantee -is added. - -A small existing-connector extension marks Authorization and security-token -headers sensitive before reqwest receives the signed request. Remote SDK -protocol errors are contained to a fixed safe message because upstream errors -can include echoed bodies/headers. Existing error variants remain available; -raw protocol-error text changes for anonymous callers too. No new logger or -restricted diagnostic store is introduced. - -Endpoint/addressing authority, no proxy discovery, no redirects, zero nested -retries, operation/transfer budgets, exact key and VersionId, If-Match/range -checks, verifier, receipt schemas, publication and cold-recovery ownership stay -with their existing owners. Authentication does not change source identity or -receipt identity. No credential data enters the manifest, continuation resource -identity or durable acquisition state. No dependency or feature graph changes. - -## Deciding evidence - -Nine private authentication unit tests pass on Linux x86_64/Rust 1.92.0: - -- Captured HEAD and conditional range GET signatures verify for both addressing - styles with and without session tokens. The test-only RFC 2104 HMAC oracle - uses existing SHA-256 and is independently anchored by RFC 4231 case 1. It - checks AWS canonical-request/key-derivation semantics; wrong secrets and - key/version/range/If-Match tampering invalidate captured signatures. -- Selections retain their signing capability after reader drop. Session-token - headers appear only for explicitly supplied tokens; secrets are never sent as - plaintext request fields. -- Invalid credentials and signing regions return exact configuration errors; - credential Debug redacts every field. Private fixture transport rejects domain - names, non-loopback IPs and HTTPS in that plaintext fixture path. -- Signed 302/307/400/403/503 fixtures return contained failures with one request; - the destination listener observes no followed redirect. Echoed credentials - and a malformed range-header token never escape Display/Debug or the shared - error projection. Failed metadata validation writes no output. -- One isolated child test process supplies synthetic ambient AWS credentials, - metadata/web-identity endpoints, region and proxy variables. Anonymous access - still has no Authorization/token; signed requests use the explicit credential - and region. Parent environment is never mutated. -- Anonymous, long-lived-key and session-token selections have equal manifests - and acquisition resource identities. A signed request traverses the real - shared acquisition owner, verifies SHA-256 bytes, issues/settles its existing - receipt, closes both owners and cold-reopens the adopted record. Persisted - `downloads.json` and receipt/record Debug contain none of the synthetic access - material. Source sees exactly HEAD plus GET, with no cold source replay. - -The two added public-constructor tests cover HTTPS admission and credential-free -origin validation; the unchanged eleven reader oracles remain. All 13 reader -tests and all 41 existing S3 acquisition/import regressions pass, including the -staging and distinct-VersionId successors. The existing loopback fixture setup -is extracted once for reuse; public production authentication is not weakened. - -Primary protocol authorities: -[AWS SigV4](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv-create-signed-request.html), -[RFC 4231](https://www.rfc-editor.org/rfc/rfc4231), and the exact locked -[object_store source](https://docs.rs/crate/object_store/0.12.4/source/src/aws/credential.rs). -These authority reads and local fixtures do not establish live-provider behavior. - -## Commands and logs - -Setup uses the environment's existing pinned toolchain: - -```sh -source /workspace/.pumas-tools/env.sh -export CARGO_PROFILE_DEV_DEBUG=0 CARGO_PROFILE_DEV_INCREMENTAL=false -export CARGO_PROFILE_TEST_DEBUG=0 CARGO_PROFILE_TEST_INCREMENTAL=false -cargo test --locked --offline --manifest-path rust/Cargo.toml -p pumas-library \ - --no-default-features --features s3 --lib acquisition::s3::auth_tests -- --test-threads=1 -XDG_CONFIG_HOME=/tmp/pumas-s3-auth-config cargo test --locked --offline \ - --manifest-path rust/Cargo.toml -p pumas-library --no-default-features \ - --features s3,test-support --test s3_reader --test s3_acquisition -- --test-threads=1 -cargo clippy --locked --offline --manifest-path rust/Cargo.toml -p pumas-library \ - --no-default-features --features s3,test-support --all-targets -- -D warnings -cargo check --locked --offline --manifest-path rust/Cargo.toml -p pumas-library --no-default-features -cargo fmt --manifest-path rust/Cargo.toml --all -- --check -python3 scripts/release/check-dependency-features.py -git diff --check -``` - -All listed final commands pass. Unit tests: 9, plus the isolated child test's own -1-test run. Integration: 41 acquisition and 13 reader tests. Clippy is strict; -headless compilation passes; feature checker passes 12 normal/build graphs over -Linux, macOS ARM64 and Windows. Graph evidence does not prove target compilation. - -The first integration attempt had 11 passes and 30 setup failures because API -fixtures tried to create `/home/agent/.config/pumas` on a read-only filesystem. -Using a disposable `XDG_CONFIG_HOME` resolves that setup without changing home, -permissions, production source or the frozen tests. Earlier test-authoring -compile errors were corrected before final qualification. - -Raw final logs, the initial setup-failure log, Router JSON and push log are -retained in `/workspace/scratch/s3-auth/`, with exact byte counts and SHA-256 in -`log-inventory.json`. Final unit log SHA-256: -`fb4427dfaacf27d03a76e99e0b2154e655c8a1a752549fb3ecd8119ee12309ee`. -Final integration log SHA-256: -`60aed5ca1f1894d5ee9ae0484e049f9e60917d0be19bf29da7b45028c7244851`. -No actual account credentials were obtained, sent or provisioned. Only synthetic -loopback fixture credentials are used. Code milestone push was normal/non-force. - -## Remaining scope and next existing-plan feature - -No concrete implementation blocker remains for this credential slice. Independent -review and exact-head hosted acceptance remain with the parent. Real AWS S3, -a non-AWS compatible service, MinIO, live credential expiry/refresh, authenticated -TLS-provider acceptance, desktop/RPC source configuration, complete default/full -native suites, and AQ-S3 qualification are not claimed. - -Next existing-plan implementation feature: Q3's direct explicit source-facing -application workflow/source configuration, using the existing model-facing -operations and newly explicit access capability. Real-provider acceptance stays -separate and requires authorized resources; native repair remains frozen. diff --git a/docs/plans/artifact-acquisition/reports/s3-bundle-reserved-destinations-qualification-2026-10-05.md b/docs/plans/artifact-acquisition/reports/s3-bundle-reserved-destinations-qualification-2026-10-05.md deleted file mode 100644 index 92722997f..000000000 --- a/docs/plans/artifact-acquisition/reports/s3-bundle-reserved-destinations-qualification-2026-10-05.md +++ /dev/null @@ -1,82 +0,0 @@ -# Reserved acquired-bundle destination correction — 2026-10-05 - -Tested implementation milestone: `2defee5c1d85b69f0e2b73e51d9c1980616a1d1d`; tree `89e7525a57143f1bb5b39bc0e061e8532db389bc`. -The subsequent documentation-only commit and final remote state are recorded in -`/workspace/scratch/s3-bundle-reserved/final-state.json`. - -## Scope and lineage - -Separate branch `fix/s3-bundle-reserved-e8082649` starts at frozen -`e8082649a6d4aaebf996c30870d996d43bbee1d3`, tree -`050733c55a3011f23c8832e210d52d0d4d60d695`. The explicit accepted PR40 -merge `d9d907cfe0e57b1e2bc7e296eff1327de835bc5e` and its ordered parents -339032ff / 838eb299 are preserved. Parent owns PRs/review/integration. -No zero-length implementation is included: acquisition reader and manifest, -frontend/Electron/generated wire DTOs, dependencies, watcher and existing -publication-protocol, receipt and recovery modules remain byte-identical to e808. - -The reviewer identified a P2 preflight gap: `metadata.json` could pass desktop -bundle validation, transfer and enter durable Using with a consumer receipt, -then fail the importer's reserved filename check. Retained work prevented -ordinary subsequent admission. That frozen candidate remains changes-requested -until this correction is reviewed/integrated; this report does not claim review -acceptance or alter its frozen ref. - -`ModelImporter::validate_acquired_payload_paths(&[&str]) -> Result<()>` is an -additive pure public preflight. The acquired copy plan's existing normalized -first-component rule is extracted once and reused by that method and final -publication. The same existing `IMPORT_MUTABLE_DOCUMENTS` table owns reserved -metadata, backup, overrides and publication receipt roots, aliases and -descendants. No second blacklist or normalization policy is introduced. - -RPC bundle validation invokes the importer rule after shared portable-path / -manifest checks and before job admission; anonymous and authenticated paths -share it. The public native S3 workflow invokes it before creating its consumer -or resolving source objects. Full path, immutable identity, byte verification, -model format and final publication authorities remain required. Existing wire -shapes and generated schemas are unchanged; the Node structural decoder does -not grant importer destination authority. No new RPC/UI policy copy is needed. - -## Regression evidence - -The pure regression enumerates all importer-owned reserved roots, case aliases -and descendants, plus `_metadata_.json`; valid `config/metadata.json` and -single GGUF paths remain allowed. The native test checks rejected paths before -HEAD, any acquisition/store mutation or staged file creation, then publishes a -corrected request on the same owner. The production HTTPS/RPC fixture checks -`metadata.json`, `overrides.json`, both reserved-root descendants, case and -normalization aliases, metadata backup and publication-receipt descendants: -standard invalid params, idle state, no reserved workspace, no acquisition or -model, followed by successful corrected admission using the same operation ID. -The captured source sequence consists only of the corrected operation's pins. -Existing anonymous/authenticated signing, cancellation, receipts, retained -failures and credential redaction continue passing in that fixture. - -Logs and hashes: `/workspace/scratch/s3-bundle-reserved/verification.json`. -Commands use Rust 1.92.0 / four jobs / no debug or incremental data / isolated -XDG config, the already inspected standards snapshot 188beda1 and existing -library/Rust/security/async/contracts/verification/commit routing. No AGENTS or -repository `.agents/skills` were present. Checks selected for this correction: -S3 native workflow (7 pass plus isolated child), importer units (122 pass, -1 ignored plus owned child), source-bundle RPC (2 pass and eight HTTPS scenarios), -no-S3 source regressions, strict all-target enabled-S3 core Clippy, and RPC -Clippy with the inherited explicit `-A dead_code` allowance. Exact commands, -exit statuses and counts are recorded in verification JSON. Formatting, -diff checks and unchanged/frozen-path/ref checks are retained there. - -The initial compile omitted the `ModelImporter` import in the native module; -it was corrected before passing qualification. No dependency or security -workaround was required. No real credentials, live-provider/account mutation, -paid service, external reviewer contact or sandbox bypass occurred. - -## Separate successor and pending acceptance - -The separately delegated zero-length capability remains on -`feat/s3-empty-members-e8082649`; these are sibling successors and are not -silently combined. Parent owns their review and composition. A corrected -native request is proven operational here; existing retained Using work from -older binaries still requires its existing reconciliation path and is not -cleared or replayed by preflight. Packaged/browser/native-platform and -real-provider qualification remain outside these fixture claims; AQ-S3 and Q4 -are not advanced. The next implementation slice is the separately delegated -zero-length member capability, followed by authorized Q3 provider acceptance. diff --git a/docs/plans/artifact-acquisition/reports/s3-consumer-receipt-bound-2026-10-05.md b/docs/plans/artifact-acquisition/reports/s3-consumer-receipt-bound-2026-10-05.md deleted file mode 100644 index eb37b374c..000000000 --- a/docs/plans/artifact-acquisition/reports/s3-consumer-receipt-bound-2026-10-05.md +++ /dev/null @@ -1,124 +0,0 @@ -# Consumer receipt byte-budget PR39 review correction - -PR39 review 5409255854 selected all 18 files and identified a valid new-publication -bound defect at discussion_r4180140732. The S3 group-pin encoding limits source -identities but not arbitrary generic manifest lists, callback payloads, or the -sum of unique directory prefixes in a payload proof. Separate branch -`fix/acquisition-output-receipt-bound-159fd371` starts at exact -`159fd371d7669e53959e874ffc7f989a66f999b0` (tree -`4a9a0d515538418056a24ca85c19edf9fa143bfd`) and preserves accepted main -`73fec2e06c75ddae8c0e58be6ffcf352923376bd` (tree -`b449f2c88d3e34a9cfa16dd14c778d6b802c8495`). Parent owns PR39 review and integration. - -## Admission and issuance contract - -The sole production write is `acquisition/service.rs`. New HTTP/S3 facade -admission counts actual `serde_json::to_writer_pretty` manifest bytes without -allocating a serialized buffer, capped at 4 MiB. It separately reserves 2 MiB -for every file and each unique parent prefix, charging its actual JSON-encoded -name plus 512 bytes for physical evidence and formatting. Deep paths cannot -hide quadratic prefix expansion behind the S3 pin bound. Refusal occurs before -schema/store admission and payload transfer; prior S3 selection HEAD metadata -resolution is a separate existing step. - -The actual completed `AcquisitionConsumerReceipt`, including demand, workspace, -verified files and callback data, must fit 4 MiB immediately before its new -store issuance. Refusal retains verified inputs and an unreceipted Using use, -and never invokes publication. These checks run within the existing owned -blocking scope, retain capabilities, use checked accounting, and return normal -typed validation results without turning input refusal into a shutdown failure. - -This is a conservative new-operation support budget. Existing manifest -construction/decoding, schema-7 persistence, receipt validation, retained -settlement/reconciliation, model publication formats and late defensive 16 MiB -checks remain unchanged. No new abstraction, dependency, generator, lifecycle -owner, fallback, source reselection or cross-layer acquisition dependency is added. - -## Actual output schema reserve - -Existing real two-file bundle publication/cold-proof fixtures now inspect their -actual generated version-2 output receipt. The oracle widens both physical u64 -identity fields and file size to u64::MAX, SHA to 64 characters, publication ID -to 36 characters, model ID to its held-path 4096-byte bound, and original stage -to its current 48-character basename. It measures the real fixed envelope and -individual directory/file map entries; new structural fields or reserve overflow -fail the oracle. It also measures nested binding indentation. - -Embedding pretty JSON adds at most two spaces per existing newline, bounded -by twice the 4 MiB binding. Current proof entries fit the encoded-name-plus-512 -reserve; doubling the 2 MiB namespace allowance is conservative. A 16 KiB fixed -envelope reserve covers the current bounded root/stage/ID/state fields: -`2 × (4 MiB + 2 MiB) + 16 KiB < 16 MiB`. Producer digest verification, complete -file-set proof, Pending/Confirmed transitions and Ready index ordering remain -the existing authorities. The late bound remains defense for retained/ordinary -publication and schema evolution; it is not removed or treated as early admission. - -## Red baseline and final evidence - -The two red regression bodies are byte-identical in final qualification: - -- A valid generic manifest serialized to 17,073,387 bytes, round-tripped through - the unchanged decoder, and reached a source GET on original 159fd371 rather - than refusing admission. -- A real pinned S3 acquisition issued a 17,827,288-byte callback binding and - reached the publication callback. The fixture deliberately observed issuance - without invoking model side effects. - -Final controls refuse both with `acquisition.consumer_document_size`. A valid -3812-byte deeply nested path refuses with `acquisition.consumer_namespace_size` -before source/store/prepare effects. Callback refusal preserves exact verified -bytes, Using record, absent completion receipt and empty model index. Added -missing/null publication identity with intact payload keeps cold uncertainty; -existing changed/missing/legacy and bundle controls remain active. - -Final runtime: 36 acquisition/import + 11 S3 reader + five HTTP tests = 52, -zero failures or ignored tests, Linux x86_64, locked/offline Rust 1.92, -no default inference features, S3 enabled. The low-space build uses the existing -shared target, one Cargo job, package-local debug/incremental settings and a -**test-only** `cargo rustc ... -- -C strip=symbols`, followed by its exact produced -integration executable. Test assertions and production behavior are unchanged -by stripping. Command arrays, executable SHA/size retirement journals and logs -are in the review package. - -Supporting qualification: strict enabled-S3/test-support all-target core Clippy, -actual headless compile, 12 feature graph contracts, canonical attribution, -workspace dependency ownership, Rust formatting/diff, and 20 release/workflow -contracts. All 482 locked package identities and unchanged generator bytes are -verified. HF/speech, retained manifest/store, publication/staging and import -custody source bytes match 159fd371. The unchanged generator plus canonical -attribution check is qualification here; no regenerated dependency identities -or license substitution is introduced. - -Failed attempts are retained: initial/retry linker SIGBUS at disk exhaustion -ran no tests; test-only symbol stripping allowed the red run. Initial source -compile failed E0425 from insertion in a similarly shaped method, corrected -before runtime. An unsourced feature-check invocation could not locate Cargo; -the sourced final command qualifies the result. Only positively identified -completed/failed task outputs were removed, with size/SHA journals. - -## Separate observed AQ-S3 blocker and limits - -A temporary real 3 MiB callback/bundle stress extension ran 36 passes/one failure. -During live copied staging, owned background reconciliation attempted -`.tmp_import_…/config/tokenizer_config.json/metadata.json`; shutdown reported -ENOTDIR. Its exact fixture source, patch, failure log and intermediate build -are preserved outside this bounded repair. No production discovery repair or -passing large-payload concurrent-discovery claim is included. The final repair -returns to the frozen real producer fixture and adds only the output-schema -oracle; the red byte-budget assertions are unchanged. This failure is useful -independent gap evidence, not silently retried or recategorized as acceptance. - -Full/default ONNX/native execution, full unit aggregate, hosted validation, -independent review of this repair, supported-platform hard crash/power loss, -live AWS/non-AWS/MinIO, credentials, inference and desktop workflows remain -unqualified. Free space is tight and completed ort-sys native outputs are absent; -the install script was not rerun. AQ-S3 remains not ready. No credentials, -permission/network settings, external review requests or merges were changed. -README discussion_r4180140721 and ledger discussion_r4180140718 corrections -preserve exact wording/identities while fixing sentence placement/token spacing. - -Manual standards route: core 7c0e07c670243267e8db2a801169d6a0bb09756d and router -3aec08f37c01fe8be2e701ca3abe68bb857f3388; implementation, verification/oracles, -contracts/evolution, persistence, performance, concurrency, code design, -library, Rust API/async/security, security, documentation and commit modules. -This is bounded route evidence, not whole-engine or external-review certification. diff --git a/docs/plans/artifact-acquisition/reports/s3-credential-boundaries-2026-10-05.md b/docs/plans/artifact-acquisition/reports/s3-credential-boundaries-2026-10-05.md deleted file mode 100644 index 753ac2846..000000000 --- a/docs/plans/artifact-acquisition/reports/s3-credential-boundaries-2026-10-05.md +++ /dev/null @@ -1,78 +0,0 @@ -# Explicit S3 credential boundary — 2026-10-05 - -The authenticated successor follows frozen anonymous `106a6ca40ac41717854d847214ee3a1cf1e673b4` -and its separately tested desktop-review fixes `887308dc094570fe6072b162074294c3dc580cd0`. -Scope is reported before implementation: first contain S3 transport errors and -decode at privileged IPC receipt, then add a distinct explicit authenticated -start command and one-use form inputs through the existing native operation. -No native reader/import/discovery/repair files are admitted. - -## Traced boundaries - -| Boundary | Serialization/lifetime | Required containment | -| --- | --- | --- | -| Renderer inputs | Explicit DOM values; no account/configuration/default storage | One-use inputs, cleared on submit, close and mode replacement; no secret in task state or recovery | -| Renderer hook/API | Ephemeral call arguments, UUID/progress/result observation | No secret state/ref, error logging, automatic credential replay or retry after lost acknowledgement | -| Generated preload decoder | Bounded immutable JSON copies, Electron structured clone | Closed source/credential fields and static validation errors; no diagnostic stringify | -| Privileged IPC handler | Another decoded request during startup/short admission call | Decode/project response before IPC; contain initialization/transport errors | -| Node RPC bridge | Explicit JSON request over existing direct 127.0.0.1 control plane | No proxy/redirect forwarding, finite deadline and response bound, matching envelope ID, static transport failures, no reflected raw body/backend message | -| Rust HTTP/parser | Bounded body/serde values consumed into a non-Debug command | Static admission errors and numeric request diagnostics; no body/params tracing | -| RPC worker | One request-owned credential capability | Pending/safe result records contain UUID/control/progress only; move credentials to native operation, never persist/reset/replay them | -| Native reader/selection | Existing opaque in-memory credentials and static SDK provider | HTTPS S3 origin regardless of allow_http; sensitive signing headers, no ambient credentials/proxy/redirect/refresh/fallback | -| Acquisition/import/caches | Existing source pins, byte evidence and ModelImportSpec receipts | No credentials in manifest/receipt payload, publication metadata, output/cache/workspace or telemetry; finalization/retained custody unchanged | -| Child stdout/stderr and errors | Existing bridge forwards native process logs | Native logs include safe method/numeric ID/error class only; SDK headers stay sensitive and public errors stay static; synthetic capture/scan required | - -The existing desktop control plane is loopback HTTP and Electron IPC; it is not -a new TLS or remote RPC service. HTTPS remains mandatory for credentialed S3 -source access. No new origin, listener exposure, trust exception or security -setting is introduced. JS/serde/string copies are request-scoped; no secure -memory erasure or protection from privileged process inspection is claimed. - -## Bounded transport prerequisite - -Inspection found two concrete gaps in generic bridge behavior: malformed JSON -errors embed raw response bodies and JSON-RPC errors embed backend message/data; -main also returns a raw response across IPC before preload decoding. These -paths are unsafe for a future request that can encounter reflected credentials. -The prerequisite applies only to the explicit S3 methods and reserves the future -authenticated start name; it exposes no credential input or authentication UI. - -S3 calls now require a matching JSON-RPC envelope/ID and a normal successful -HTTP response, cap response bytes at 64 KiB under the existing finite deadline, -use a direct agent with explicit empty proxy configuration, clear the owned -serialized request/body buffers after use, and contain failures behind static -unchained errors. Node and privileged IPC both decode the closed source outcome -before returning it. Safe typed error code/class/custody/model identity remain; -arbitrary error message text is projected to a static S3 message. Other RPC -routes retain their existing behavior. No source retry/object/receipt policy -changes. - -Actual controlled Node HTTP tests cover malformed/reflected JSON and JSON-RPC -errors, oversized output, wrong IDs, malformed result shapes, typed reflected -failure messages and throwing request serializers. The actual compiled main IPC -handler is also exercised with malformed values, exceptions and reflected typed -errors. Existing bridge lifecycle, deadlines and bundled-preload regressions -remain required. Browser/packaged/native/default qualification stays separate; -the local sandbox helper is not modified or bypassed. - -Raw evidence and subsequent credential qualification are retained under -`/workspace/scratch/s3-desktop-auth/`. Parent owns independent review, hosted -qualification and PR/merge/Library coordination. - -## Implemented successor evidence - -Transport prerequisite is `0023bcf9954f99c2755395d82b8daa632f73bfcd`; -authenticated successor is `39f7689ab20a10276839a8f5dff206879d53b008`. -The closed credential DTO has no Debug/Clone/Serialize; per-field printable ASCII -is bounded to 4096 bytes, with native access-key delimiter restrictions. Before -admission, bounded temporary copies validate using the actual authenticated -constructor and are dropped; owned originals move into the bounded native job. -Safe Current/task/result records never contain credentials. All credential DOM -nodes clear before the admission wait and on close/replacement/unmount; only -boolean mode is React state. Lost acknowledgement observes UUID without replay. -Actual controlled HTTPS, RPC, compiled preload/main transport and DOM tests cover -these owners, capture and scan DEBUG stdout/stderr and owned files/receipts, and -refuse reflected diagnostics. A proxy-configured global HTTP agent does not -redirect the local request; a 302 response is refused without following Location. -See [complete qualification](s3-desktop-authentication-qualification-2026-10-05.md) -for exact logs and remaining browser/default/platform/provider limits. diff --git a/docs/plans/artifact-acquisition/reports/s3-desktop-authentication-qualification-2026-10-05.md b/docs/plans/artifact-acquisition/reports/s3-desktop-authentication-qualification-2026-10-05.md deleted file mode 100644 index d6e862bf5..000000000 --- a/docs/plans/artifact-acquisition/reports/s3-desktop-authentication-qualification-2026-10-05.md +++ /dev/null @@ -1,123 +0,0 @@ -# Authenticated S3 desktop/RPC qualification — 2026-10-05 - -## Exact candidate and preserved history - -Branch: `feat/s3-desktop-auth-106a6ca4`. - -- Frozen anonymous base: `106a6ca40ac41717854d847214ee3a1cf1e673b4`, tree `ff61e5b4df248fa31731abcaf2dbdccb17430860`. -- Separately published review-fix ancestor: `887308dc094570fe6072b162074294c3dc580cd0`, tree `89abc11e201b75083df47985dc7d8314d9ef88ec`. See [review corrections](s3-desktop-review-fixes-2026-10-05.md). -- Tested transport prerequisite: `0023bcf9954f99c2755395d82b8daa632f73bfcd`. -- Authenticated implementation: `39f7689ab20a10276839a8f5dff206879d53b008`, tree `01f49715a2b3637826591a078134db0bc59f62ca`. -- Original PR40 ancestor: `63123fd8f9f866064a8315096ab3fb1fc81e8f0f`, tree `163ef2442695b44555ac0e42ff79a6a88de9e817`. -- Main remains `05717338c2aea737483fb4b28c3ed4053a65de96`; frozen reader `ffecce07220f6504fb1db2e348759473bd284de6`, native workflow `eabc395966f2f3f155b298144bc81c4941121225` and anonymous refs are unchanged. Parent's separate PR40 branch advanced to `1e811936870635d8283e1a3709649877e4647130` at final read-only snapshot; this successor neither fetches/integrates nor alters it. - -Core/app-manager, reader/signing/manifest, importer/watcher/discovery/native -repair, hosted workflow, Cargo manifests/lockfile and package/dependency bytes -are identical to the frozen anonymous base. No new dependency or feature policy -is introduced. The documentation milestone following the implementation records -this report; `final-state.json` binds its final head/tree and remote equality. - -## Scope and public surface - -The additive `start_authenticated_s3_model_import` command accepts a closed -`{source: S3ImportParams, credentials: S3CredentialParams}` object. Source facts -are unchanged. Access key and secret are required, with optional omitted/null -session token. Nonempty printable ASCII credentials are bounded to 4096 bytes -per value; access keys exclude SigV4 delimiters. The actual HTTPS-only native -constructor preflights before admission/workspace creation, using bounded -transient copies, then owned originals move into the existing native request. -Credential DTOs have no Debug/Clone/Serialize implementations. Three anonymous -start/read/cancel commands and their outcome schema remain compatible; builds -without S3 return typed unavailable for the new command too. - -Rust exports the two new DTO schemas into the six canonical generated desktop -files; generated copies explain the validator diff size. Preload, IPC registry, -ImportAPI and the dialog hook gain the distinct authenticated entry. Credentials -are ephemeral arguments rather than task state, refs, defaults or recovery data. -Uncontrolled password inputs clear synchronously before awaiting submit, and on -close, mode replacement and unmount. Lost admission acknowledgement observes the -same operation UUID without credential replay or anonymous fallback. - -Before this command was implemented, a separate prerequisite contained raw -bridge failures and decoded source responses in privileged main before IPC. -All source methods use static transport/validation/error text, a 64 KiB response -budget, exact JSON-RPC correlation, bounded existing deadlines, a direct Node -HTTP agent with proxy configuration disabled, and no redirect following. Existing -loopback HTTP and Electron IPC carry transient request copies; credentialed S3 -reads remain normally verified HTTPS. Secure memory erasure and privileged -process-inspection resistance are not claimed. [Boundary trace](s3-credential-boundaries-2026-10-05.md) -records every serialization, error/log, persistence and frontend lifetime owner. - -## Local verification - -Linux x86_64, Rust/Cargo 1.92.0, Node 24.19.0, pinned pnpm 10.33.0, four Cargo -jobs, dev/test debug and incremental disabled, task-owned -`XDG_CONFIG_HOME=/tmp/pumas-s3-auth-config`. CONTRIBUTING routes to standards -snapshot `188beda1fa477d21d576c233dd8c7f4c4c267d23`; route and read inventory -are in `standards-route.json` and `standards-snapshot.json`. No AGENTS or local -.agents/skills files were present. Logs below are under -`/workspace/scratch/s3-desktop-auth/`. - -| Check | Observed result | Passing log | -| --- | --- | --- | -| S3 RPC full suite | 199 unit + 16 integration + 2 intent pass; 12 existing ignored/live cases | `auth-rpc-tests-all-final.log` | -| Controlled authenticated production HTTPS/RPC | Success without/with token, stalled HEAD/GET cancellation, reflected provider failure; captured logs/owned files/safe snapshots and receipts exclude synthetic credentials | Same full-suite log; isolated child output captured and scanned by parent fixture | -| Existing anonymous production HTTPS/RPC | Existing VersionId import/cancel/shutdown regressions pass unchanged | Same full-suite log | -| No-S3 source regressions | 4 pass, including authenticated typed unavailable | `auth-headless-tests-final.log` | -| Frontend full suite | 860 tests / 130 files pass | `auth-ui-tests-all.log` | -| Final DOM/hook regressions | 17 tests / 3 files pass after final test-only lint correction | `auth-ui-tests-qualified.log` | -| Electron Node full suite | 239 pass; one existing native sandbox smoke skipped | `auth-electron-tests-qualified.log` | -| Actual local source transport | 3 pass: reflected/malformed/oversize errors, privileged containment, proxy-configured global agent ignored and redirect refused | `auth-transport-constraints.log` | -| Canonical contract check/generator tests | Fresh canonical outputs; 8 generator tests pass | `auth-contract-check.log`, `auth-generator-tests.log` | -| Types/lint/builds | Frontend and Electron pass; default/library-only Vite and bundled preload built | `auth-ui-types-qualified.log`, `auth-ui-lint-qualified.log`, `auth-ui-build-default.log`, `auth-ui-build.log`, `auth-electron-build-final.log`, `auth-electron-lint-qualified.log` | -| All-target S3 Clippy | Pass with existing dead-code lint explicitly excepted | `auth-clippy-final.log` | -| Format/diff/frozen-path/ref checks | Pass | `auth-fmt.log`, `auth-diff-check.log`, `auth-frozen-state.json` | - -Commands: `cargo test --locked --offline -p pumas-rpc --no-default-features ---features s3`; `cargo test --locked --offline -p pumas-rpc ---no-default-features source_`; `cargo clippy --locked --offline -p pumas-rpc ---no-default-features --features s3,export-contract,test-support --all-targets --- -D warnings -A dead_code` (from `rust/`). Frontend: pinned pnpm `test:run`, -`check:types`, `lint`, `build`, `build:library-only`, and final focused Vitest -hook/dialog/modal tests. Electron: `build`, `lint`, compiled -`node --test tests/*.test.mjs`, canonical generator `--check`, and its eight tests. - -The existing synthetic localhost certificate/trust anchor is used in isolated -children with normal verification. HEAD/GET have SigV4 authorization with the -explicit synthetic access key; secret is absent from headers; a supplied token -appears in the sensitive token header and signed-header list, and omission has -neither. Synthetic ambient credentials are ignored. The frozen reader's -independent cryptographic signing fixtures remain separately qualified; this -successor verifies composition rather than replacing that oracle. Exact pinned -VersionId, GGUF bytes, Ready/registered model and manifest/demand/owner completion -receipt are checked. All disposable owned files and DEBUG tracing output are -scanned for explicit synthetic access/secret/token values. Provider failures -reflect these values in their fixture body; public diagnostics remain static. -Cancellation leaves no published model and owned operations are drained. - -Earlier compile/test/lint failures are retained: initial fixture attempted to -serialize a deliberately non-serializable admission error; one UI expectation -included the new checkbox label; project lint refused non-null assertions/generic -errors in tests. Final logs identify their corrected results. The full frontend -run preceded only the final test assertion lint correction; focused tests, -types/lint/builds passed afterwards. The final Electron suite includes the last -proxy/redirect regression. - -## Limits and next existing-plan feature - -The frozen anonymous qualification already records sandboxed Chromium startup -failure (misconfigured installed SUID helper/crashpad), ort-sys's normal artifact -HTTP 403 blocking default inference Clippy, and pre-existing headless Torch/fixture -dead-code blocking fully strict Clippy. These remain unchanged; no bypass or -unrelated fix is attempted. Passing Clippy explicitly excepts dead_code. DOM -fixtures are not browser focus/layout/keyboard or packaged Electron evidence. -Parent owns supported hosted browser/default/platform qualification, independent -review, PRs/merges and Library delivery. No real account credentials, live provider, -provisioning, paid service or external reviewer contact occurs. - -This completes the admitted authenticated single-object desktop/RPC slice. -The next existing-plan Q3 implementation candidate is explicit pinned multi-file -source selection through the existing native GGUF-plus-auxiliary workflow, -without changing model format or publication ownership. Real AWS/non-AWS/MinIO -acceptance, credential refresh and Q4 installed/native qualification remain -separate; AC13/AC14 and AQ-S3 are not advanced. diff --git a/docs/plans/artifact-acquisition/reports/s3-desktop-bundle-qualification-2026-10-05.md b/docs/plans/artifact-acquisition/reports/s3-desktop-bundle-qualification-2026-10-05.md deleted file mode 100644 index 0651e517e..000000000 --- a/docs/plans/artifact-acquisition/reports/s3-desktop-bundle-qualification-2026-10-05.md +++ /dev/null @@ -1,183 +0,0 @@ -# Pinned multi-file S3 desktop qualification — 2026-10-05 - -## Exact lineage and accepted composition - -Branch: `feat/s3-desktop-bundle-d30412e9`. - -| Milestone | Commit | Tree | -| --- | --- | --- | -| Frozen authenticated base | `d30412e94e867a9561afbbcb3d713d6ac6c88ae1` | `245b5fb0d544a1cd103bb757501e43487424bcf0` | -| Tested core preflight/progress prerequisite | `dd90f416a958013b29949b278aa72e9765befa69` | `1fd179a61a2c2c3f8e31040b8b229dd0ebf00bed` | -| Tested desktop/RPC bundle implementation | `339032ff4acb53e43aa36c6edf96739101121620` | `8d08ba41f12a358ed07a19095a96161847a6f191` | -| Accepted main / PR40 | `838eb2990905144a59830f1a16fe91b4e1105d4d` | `f6d6c1d3c5ba5be0fb998a6fd157fcb31c63dc72` | -| Explicit normal composition merge | `d9d907cfe0e57b1e2bc7e296eff1327de835bc5e` | `82511113e7e82a44ee526f91a8ce7f480282e0ec` | -| Qualified empty-member refusal fixture/text follow-up | `5104a21ed4d6162e3506db0e3da43cf78201741f` | `a763ed439181876e591501ec616305dcd6d97bee` | - -The composition's ordered parents are **339032ff then 838eb299**. Accepted main's -ordered parents are **05717338 then 1e811936**. Main was fetched and exact head, -tree and parents verified before the coordinator-authorized normal merge; no -cherry-pick, history flattening or force push was used. All frozen reader, -native workflow, anonymous, review-fix and authenticated commits remain separate -ancestors and their branch refs remain unchanged. Original PR40 `63123fd8`, tree -`163ef2442695b44555ac0e42ff79a6a88de9e817`, is preserved in the lineage. - -Before composition, every PR40 repair path was byte-identical to frozen d30412e9. -The merge introduces only accepted PR40 publication/discovery changes and its -report, without modifying their implementation. Desktop/RPC/dependency bytes are -identical between 339032ff and the merge. Final integration now includes PR40's -accepted repairs; it must retain this composition. `composition-state.json` and -`composition-paths.txt` bind the exact evidence. A following documentation commit -records this report; `final-state.json` binds its final head/tree and remote match. - -## Concrete scope and APIs - -Scope was reported before implementation: reuse the existing native explicit -manifest, acquisition consumer, GGUF-plus-auxiliary importer, model registration, -receipt and cancellation owners; add only complete-set preflight and accurate -observation before exposing the desktop inputs. - -The reader adds pure `S3Reader::validate_manifest_entries(&[S3ManifestEntry])`. -It reuses the reader's exact object validator and shared ArtifactFile/Manifest -validators, including exact key/version evidence and the 16 KiB encoded revision -budget. The temporary source label grants no selection/access/verification -capability; native selection remains authoritative. Its existing private -`s3/manifest.rs` implementation is untouched by this feature. Namespace, staging -aliases, duplicates, prefix/case collisions and conflicting same-version digest -pins refuse before worker/workspace admission. Different versions of the same -key remain distinct. Actual object existence, size and digest correctness are -established by the existing resolver/transfer, never by preflight. - -`AcquisitionHost` gains default no-op `file_started(index)` and -`file_acquired(index, bytes)` observations around its existing sequential loop. -There is no additional transfer/retry/custody writer. Native -`S3ModelImportControl::subscribe_bundle()` and root-exported -`S3ModelBundleProgress` add a separate safe watch channel. Existing native request, -progress struct and subscribe APIs are unchanged. Explicit member boundaries -track acquired staging bytes plus the current-file attempt, without mistaking -retries or zero/cached counters for another file. Total size is known only after -complete resolution. None of these counters prove complete-set verification, -publication, registration or settlement. - -Additive commands: - -- `start_s3_model_bundle_import`: common explicit source/model facts, an exact - primary GGUF basename, and 2–32 `{key, version_id, logical_path, sha256}` members. - Other members are portable relative paths in the existing inert extension set: - json, txt, md, model, tiktoken, vocab and merges. -- `start_authenticated_s3_model_bundle_import`: the same source request plus the - existing closed one-use credential DTO. HTTPS, bounds, no ambient discovery, - no refresh/fallback, static errors and ephemeral lifetimes remain unchanged. -- `get_s3_model_bundle_import`: same optional UUID read, returning existing - `outcome` plus safe running `bundle_progress`. Decimal strings preserve u64 - bytes, including counts beyond JavaScript's integer precision. Existing - cancellation is reused with the same UUID. - -Both starts return the existing S3ImportOutcome. Single-object anonymous and -authenticated commands and response schemas remain compatible. Builds without -S3 return typed unavailable, including the new getter wrapper. One existing RPC -worker retains only safe UUID/control/progress/results; credentials never enter -its Current snapshot. New methods receive the same privileged diagnostic -containment, response bounds, JSON-RPC correlation, proxy/redirect constraints -and generated receiving decoders as the frozen authenticated milestone. - -The existing dialog adds up to 31 explicit auxiliary rows, with separate exact -pins and logical output paths. It observes aggregate staging progress and uses -the original pre-finalization cancellation. Reopening observes the latest job -without resubmission. Draft row IDs are excluded from wire values. Credential -inputs still clear before awaiting admission, on close/replacement/unmount, and -remain outside React task state/defaults/receipts/telemetry. Lost authenticated -acknowledgement observes the same UUID without replay or anonymous fallback. -Possible publication IDs and retained custody remain visible on failed results. -The established loopback HTTP/IPC control plane and HTTPS-only S3 policy remain; -secure memory erasure/privileged inspection resistance are not claimed. - -## Verification and commands - -Linux x86_64; Rust/Cargo 1.92.0, Node 24.19.0, pinned pnpm 10.33.0, four Cargo -jobs, dev/test debug/incremental disabled, task-owned XDG config. The standards -route remains the authenticated slice's 27 selected standards at revision -`188beda1fa477d21d576c233dd8c7f4c4c267d23`; no AGENTS/local .agents skills were -present. Route/read inventory is retained in `/workspace/scratch/s3-desktop-auth/`. -Current raw logs are in `/workspace/scratch/s3-desktop-bundle/`. - -| Check | Result | Log | -| --- | --- | --- | -| Core prerequisite S3 unit/regressions | 12 tests plus one isolated signing child pass, including pure preflight and retry/file counter behavior | `core-s3-tests.log` | -| Core prerequisite S3 integrations | 41 acquisition, 6 native workflow, 13 reader pass; HTTPS child also passes | `core-integration.log` | -| Composed acquisition lifecycle subset | 171 pass | `composed-acquisition-tests.log` | -| Composed model-library/importer/watcher subset | 832 pass; 5 existing ignored; isolated FIFO child also passes | `composed-model-library-tests.log` | -| Composed reconciliation subset | 35 pass, including temporary discovery and unavailable publication observation | `composed-reconciliation-tests.log` | -| Composed S3 acquisition/import/read integrations | 41 + 6 + 13 pass, including real watcher/receipt/cold proof and HTTPS child | `composed-s3-integration.log` | -| Composed full S3 RPC | 202 unit + 16 integration + 2 intent pass; 12 existing ignored/live | `composed-rpc-tests.log` | -| Final empty-member/bundle fixture | 2 focused pass; eight HTTPS scenarios in isolated child | `composed-empty-member-qualified.log` | -| No-S3 source regressions | 4 pass, extended to both bundle starts and getter | `rpc-no-s3-tests.log` | -| Frontend full suite | 863 tests / 130 files pass | `frontend-tests-all.log` | -| Final composed DOM/hook suite | 20 tests / 3 files pass after help-text-only follow-up | `composed-frontend-source-tests.log` | -| Electron Node full suite | 242 pass; one existing native sandbox smoke skipped | `electron-tests-qualified.log` | -| Contract generator/check | Eight generator tests pass; composed canonical check passes | `generator-tests.log`, `composed-contract-check.log` | -| Types/lint/builds | Frontend/Electron pass; final default/library-only Vite and bundled preload built | `frontend-types-qualified.log`, `composed-frontend-lint.log`, `composed-frontend-build.log`, `composed-frontend-build-library.log`, `electron-build-final.log`, `electron-lint-qualified.log` | -| Composed core Clippy | Strict all-target S3 pass | `composed-core-clippy.log` | -| Final RPC Clippy | All targets pass with inherited dead-code lint explicitly excepted | `composed-rpc-clippy-final.log` | -| Format, diff, frozen ancestry/normal composition | Pass | `fmt-qualified.log`, `diff-qualified.log`, `frozen-state.json`, `composition-state.json` | - -Scope counts overlap; they are not a deduplicated full-core total. Desktop, -RPC and lockfiles were unchanged by the composition, so their previously passing -Node/UI suites are retained; affected Rust lifecycle suites and full RPC were -rerun on the composed tree. The final follow-up adds only the empty-member test -case and help/docs text: its focused Rust/DOM, lint and both builds pass. - -Core commands use `cargo test --locked --offline -p pumas-library ---no-default-features --features s3 --lib ` -and `--test s3_acquisition --test s3_model_workflow --test s3_reader`. -RPC uses `cargo test --locked --offline -p pumas-rpc --no-default-features ---features s3`; no-S3 `source_` and final `source_bundle` focused runs are separate. -Core Clippy is `--all-targets -- -D warnings`; RPC adds features -`s3,export-contract,test-support` and `-A dead_code`. Generator `--check`, -pinned pnpm frontend test/types/lint/build tasks, compiled Node tests, and its -eight generator tests qualify the receiving boundaries. - -The synthetic HTTPS fixture selects two versions of one key into exact GGUF and -nested JSON outputs. Anonymous, explicit credentials without/with session token, -stalled second HEAD and second GET cancellation, reflected missing-member errors, -digest mismatch and empty-member refusal are checked. During held second-file -transfer the getter reports 1/2 files acquired, 2 acquired bytes, 1 current byte, -3/26 total observed bytes and file index 1. Ready metadata, exact bytes and -manifest/demand/owner receipts are checked; failure/cancellation publishes no -model and blocks implicit replay. All owned files and DEBUG stdout/stderr are -scanned for synthetic credentials, while captured signed headers are checked in -fixture memory. Existing source HTTPS trust remains normally verified using the -repository's synthetic localhost certificate in isolated children. - -Raw initial failures are retained: one script first ran from the wrong directory; -one RPC exhaustive serialization arm was added before qualification; schema -copying briefly reintroduced an unnormalized addressing reference and was fixed -by retaining the already normalized enum schema; initial TypeScript build ran -before generation completed; one Node assertion expected ordinary nested -prototypes instead of generated copied values; and an unused test import was -removed after strict lint identified it. Final passing logs are identified above. - -## Material limits and next planned slice - -The existing S3 reader's nonempty range path does not transfer zero-byte source -members. The new negative fixture resolves both HEADs, admits a manifest with a -zero-size member, then proves a failed retained Transferring record, no verified -member receipts, no GET, no publication and no replay. The dialog/docs say to -select nonempty objects. The counter unit's zero-size fast-path bookkeeping is -not a zero-byte source transfer acceptance claim. No reader/identity/retry/ -verification policy was silently changed to mask this limitation. - -Browser focus/layout/keyboard and packaged/platform evidence remain separate: -the previously recorded sandboxed Chromium launch fails due installed helper/ -crashpad configuration. Default inference Clippy remains blocked by ort-sys's -normal CDN HTTP 403; fully strict RPC headless lint retains existing Torch/fixture -dead-code failures. No security setting/bypass, real credential, bucket mutation, -paid service or external reviewer contact occurs. Real AWS/non-AWS/MinIO and -credential refresh acceptance remain separate; AC13/AC14 and AQ-S3 stay pending. -Parent owns independent review, hosted/provider/browser qualification and PRs/ -merges/Library delivery. - -Next existing-plan implementation candidate is S3 zero-byte selected-member -handling through the existing acquisition/reader boundary, with explicit digest -and complete-set evidence. This requires its own bounded scope; it is not part -of this frozen bundle milestone. Provider acceptance and Q4 installed/native -qualification remain separately required. diff --git a/docs/plans/artifact-acquisition/reports/s3-desktop-review-fixes-2026-10-05.md b/docs/plans/artifact-acquisition/reports/s3-desktop-review-fixes-2026-10-05.md deleted file mode 100644 index 39ea4c682..000000000 --- a/docs/plans/artifact-acquisition/reports/s3-desktop-review-fixes-2026-10-05.md +++ /dev/null @@ -1,51 +0,0 @@ -# Desktop review fixes — 2026-10-05 - -Separate successor `fix/s3-desktop-review-106a6ca4` starts exactly at frozen -anonymous milestone `106a6ca40ac41717854d847214ee3a1cf1e673b4`, tree -`ff61e5b4df248fa31731abcaf2dbdccb17430860`. It addresses two coordinator-supplied -source review findings before authenticated UI work. The frozen branch and -reader/native/PR40/main refs remain unchanged. - -Shared ModalDialog now excludes effectively disabled controls using `:disabled`, -including controls disabled by a fieldset and controls selected through explicit -tabindex. A disabled requested initial target also falls back to an enabled -control. The DOM regression reproduces the S3 fieldset/Cancel/Observe/Close -layout and checks forward Tab from Close reaches Cancel and reverse Tab wraps -back. This is DOM/source support only. Actual browser/Electron focus and keyboard -qualification remain parent-owned; Chromium's installed sandbox helper still -prevents a supported local browser launch and no bypass is used. - -Rust's S3 request preflight and its generated desktop schema reject literal -VersionId `null` and object keys with empty, dot or parent segments, including -leading/trailing delimiters. These are the frozen reader's exact-preservation -constraints from `validated_object` and maintained object_store Path parsing; -the reader's pure helper is private, so the receiving wire mirrors that grammar -without changing the reader or importing SDK types into the RPC contract. -A differential test observes the actual reader's Configuration refusal for the -same structural inputs before source I/O. Unsupported keys are refused, never -normalized to a different object. - -The actual controlled HTTPS/RPC regression submits `null` and `../weights.gguf` -before a corrected request in the same process. Both return invalid parameters; -observer remains Idle, no workspace/acquisition exists, and the corrected request -then imports through the existing Ready/receipt/public lookup path. A direct -admission regression also proves bad pins cannot poison later admission. The -renderer/generated IPC tests reject these exact inputs before sending a start. -No retained-work semantics, native publication policy or reconciliation owner -changes. - -Local checks: six focused Rust tests plus one isolated HTTPS child pass; 14 -modal/dialog/hook tests pass; 67 Electron IPC/preload tests pass with one existing -native sandbox smoke skipped. Frontend types/lint, bundled preload build, -canonical contract generation/check, rustfmt and diff checks pass. RPC Clippy -passes with all warnings denied except the inherited headless dead-code lint; -the fully strict/default limitations from the frozen milestone remain open. -Evidence is under `/workspace/scratch/s3-desktop-auth/` in `fix-*` logs and -`focus-tests.log`; exact commit/ref evidence is saved after publication. - -Production writes are limited to ModalDialog and the RPC S3 wire's preflight/ -schema; tests and the six canonical generated contract files support them. -No core/app-manager, reader/manifest/signing, watcher/importer/discovery/native -repair, acquisition schema, dependency or lockfile byte changes. Parent owns -independent review, hosted/browser/default/platform qualification and merges. -The authenticated successor remains a separate feature slice. diff --git a/docs/plans/artifact-acquisition/reports/s3-desktop-workflow-qualification-2026-10-05.md b/docs/plans/artifact-acquisition/reports/s3-desktop-workflow-qualification-2026-10-05.md deleted file mode 100644 index e4fde915f..000000000 --- a/docs/plans/artifact-acquisition/reports/s3-desktop-workflow-qualification-2026-10-05.md +++ /dev/null @@ -1,174 +0,0 @@ -# Anonymous desktop/RPC S3 workflow qualification — 2026-10-05 - -## Exact scope and ancestry - -Branch `feat/s3-desktop-workflow-eabc3959` starts exactly at frozen native workflow -`eabc395966f2f3f155b298144bc81c4941121225`, tree -`ec838d4ebb4a0538b0c2822b4a5a3bf9ee73cb3b`. Tested implementation commit is -`04cb954c3cd226144fcd5dde2d19ac040bda4d78`, tree -`011160b67e12840d33481f760b16c1e78224f928`. -Its ancestry preserves reader `ffecce07220f6504fb1db2e348759473bd284de6` and -PR40 `63123fd8f9f866064a8315096ab3fb1fc81e8f0f`, whose tree remains -`163ef2442695b44555ac0e42ff79a6a88de9e817`. Accepted main remains -`05717338c2aea737483fb4b28c3ed4053a65de96`. - -The coordinator froze the native workflow for independent review and admitted -the next Q3 direct source-facing desktop/RPC composition. Inspection selected -one anonymous pinned GGUF as the concrete small scope, reported before changes. -Authentication is deliberately absent from this wire/UI: a qualified ephemeral -secret boundary across generic RPC/IPC request handling needs its own slice. -There are no credential fields, defaults, discovery, account setup, telemetry -serialization or persisted source settings. Native callers retain the already -frozen explicit in-memory authenticated API. No real credentials or accounts -were used; all endpoints and fixtures are synthetic/disposable. - -No AGENTS.md or local `.agents/skills` exists in this checkout. CONTRIBUTING's -canonical Coding-Standards checkout is pinned at -`188beda1fa477d21d576c233dd8c7f4c4c267d23`. The complete route and snapshot -cover frontend/library, Rust API/async/security, TypeScript/async, IPC/interop, -accessibility, ownership, verification, documentation and commit requirements. -Raw routing evidence is retained alongside test logs. - -## Composition and public surface - -RPC adds optional `s3 = [pumas-library/s3, cap-std, same-file]`; default inference -feature selection is unchanged. The two production dependencies and test-only -native-tls already exist in Cargo.lock. Resolved name/version/source/checksum -identities remain exactly equal to the base. Notice regeneration independently -produces identical package records and notice bytes; only RPC Cargo-manifest and -lockfile input hashes change. Four dependency graphs establish that object_store -appears only with explicitly enabled RPC S3, with and without inference defaults. - -Three closed commands expose the existing native operation: - -- `start_s3_model_import`: canonical UUID, explicit HTTPS origin, region, bucket, - path/virtual-hosted addressing, exact key, immutable VersionId, ASCII GGUF - filename, expected SHA-256, family and official name. All facts are required; - credentials, extra fields, plaintext opt-outs and origin access material are - refused before I/O. No Debug/Serialize derives exist on request facts. -- `get_s3_model_import`: optional/null UUID, observing one process-local job or - its retained safe result. Reads neither start nor replay work. -- `cancel_s3_model_import`: exact UUID; `{accepted, outcome}` separates - cancellation admission from owned completion. Finalization refuses cancellation. - -The typed outcome distinguishes unavailable, idle, not found, rejected, running -and finished. Running is native phase plus decimal-string current-file bytes; -the count can reset and is not verification, percentage or registration proof. -Finished distinguishes registered model ID, cancelled/retained custody, and -redacted failure with retained custody and any preserved published model ID. -No-S3 builds expose the same wire with typed unavailable outcomes. - -One process-owned RPC worker awaits `PumasApi::import_s3_model`. The existing -acquisition consumer owns selection/transfer/verification and the existing model -importer owns classification, validation, registration and exact receipt -settlement. RPC supplies a held-identity directory reservation under -`launcher-data/.s3-import-`, outside discovery. Layouts containing that -root in the model library are refused before allocation. Creation and successful -cleanup run under the existing bounded blocking scope. Settled inputs are cleaned; -failed/cancelled inputs remain available for exact reconciliation. No second -transfer lifecycle, persistence schema, signer or publication protocol is added. - -Desktop-specific finite defaults are three acquisition attempts, 600 seconds -elapsed and 30 seconds per source operation. Existing native policies are -unchanged. Duplicate UUIDs, active jobs and retained failure/cancellation refuse -admission. Existing native Using custody blocks new desktop work. Results are -latest-only and process-local, not restart history: missing exact-ID observation -requires library inspection/reconciliation, never an automatic new UUID replay. -Server shutdown closes admission, requests cancellation and awaits this worker -before shared acquisition drainage. Dropped HTTP requests/dialogs stop only -observation. A poisoned observation lock still revokes admission on shutdown; -it does not reopen service or claim repaired state. - -Rust remains the canonical schema/export owner; generated frontend/Electron -types and decoders are produced by the existing generator. IPC validates exact -request shapes; bundled preload decodes both directions. Model Manager adds an -anonymous dialog with labelled required fields, explicit addressing choice, -honest observation/cancellation/result text and existing modal semantics. -One renderer observer polls serially at 500 ms only while running, fences -superseded responses, clears timers on close and can reopen retained results. -An ambiguous admission observes the same UUID without another start. Known -finished results clear an earlier unknown-acknowledgement warning. - -## Local supporting evidence - -Environment: managed Linux x86_64; Rust/Cargo 1.92.0, four Cargo jobs; Node -24.19.0 and project-pinned pnpm 10.33.0. Existing installed pnpm 11 attempted a -home-directory store and was unsuitable; the pinned tool uses a workspace store. -Installation honors the unchanged lockfile and ignores install scripts. -Dev/test Cargo debug info and incremental compilation are disabled to bound -task-generated disk use. Registry/configuration roots are disposable. - -| Check | Local result | Evidence | -| --- | --- | --- | -| RPC package, no inference defaults + S3 | 195 unit, 16 integration, 2 intent tests pass; 12 existing ignored/live cases | `rpc-tests-all-final.log` | -| Isolated production HTTPS/RPC child | Pass; single import, stalled HEAD/GET cancellation and HEAD shutdown | Same log, additional child execution | -| No-S3 command regressions | 3 pass, including typed unavailable and zero acquisitions | `rpc-headless-source-tests-final.log` | -| Headless RPC compile | Pass without S3 | `rpc-headless-check.log` | -| Full frontend suite | 856 tests / 130 files pass | `frontend-tests-all.log` | -| Final focused renderer regressions | 8 pass after the final finished-result warning correction | `frontend-source-tests-qualified.log` | -| Full Electron Node suite | 234 pass, 1 existing native sandbox smoke skipped | `electron-tests-all-final.log` | -| Frontend/Electron types, lint and builds | Pass; default/library-only Vite and bundled preload builds | `frontend-types-complete.log`, `frontend-lint-qualified.log`, `frontend-build-default.log`, `frontend-build.log`, `electron-types-3.log`, `electron-lint.log`, `electron-build.log` | -| Canonical contract generator/check | Fresh outputs; 8 generator tests pass | `contract-check.log`, `contract-generator-tests.log` | -| Clippy no-default + S3/export/test-support | Pass with the existing dead-code lint excepted; all other warnings denied | `rpc-clippy-existing-dead-code-exception.log` | -| Formatting, diff, feature/ref/frozen-file checks | Pass | `fmt-qualified.log`, `diff-final.log`, `feature-boundaries.json`, `frozen-state.json` | -| Attribution generation/check | Pass; identical notices/package entries | `attribution-generation.log`, `attribution-check-final.log` | - -The full frontend run precedes the small final warning correction; the final -hook/dialog suite and lint are rerun afterwards. The final no-S3 fixture compile -and pass are separately recorded. Earlier fixture compile errors, request/error -assertion corrections, initial stale attribution refusal and lint corrections -remain in the raw logs; the table identifies the passing results. - -The HTTPS source uses the existing synthetic localhost PKCS#12 fixture and PEM -trust anchor in an isolated child. Normal TLS verification stays enabled. Actual -RPC HEAD/GET requests preserve VersionId and remain unsigned even with synthetic -ambient AWS values. Ready metadata, public model lookup, exact output bytes, -matching demand/manifest/owner completion receipt and cold library lookup are -checked. Cancellation drains stalled connections and leaves no model; server -shutdown also drains an owned request. All owned files are scanned for synthetic -ambient credential values. No production HTTP/TLS policy is weakened. - -Renderer tests use DOM fixtures, not a browser proof. They cover required source -fields, anonymous-only content, exact facts/UUID, pre-admission refusal, duplicate -start suppression, cancellation acknowledgement, stale status fencing, no polling -after unmount, reopening without admission, ambiguous admission without replay, -correlated results, retained-work refusal and unavailable builds. Electron tests -exercise actual compiled preload and IPC decoders, including closed credentials -refusal, decimal counts and typed results. - -## Concrete limits and next planned feature - -Real UI execution is blocked in this environment: launching `/usr/bin/chromium` -with `chromium_sandbox=True` aborts because the installed SUID helper is not -properly configured (requires root ownership/mode 4755). The crashpad path also -reports missing configuration. No sandbox flags, permission change or security -bypass is used. `browser-capability.log` contains the exact failure. No browser -focus, keyboard, visibility, geometry or packaged Electron claim is made. - -Default inference Clippy cannot build because ort-sys's normal prebuilt artifact -download from cdn.pyke.io returns HTTP 403; `rpc-clippy-default.log` records it. -Strict headless Clippy without an exception is blocked by unmodified Torch DTO -dead-code and the existing integration diffusers fixture helper, recorded in -`rpc-clippy.log`, `rpc-clippy-export.log` and `rpc-clippy-bin-final.log`. These -are not corrected in the frozen/unrelated write sets. The passing run explicitly -uses `-D warnings -A dead_code`; it does not establish a fully strict/default -matrix. Headless compilation and behavioral tests remain useful local evidence. - -Core/app-manager, all reader/manifest/signing, discovery/watcher/importer, -reconciliation, staged VersionId repairs and hosted workflow bytes are unchanged -from the exact base. Frozen reader/native branches and main are preserved. -No old saved environment seed, real credentials, paid service, network/security -bypass, external reviewer contact or PR/merge action is used. Parent owns review, -hosted/default/platform/browser qualification, PRs/merges and Library delivery. - -The next existing-plan Q3 feature is authenticated direct-source RPC/desktop -configuration with a qualified ephemeral secret boundary. Live AWS, one non-AWS -compatible provider and local MinIO acceptance remain separately required, as -does Q4 packaged/independent/native qualification. Native publication/discovery -corrections remain on their independently coordinated branch. AC13/AC14 and -AQ-S3 remain pending. - -Raw evidence is under `/workspace/scratch/s3-desktop/`, including standards route, -command/log status inventory, hashes, branch/ref checks and commit/push records. -The subsequent documentation-only commit records this report; its exact final -head/tree and remote equality are saved in `final-state.json` after publication. diff --git a/docs/plans/artifact-acquisition/reports/s3-dispatch-import-qualification-2026-10-04.md b/docs/plans/artifact-acquisition/reports/s3-dispatch-import-qualification-2026-10-04.md deleted file mode 100644 index b47e981a5..000000000 --- a/docs/plans/artifact-acquisition/reports/s3-dispatch-import-qualification-2026-10-04.md +++ /dev/null @@ -1,129 +0,0 @@ -# S3 dispatch and single-GGUF import milestone - -Branch: `feat/acquisition-s3-import-2c7d6014`. Reader ancestor: -`2c7d6014658ef44575f3724f0ff6e7395f1fd7d8`. Accepted main ancestor: -`96c2dca97fad673a2735f9f778013067569fe692`, tree -`a0d7cae9bae5398064220115b6cec04588d020e2`. Their local composition is -`74ea1823aaf19448b0808c6b3433384418aceb6a`, tree -`a6a16b7afc13fc1753fbf5a636885f8067a57685`. Both source histories remain intact. -The accepted HF and speech-test files match main exactly. Reader/PR37 branches -remain unchanged. The coordinator owns PR creation, review, hosted CI and merge. - -Status: locally qualified; independent review and exact-head hosted acceptance -pending. All 28 focused tests, strict all-target Clippy, headless compile, -feature/attribution/ownership checks and 20 release/workflow contract tests -passed on the final source. AQ-S3 remains not ready. - -## Outcome and composition - -The optional `AcquisitionS3Request` binds one exact reader selection to a consumer -demand, held workspace and positive finite retry budgets. A closed internal -HTTP/S3 source dispatch feeds the existing service's transfer loop. Both sources -share checkpoint custody, registered descriptor writes, retry scheduling, -SHA-256 verification, file promotion, FilesReady/Using transitions, receipt -issuance, consumer publication and adoption. No second transfer store, task -owner, schema, retry loop, signer, URL parser or import-publication protocol was -introduced. The S3 library retains ownership of protocol parsing. - -The S3 adapter validates exact response version, ETag, total and range before -exposing a body to shared streaming. Continuation additionally requires the -existing owner's checked live prefix and the selected S3 version/validator. -SDK and HTTP automatic retries remain disabled. Source operation deadlines -include body polling, destination writes and progress; elapsed transfer limits -cap requests/backoff. Admission, durable observations, registered effect drain, -verification and consumer publication are not a hard wall-clock bound. A timed -out write waiter cannot authorize truncating its descriptor: registered effects -are joined before retry. Arbitrary external blocking work is not force-aborted. - -`ModelImporter::import_acquired_gguf` is a source-neutral, single-file consumer -bridge. Its spec path must match the selected logical path, and its payload must -match the currently issued receipt's serialized spec. A matching forged JSON -receipt is insufficient: the held use checks the actual canonical store row and -issued receipt before model effects. Callers keep the use in the prepare result -and invoke the importer from the publication callback after receipt issuance. - -The importer reads its verified descriptor without reopening an input pathname. -Its copied-input plan verifies the copied size/hash against the acquisition -receipt before invoking the existing model publication/confirmation path. A -refused copied import becomes an error, so a model collision cannot accidentally -adopt an unsuccessful request. The shared use and registered effect retain input -custody through the blocking model producer. Model readiness and indexing stay -with the existing model publisher. Failed publication retains Using and the -issued intent receipt; automatic reimport, deletion or output reconciliation is -not added. A receipt without a proven model output does not establish success. - -The source adapter owns protocol changes; the shared owner owns retry/checkpoint -changes; the importer owns model-policy/publication changes. Callers need the -existing workspace/demand/retry/prepare/publish contract and model spec, not SDK, -credential, range or filesystem-recovery internals. Removing S3 dispatch would -remove the new capability; removing the descriptor bridge would force unsafe -path recovery or duplicate copying/publication across callers. The real HTTP -and S3 implementations justify this bounded internal seam, not an open adapter -registry. Other formats and multi-file model packages remain explicitly absent. - -## Local evidence - -Linux x86_64, Rust/Cargo 1.92, existing shared target, offline locked dependency -resolution. Command-local root debug/incremental/strip overrides and one build -job were used to fit this environment; no toolchain, permissions, credentials or -network settings changed. Runtime tests used a task-owned XDG config directory. - -- `cargo test --locked --offline --manifest-path rust/Cargo.toml -p pumas-library - --no-default-features --features s3 --test s3_acquisition -- --test-threads=1`: - 12 deterministic local integration tests. They observe a synthetic GGUF through - the real indexed model importer and independent read-only selector as Ready, - exact bytes, verified receipt/adoption, and durable acquisition reopening. - Negative cases cover changed version, wrong digest, invalid logical input, - unsupported content, model collision, unissued receipt, bounded shared retry - counts, invalid/unrepresentable budgets, live checked-prefix pause/resume, - cancellation, elapsed unfinished-body expiry, and dropped-waiter drain. - A normal copied import also exercises the preserved directory-input path. -- All 11 reader protocol fixtures passed as reader regressions. -- All five public HTTP acquisition integration fixtures passed, observing existing shared - consumer behavior after dispatch/streaming changes. -- Strict all-target core Clippy passed with `--no-default-features --features - s3,test-support -- -D warnings`; the actual headless compile check passed with - no default features. -- Repository feature graphs cover 12 configurations across Linux/macOS ARM64/ - Windows x86_64. Six separate default/headless core graphs omit the SDK. These - are graph checks, not native builds. -- The unchanged canonical notice generator/checker and refreshed optional - inventory retain the exact license texts. `bytes` is now a direct core - dependency for its streamed-body boundary; its locked version and all existing - package identities are unchanged. No third-party package was added here. -- All 20 release/workflow contract tests and the dependency-ownership checker passed, covering - the enabled-S3 workflow projection and manifest ownership. - -Exact commands, output logs, cache-retirement hashes and source hashes accompany -the review handoff. The first parallel focused build failed to compile two -fixture API calls and exhausted disk while linking HTTP tests; it produced no -suite result. The corrected serial fixtures passed. Clippy initially rejected a -nonminimal boolean; the predicate was rewritten without changing its meaning. -All-target compilation also exposed unit fixtures that still constructed the -old directory-only copy source or consumed a concrete reqwest response. Their -constructors/body collectors were adapted while retaining byte and publication -oracles; the literal chunked-response fixture remains the no-Content-Length -input. Unit-suite execution is still not claimed by the compile check. -Only identified outputs from these completed/superseded tasks were retired; -unrelated caches and worktrees were preserved. No full-suite pass is claimed. - -## Hosted and unsupported scopes - -`.github/workflows/build.yml` now explicitly enables S3 for reader/dispatch -integration tests and strict all-target Clippy in the headless job after locked -fetch. Ordinary default/headless CI omits S3 and must not be called S3 -qualification. The added commands have local evidence; no hosted exact-head run -is claimed by this worker. Workflow source validation is not a hosted run. - -These fixtures use anonymous HTTP/1.1 loopback endpoints and a minimal synthetic -GGUF header, not real model weights or inference. No live AWS, non-AWS provider, -MinIO, authentication/refresh, TLS/public DNS/HTTP2-NACK fixture, desktop/RPC source -workflow, prefix listing, multi-file model import, other acquired formats, -directory/access-point bucket, resource benchmark, native cross-platform build, -default ONNX build or complete unit suite ran. Consumer publication interrupted -across process restart still requires owned output reconciliation; this slice -does not claim automatic S3 model recovery. - -The next slice is an explicit source-facing composition and exact model-output -reconciliation policy, followed by the separately authorized credential and -provider matrix. A reader/service-only milestone cannot close AQ-S3. diff --git a/docs/plans/artifact-acquisition/reports/s3-empty-members-qualification-2026-10-05.md b/docs/plans/artifact-acquisition/reports/s3-empty-members-qualification-2026-10-05.md deleted file mode 100644 index f24829914..000000000 --- a/docs/plans/artifact-acquisition/reports/s3-empty-members-qualification-2026-10-05.md +++ /dev/null @@ -1,111 +0,0 @@ -# Empty selected S3 member qualification — 2026-10-05 - -Tested implementation milestone: `c8eec4224cf9041d1b2e3400271790e34f619b2e`; tree `833db2d9ab5bd5a37b1aa5de641dbb4f04cf1dca`. -The subsequent documentation-only commit and final remote state are recorded in -`/workspace/scratch/s3-empty-members/final-state.json`. - -## Scope and frozen lineage - -Branch `feat/s3-empty-members-e8082649` starts exactly at frozen -`e8082649a6d4aaebf996c30870d996d43bbee1d3`, tree -`050733c55a3011f23c8832e210d52d0d4d60d695`. Its accepted PR40 normal merge -`d9d907cfe0e57b1e2bc7e296eff1327de835bc5e` remains an ancestor with ordered -parents `339032ff4acb53e43aa36c6edf96739101121620` and -`838eb2990905144a59830f1a16fe91b4e1105d4d`. No frozen ref, main, manifest, -watcher, importer, publication, signing, dependency or generated contract is -changed by this slice. Parent owns PRs, review and integration. - -Production acquisition changes only `S3ObjectSelection::open_acquisition`. -A selected immutable VersionId with checked HEAD size zero and resume zero -produces an empty stream rather than an invalid `0..0` range request. The -shared owner still truncates/creates its held partial descriptor, flushes, -hashes and verifies it, publishes the final member, verifies the complete -manifest and issues exact acquisition/consumer receipts. HEAD is existence, -identity and known-length evidence; it does not issue a verified-file receipt. -No GET or byte-range request is necessary for a known empty representation. - -Missing/invalid Content-Length cannot become zero: the pinned object_store -0.12.4 header parser requires and parses the header. Missing object/version, -wrong returned VersionId and missing validator remain selection failures. -An incorrect caller SHA-256 fails shared verification and retains custody. -The public `read_range` contract still requires a nonempty range. Unknown -length, a nonempty object, and an empty object remain distinct. Existing -single-file request DTOs, progress, retry/deadline, cancellation, publication -and recovery policies remain unchanged; there is no new public API or schema. -The dialog and RPC/shared contract remove the former empty-member limitation. - -## Direct behavior evidence - -- The single-member owner fixture starts with untrusted nonempty `.part` bytes: - valid empty selection replaces them and verifies the empty SHA, while a wrong - digest or cancellation makes no consumer handoff or final member. Only HEAD - occurs, and public empty-range reads still refuse without I/O. -- Mixed valid GGUF/empty auxiliary bundles use the same object key with different - exact VersionIds. The auxiliary receipt records zero bytes and the standard - empty SHA-256. Both live adoption and interrupted publication cold settlement - succeed without source/import replay; changed empty auxiliary output retains - the exact unresolved use and fails cold proof. -- The production HTTPS/RPC child covers fourteen scenarios: existing anonymous - and authenticated success with/without session token; held HEAD/GET cancel; - missing member; wrong nonempty digest; anonymous and authenticated empty - auxiliary success; wrong empty digest; empty primary; mixed empty auxiliary - plus truncated nonempty primary; cancellation after empty member completion; - and an all-empty invalid model bundle. Exact request pins and If-Match, - aggregate zero-byte/count observations, Ready/registered files, receipts, - retained failures, refused replay, and credential absence from captured logs, - safe outcomes and owned files are asserted. -- Empty required GGUF weights never become a working model. Existing parser - validation rejects them; their nested owner failure remains observable during - drained shutdown. Tests assert that aggregate shutdown failure rather than - suppress it. No model-format rule is changed. - -## Qualification - -Logs and hashes are in `/workspace/scratch/s3-empty-members/verification.json`. -The supported environment is Rust 1.92.0, four jobs, debug/incremental disabled, -Linux x86_64, isolated `XDG_CONFIG_HOME`; frontend uses pinned pnpm 10.33.0. -Standards route reuses the inspected snapshot at -`188beda1fa477d21d576c233dd8c7f4c4c267d23` and the established Rust/library, -security, async, contracts, diagnostics, verification and commit owners. -No AGENTS or repository `.agents/skills` files were found. - -| Check | Result | Log | -| --- | --- | --- | -| S3 acquisition/native/reader integration | 44 + 6 + 13 pass, plus isolated native signing child | `core-s3-qualified.log` | -| Full S3 RPC suite | 202 + 16 + 2 pass; twelve existing ignored/live cases | `rpc-tests.log` | -| Frontend existing dialog/hook | 14 pass | `frontend-source-tests.log` | -| Caption lint | Pass | `frontend-lint.log` | -| Acquisition unit regression | 171 pass plus isolated child | `core-acquisition.log` | -| Strict core and scoped RPC Clippy | Pass; RPC keeps inherited dead-code allowance | `core-clippy.log`, `rpc-clippy.log` | - -Commands from the repository root: `cargo test --manifest-path rust/Cargo.toml --p pumas-library --no-default-features --features s3 --test s3_acquisition ---test s3_model_workflow --test s3_reader`; `cargo test --manifest-path -rust/Cargo.toml -p pumas-rpc --no-default-features --features s3`; core Clippy -uses `--all-targets -- -D warnings`, RPC uses existing -`--features s3,export-contract,test-support --all-targets -- -D warnings --A dead_code`. Frontend: pinned pnpm `exec vitest run` on the existing dialog -and hook tests and targeted ESLint. Counts overlap and are not a unique total. - -Initial fixture compilation lacked an async ownership move; it was corrected. -The first RPC command incorrectly requested a library target. The added invalid -primary case exposed expected drained owner failure; the final fixture asserts -it. Failure logs are retained, and child panic excerpts were redacted before -saving. No credentials or raw child traces were persisted for diagnosis. - -## Separate correction and remaining gates - -The parent subsequently identified a pre-existing reserved-destination admission -gap at frozen e808. It is corrected separately on -`fix/s3-bundle-reserved-e8082649`, using the importer-owned namespace rule before -RPC job admission and native source resolution. These are separate successors; -this empty-member branch does not claim that correction is composed into it. -Parent coordinates review and eventual composition. - -Synthetic fixtures establish no real-provider or packaged/browser acceptance. -Existing default ONNX CDN failure and fully strict RPC dead-code baseline remain -outside these scoped checks. No account credentials, external reviewer contact, -paid service or security bypass was used. AQ-S3 and Q4 are not advanced. -The next existing-plan work is authorized Q3 cross-provider acceptance (AWS, -one non-AWS service and MinIO), followed by Q4 installed/native qualification; -credential expiry/refresh remains independently scoped. diff --git a/docs/plans/artifact-acquisition/reports/s3-installed-default-profile-2026-10-06.md b/docs/plans/artifact-acquisition/reports/s3-installed-default-profile-2026-10-06.md deleted file mode 100644 index b6c9a469a..000000000 --- a/docs/plans/artifact-acquisition/reports/s3-installed-default-profile-2026-10-06.md +++ /dev/null @@ -1,132 +0,0 @@ -# Installed default-plus-S3 qualification — frozen local milestone - -The actual Linux x86_64 production backend passes all ten owned installed HTTPS -scenarios and the default-profile health smoke. This supports bounded AC17/Q4 -backend evidence. AQ-S3, AQ-COMPLETE and full Q4 remain not ready. - -## Exact source and artifact identity - -- Branch: `feat/s3-installed-prefix-main95`, committed and nonforce pushed. -- Base: `0901f6591249ccf955c10f29666e6380e898d201`, tree - `422a71f51ab8403ac2f24ff1fc90b25d2a3b71e1`. -- Initial production source: `4f5a2a7415193873e81e3737e1a41cfe3b5c18f3`, tree - `12bf1bd1bb465dde4604a91f8dd3d8dd85ba0634`; build duration 19m25s. -- Final qualification source: `b0a66ba36773c2e4f73e5d1d982759d2f827eea0`, tree - `5250f10681e62e6f66c478f946b4e149ba10bebd`. -- Binary SHA-256: - `69df92ec6ece85cfc257e841cfd33f76d624e57a634fa7a319e8bd7a7e00ef57`. -- Final installed archive SHA-256: - `fdc13ae46eb6993368200dfeec30dbc65a5a9e32dc7cb2f9957c77ff99fd31bb`. - -Final source changes only the fixture oracle and its control/documentation after -the initial production build. The builder reran its fixed command against that -clean source (0.25s cached build), observed the same production artifacts and -emitted a new source-bound record. Subsequent qualification documentation changes -no Rust, harness or builder bytes. Complete build records, installed result and -external evidence hashes are committed in -[machine-readable evidence](s3-installed-default-profile-evidence-2026-10-06.json). - -## Admitted scope and public behavior - -The historical installed harness attributed arbitrary supplied binaries to -checkout HEAD, hardcoded a headless profile and selected default plus old reader -notices. The admitted successor changes only the existing harness, one provenance -helper and focused controls, the existing Linux release-contract test hook, and -owning qualification/plan/ledger documentation. Rust, dependencies, native owners, -ONNX behavior, S3 public APIs and acquisition policies are unchanged. - -The new `scripts/release/s3_build_provenance.py --output ` owns -the fixed locked/offline release command with defaults and explicit `s3`. It -requires clean committed source before/after, native Linux x86_64, unchanged -release settings and no active Cargo config or Rust/profile override. Actual -Cargo compiler-artifact events must report RPC features -`default,inference-plugins,s3`, core features -`gpu-monitor,hf-client,onnx-runtime,process-manager,s3`, release optimization and -no `test-support`. Target comes from the actual Rust host/build target, never an -opaque fingerprint hash. Existing 33-graph checks retain dynamic ONNX and -single-SDK contracts. No ONNX runtime is obtained. - -The installed harness now requires `--provenance ` and -`--source-head ` in addition to `--binary` and `--output`. -Before execution it rechecks source/tree, binary SHA, production profile, actual -feature observations and authoritative full S3 notice bindings. The allowlist -contains the unchanged binary, project license, full 415-entry S3 notice text, -attribution README/inventory and qualification JSON. Copied bytes must match the -build bindings; exact member sets and hashes are rechecked after extraction. -No model fixture, credentials or runtime state enter the archive. Records are -unsigned local evidence, without a claim of caller-authored JSON authenticity. - -## Actual execution and fixture repair - -The first actual run passed anonymous single/bundle cases, then the old fixture -HMAC oracle refused authenticated signing. It hashed query pairs in wire order. -SigV4 and the existing independently checked Rust fixture sort encoded pairs; -the current SDK can emit them in a different order. The narrow correction sorts -the fixture's already encoded pairs without relaxing method/path/query, signed -header, token, pin or wrong-secret checks. A fixed synthetic HMAC vector fails -on the old reversed-order URI and passes repaired; wrong secret, token and -VersionId still fail. An external diagnostic first passed all ten scenarios; -final qualification reran the committed correction with fresh provenance. -Original failure/archive, red control and diagnostics remain retained. - -Final installed results at b0a66ba3: - -| Scenario | Result | -| --- | --- | -| Anonymous single object and bundle | Both passed | -| Explicit access/secret without and with session token | Both passed | -| Wrong digest, missing object and unknown length | All retained failure custody; no publication | -| Truncated body | Passed existing bounded range resumption and failure behavior | -| Cancellation during held body | Passed source closure, retained custody and drained exit | -| Empty primary | Passed refusal and expected drain failure; no publication | - -All signatures are independently recomputed by the fixture, including a negative -wrong-secret oracle. Synthetic ambient credentials remain unselected. Successful -receipts retain exact demand, key/VersionId pins, verified digests and empty -auxiliary identity. Cold owners find indexed models without transfer replay or -receipt replacement. Invalid reserved paths perform no source I/O. The harness -scans RPC output, bounded backend diagnostics and all disposable-root files for -synthetic credentials. Every owned child/listener drains. A separate integrity -check also scans all retained evidence and uncompressed archive members. - -Default-profile `/health` smoke passes with `inference_disabled=false`. This -confirms backend startup/routes/drain; no inference executes and no runtime or -real model asset is obtained. - -## Checks and preserved evidence - -All 16 provenance/oracle controls pass. Pinned Ruff0.15.2 lint and format pass for -the entire existing CI Python scope (`torch-server scripts/release`, 56 files). -Workflow YAML parses and the controls are wired into its existing Linux contract -gate. S3 attribution validates 415 entries; the builder runs the existing 33 -default/headless/S3 feature graphs. `git diff --check` passes and the Q4 comparison -has no Rust changes. An extra whole-repository lint invocation found an unchanged -unused `sys` import in `scripts/acceptance/flux2_v214_rpc_acceptance.py`, outside -the CI scope and admitted write set; its failure log is preserved. - -External evidence root: `/workspace/scratch/s3-installed-default-profile/`. -Primary files: `production-build-query-fixed.json`, its `.cargo.jsonl` and -`.cargo.stderr.log`, `installed-final.log`, `installed-final/installed-result.json`, -`installed-final/pumas-s3-qualification-linux.tar.gz`, -`default-profile-smoke.log`, `query-oracle-red.log`, `query-oracle-green.log` -and `query-oracle-ruff-ci-{lint,format}.log`. Initial build/failure and diagnostic -artifacts remain alongside final evidence. The checked-in JSON records hashes. - -## Remaining gates and next existing-plan slice - -Actual AWS/non-AWS/MinIO acceptance, supported desktop/browser, Windows/macOS, -native/runtime/model workflows, independent clients and old-writer deployment -facts remain unqualified. Provider fixtures/authorization and supported hosts -are not supplied. No real account credential is obtained, sent or provisioned; -no network/security bypass or paid service is used. Parent owns PR publication, -external review, hosted CI and integration; none is performed here. - -The next feasible existing AC05/AC17 slice is one installed Linux S3 process-loss -boundary before `FilesReady`: hold a synthetic authenticated HTTPS transfer after -one byte, observe exact durable selection and partial custody, SIGKILL/reap the -owned backend, then reopen without source replay or model/receipt publication. -Cold task observations are ephemeral; the oracle must inspect canonical custody, -not infer completion from a lost task status or saved counter. Read-only design -is `/workspace/scratch/s3-installed-process-loss-design/DESIGN.md`; execution and -a separate admitted write set remain future work. This would not establish -power-loss durability, actual-provider acceptance or full Q4. diff --git a/docs/plans/artifact-acquisition/reports/s3-installed-default-profile-evidence-2026-10-06.json b/docs/plans/artifact-acquisition/reports/s3-installed-default-profile-evidence-2026-10-06.json deleted file mode 100644 index c8cbbd752..000000000 --- a/docs/plans/artifact-acquisition/reports/s3-installed-default-profile-evidence-2026-10-06.json +++ /dev/null @@ -1,510 +0,0 @@ -{ - "schema_version": 1, - "purpose": "unsigned local installed default-plus-S3 qualification; controlled TLS only", - "branch": "feat/s3-installed-prefix-main95", - "base": { - "head": "0901f6591249ccf955c10f29666e6380e898d201", - "tree": "422a71f51ab8403ac2f24ff1fc90b25d2a3b71e1" - }, - "original_production_build": { - "schema_version": 1, - "purpose": "unsigned local installed S3 qualification; no provider or inference acceptance", - "source": { - "head": "4f5a2a7415193873e81e3737e1a41cfe3b5c18f3", - "tree": "12bf1bd1bb465dde4604a91f8dd3d8dd85ba0634" - }, - "build": { - "command": [ - "cargo", - "build", - "--locked", - "--offline", - "--manifest-path", - "rust/Cargo.toml", - "--release", - "-p", - "pumas-rpc", - "--features", - "s3", - "--message-format=json-render-diagnostics" - ], - "target": "x86_64-unknown-linux-gnu", - "host": "x86_64-unknown-linux-gnu", - "rustc": "rustc 1.92.0 (ded5c06cf 2025-12-08)\nbinary: rustc\ncommit-hash: ded5c06cf21d2b93bffd5d884aa6e96934ee4234\ncommit-date: 2025-12-08\nhost: x86_64-unknown-linux-gnu\nrelease: 1.92.0\nLLVM version: 21.1.3", - "cargo": "cargo 1.92.0 (344c4567c 2025-10-21)", - "profile": "release", - "checked_in_release_settings": { - "lto": true, - "codegen-units": 1, - "strip": "debuginfo" - }, - "default_features": true, - "features": [ - "s3" - ] - }, - "binary_sha256": "69df92ec6ece85cfc257e841cfd33f76d624e57a634fa7a319e8bd7a7e00ef57", - "artifacts": { - "core": { - "features": [ - "gpu-monitor", - "hf-client", - "onnx-runtime", - "process-manager", - "s3" - ], - "profile": { - "opt_level": "3", - "debuginfo": 0, - "debug_assertions": false, - "overflow_checks": false, - "test": false - }, - "package_id": "path+file:///workspace/Pumas-Library-s3-installed-prefix-main95/rust/crates/pumas-core#pumas-library@0.7.0" - }, - "rpc": { - "features": [ - "default", - "inference-plugins", - "s3" - ], - "profile": { - "opt_level": "3", - "debuginfo": 0, - "debug_assertions": false, - "overflow_checks": false, - "test": false - }, - "package_id": "path+file:///workspace/Pumas-Library-s3-installed-prefix-main95/rust/crates/pumas-rpc#0.7.0", - "executable": "/workspace/Pumas-Library/rust/target/release/pumas-rpc" - } - }, - "fingerprints": { - "rpc": { - "json_sha256": "8cbd578accd47806ca30850902288cfeac6f8a9e8778e2e5ce60eb7ff42142d3", - "features": [ - "default", - "inference-plugins", - "s3" - ], - "rustflags": [], - "opaque_profile_fingerprint": 8055818090833361886 - }, - "core": { - "json_sha256": "e30236ed53e81f11af499b7f02bc4ccd520ee190ffc5f516499dd855fb3e46a3", - "features": [ - "gpu-monitor", - "hf-client", - "onnx-runtime", - "process-manager", - "s3" - ], - "rustflags": [], - "opaque_profile_fingerprint": 5060731410821673174 - } - }, - "attribution": { - "directory": "docs/release-attribution/0.7.0-s3", - "sha256": { - "README.md": "663a2d352f455938a5c14d950e26e2ffe4e2e76a68fcbfede2df70c2b5d91f77", - "inventory.json": "0b3cad4cfd7a6509422c34a32da255529b447e2febcb137e226ac59c6ad9c03b", - "THIRD-PARTY-NOTICES.txt": "90d6b8226b5cee95faa44b15a11e51e923b87d4442797715725f8c07231d5612" - } - }, - "evidence_sha256": { - "cargo_jsonl": "4933e724f8b6fb2b75d4544d320e8a449149044ab3b92708ff8db9943084af48", - "cargo_stderr": "a6853762a2dac327eaeb9c58f1336fec8d1e214f2a716c510cdfbfd207e80e8f" - } - }, - "installed_qualification": { - "source_head": "b0a66ba36773c2e4f73e5d1d982759d2f827eea0", - "source_tree": "5250f10681e62e6f66c478f946b4e149ba10bebd", - "binary_sha256": "69df92ec6ece85cfc257e841cfd33f76d624e57a634fa7a319e8bd7a7e00ef57", - "build_provenance": { - "schema_version": 1, - "purpose": "unsigned local installed S3 qualification; no provider or inference acceptance", - "source": { - "head": "b0a66ba36773c2e4f73e5d1d982759d2f827eea0", - "tree": "5250f10681e62e6f66c478f946b4e149ba10bebd" - }, - "build": { - "command": [ - "cargo", - "build", - "--locked", - "--offline", - "--manifest-path", - "rust/Cargo.toml", - "--release", - "-p", - "pumas-rpc", - "--features", - "s3", - "--message-format=json-render-diagnostics" - ], - "target": "x86_64-unknown-linux-gnu", - "host": "x86_64-unknown-linux-gnu", - "rustc": "rustc 1.92.0 (ded5c06cf 2025-12-08)\nbinary: rustc\ncommit-hash: ded5c06cf21d2b93bffd5d884aa6e96934ee4234\ncommit-date: 2025-12-08\nhost: x86_64-unknown-linux-gnu\nrelease: 1.92.0\nLLVM version: 21.1.3", - "cargo": "cargo 1.92.0 (344c4567c 2025-10-21)", - "profile": "release", - "checked_in_release_settings": { - "lto": true, - "codegen-units": 1, - "strip": "debuginfo" - }, - "default_features": true, - "features": [ - "s3" - ] - }, - "binary_sha256": "69df92ec6ece85cfc257e841cfd33f76d624e57a634fa7a319e8bd7a7e00ef57", - "artifacts": { - "core": { - "features": [ - "gpu-monitor", - "hf-client", - "onnx-runtime", - "process-manager", - "s3" - ], - "profile": { - "opt_level": "3", - "debuginfo": 0, - "debug_assertions": false, - "overflow_checks": false, - "test": false - }, - "package_id": "path+file:///workspace/Pumas-Library-s3-installed-prefix-main95/rust/crates/pumas-core#pumas-library@0.7.0" - }, - "rpc": { - "features": [ - "default", - "inference-plugins", - "s3" - ], - "profile": { - "opt_level": "3", - "debuginfo": 0, - "debug_assertions": false, - "overflow_checks": false, - "test": false - }, - "package_id": "path+file:///workspace/Pumas-Library-s3-installed-prefix-main95/rust/crates/pumas-rpc#0.7.0", - "executable": "/workspace/Pumas-Library/rust/target/release/pumas-rpc" - } - }, - "fingerprints": { - "rpc": { - "json_sha256": "8cbd578accd47806ca30850902288cfeac6f8a9e8778e2e5ce60eb7ff42142d3", - "features": [ - "default", - "inference-plugins", - "s3" - ], - "rustflags": [], - "opaque_profile_fingerprint": 8055818090833361886 - }, - "core": { - "json_sha256": "e30236ed53e81f11af499b7f02bc4ccd520ee190ffc5f516499dd855fb3e46a3", - "features": [ - "gpu-monitor", - "hf-client", - "onnx-runtime", - "process-manager", - "s3" - ], - "rustflags": [], - "opaque_profile_fingerprint": 5060731410821673174 - } - }, - "attribution": { - "directory": "docs/release-attribution/0.7.0-s3", - "sha256": { - "README.md": "663a2d352f455938a5c14d950e26e2ffe4e2e76a68fcbfede2df70c2b5d91f77", - "inventory.json": "0b3cad4cfd7a6509422c34a32da255529b447e2febcb137e226ac59c6ad9c03b", - "THIRD-PARTY-NOTICES.txt": "90d6b8226b5cee95faa44b15a11e51e923b87d4442797715725f8c07231d5612" - } - }, - "evidence_sha256": { - "cargo_jsonl": "b92a978de4c49c21ab28c4983442b404f1d3ff8e4da3ce2cb32ae31760f00ce3", - "cargo_stderr": "f18e8aa44b81e7d9d1663536017be739eb80ede7041400fe06bf4e1c755d3d59" - } - }, - "provider": "controlled TLS protocol fixture; not an actual S3-compatible service", - "target": "Linux x86_64", - "production_profile": "release with defaults and explicit s3; no test-support; no inference claim", - "packaged_files": { - "pumas-rpc": "69df92ec6ece85cfc257e841cfd33f76d624e57a634fa7a319e8bd7a7e00ef57", - "LICENSE.txt": "cd39fd1216a0187a1c36350649249f3f98391c5c65426ec41c6c8043e1039281", - "THIRD-PARTY-NOTICES.txt": "90d6b8226b5cee95faa44b15a11e51e923b87d4442797715725f8c07231d5612", - "ATTRIBUTION-README.md": "663a2d352f455938a5c14d950e26e2ffe4e2e76a68fcbfede2df70c2b5d91f77", - "ATTRIBUTION-inventory.json": "0b3cad4cfd7a6509422c34a32da255529b447e2febcb137e226ac59c6ad9c03b" - }, - "scenarios": [ - { - "mode": "success", - "authenticated": false, - "session_token": false, - "single": true, - "requests": [ - { - "method": "HEAD", - "version": "weights-v1" - }, - { - "method": "GET", - "version": "weights-v1", - "range_start": 0 - } - ], - "drained_exit": 0, - "result": "passed" - }, - { - "mode": "success", - "authenticated": false, - "session_token": false, - "single": false, - "requests": [ - { - "method": "HEAD", - "version": "data-v2" - }, - { - "method": "HEAD", - "version": "weights-v1" - }, - { - "method": "GET", - "version": "weights-v1", - "range_start": 0 - } - ], - "drained_exit": 0, - "result": "passed" - }, - { - "mode": "success", - "authenticated": true, - "session_token": false, - "single": false, - "requests": [ - { - "method": "HEAD", - "version": "data-v2" - }, - { - "method": "HEAD", - "version": "weights-v1" - }, - { - "method": "GET", - "version": "weights-v1", - "range_start": 0 - } - ], - "drained_exit": 0, - "result": "passed" - }, - { - "mode": "success", - "authenticated": true, - "session_token": true, - "single": false, - "requests": [ - { - "method": "HEAD", - "version": "data-v2" - }, - { - "method": "HEAD", - "version": "weights-v1" - }, - { - "method": "GET", - "version": "weights-v1", - "range_start": 0 - } - ], - "drained_exit": 0, - "result": "passed" - }, - { - "mode": "digest", - "authenticated": true, - "session_token": true, - "single": false, - "requests": [ - { - "method": "HEAD", - "version": "data-v2" - }, - { - "method": "HEAD", - "version": "weights-v1" - } - ], - "drained_exit": 0, - "result": "passed" - }, - { - "mode": "missing", - "authenticated": true, - "session_token": true, - "single": false, - "requests": [ - { - "method": "HEAD", - "version": "data-v2" - }, - { - "method": "HEAD", - "version": "weights-v1" - } - ], - "drained_exit": 0, - "result": "passed" - }, - { - "mode": "unknown", - "authenticated": true, - "session_token": true, - "single": false, - "requests": [ - { - "method": "HEAD", - "version": "data-v2" - }, - { - "method": "HEAD", - "version": "weights-v1" - } - ], - "drained_exit": 0, - "result": "passed" - }, - { - "mode": "truncated", - "authenticated": true, - "session_token": true, - "single": false, - "requests": [ - { - "method": "HEAD", - "version": "data-v2" - }, - { - "method": "HEAD", - "version": "weights-v1" - }, - { - "method": "GET", - "version": "weights-v1", - "range_start": 0 - }, - { - "method": "GET", - "version": "weights-v1", - "range_start": 1 - }, - { - "method": "GET", - "version": "weights-v1", - "range_start": 2 - } - ], - "drained_exit": 0, - "result": "passed" - }, - { - "mode": "cancel", - "authenticated": true, - "session_token": true, - "single": false, - "requests": [ - { - "method": "HEAD", - "version": "data-v2" - }, - { - "method": "HEAD", - "version": "weights-v1" - }, - { - "method": "GET", - "version": "weights-v1", - "range_start": 0 - } - ], - "drained_exit": 0, - "result": "passed" - }, - { - "mode": "empty-primary", - "authenticated": true, - "session_token": true, - "single": false, - "requests": [ - { - "method": "HEAD", - "version": "data-v2" - }, - { - "method": "HEAD", - "version": "weights-v1" - } - ], - "drained_exit": 1, - "result": "passed" - } - ], - "archive_sha256": "fdc13ae46eb6993368200dfeec30dbc65a5a9e32dc7cb2f9957c77ff99fd31bb", - "result": "passed" - }, - "default_profile_health_smoke": { - "health": "passed", - "inference_disabled": false - }, - "controls": { - "tests": 16, - "pinned_ruff": "0.15.2", - "ruff_scope": [ - "torch-server", - "scripts/release" - ] - }, - "external_evidence": { - "/workspace/scratch/s3-installed-default-profile/default-profile-smoke.log": "72614c22cb579d0023da99c4589cb6d94ed7af1188197206532dd980adf912c2", - "/workspace/scratch/s3-installed-default-profile/installed-diagnostic/pumas-s3-qualification-linux.tar.gz": "0ab01fd7f4e81ea73e526fa037c4a4153b8a19acc82b17b26525a082ad1e7eee", - "/workspace/scratch/s3-installed-default-profile/installed-diagnostic.log": "9ffda14a2674b3047d83542b00e79c28de21fd086631b8ff5b9cfd7c772384c5", - "/workspace/scratch/s3-installed-default-profile/installed-final/installed-result.json": "e24f6afb501615560d1c307d9771d9ed781f7ca5765d979622482aff28331bf5", - "/workspace/scratch/s3-installed-default-profile/installed-final/pumas-s3-qualification-linux.tar.gz": "fdc13ae46eb6993368200dfeec30dbc65a5a9e32dc7cb2f9957c77ff99fd31bb", - "/workspace/scratch/s3-installed-default-profile/installed-final.log": "00097e61353c8ee6bbac5782a161ae7004c3adb5aeb77ea7c02c5d584f99bed1", - "/workspace/scratch/s3-installed-default-profile/installed-qualification.log": "2cb41abc45c4f4ce0305a034647b2975d61cb1bfcfeaca398456ba9b2158bb65", - "/workspace/scratch/s3-installed-default-profile/installed-qualified/pumas-s3-qualification-linux.tar.gz": "0f8505031d39c26f0f768c435be260de9b5057a5aee0c60bcd3a90b9558d9aba", - "/workspace/scratch/s3-installed-default-profile/installed-query-diagnostic/installed-result.json": "b6cbf4e0f91feb2b07ab8387d759429eebbdf7e13a3ab95bd0caccc8f8ed8333", - "/workspace/scratch/s3-installed-default-profile/installed-query-diagnostic/pumas-s3-qualification-linux.tar.gz": "9bfb52d19ce8ae0395d6702175703f78565be0b58ad6fbe0d63c9ca7cc2d1186", - "/workspace/scratch/s3-installed-default-profile/installed-query-diagnostic.log": "f5c2c072beaa2755d863ccbb7b49642022b54d81b8142f8cb662b56acd5a6623", - "/workspace/scratch/s3-installed-default-profile/production-build-query-fixed.cargo.jsonl": "b92a978de4c49c21ab28c4983442b404f1d3ff8e4da3ce2cb32ae31760f00ce3", - "/workspace/scratch/s3-installed-default-profile/production-build-query-fixed.cargo.stderr.log": "f18e8aa44b81e7d9d1663536017be739eb80ede7041400fe06bf4e1c755d3d59", - "/workspace/scratch/s3-installed-default-profile/production-build-query-fixed.json": "9a62b168dce17536279156363e729a4097c5d4c943d252d18a6501be2edc4c7c", - "/workspace/scratch/s3-installed-default-profile/production-build-query-fixed.log": "6d3c940765893e3725c8bfb6704d7c53e6a66e7e336017abce8bbef1b1f1b067", - "/workspace/scratch/s3-installed-default-profile/production-build.cargo.jsonl": "4933e724f8b6fb2b75d4544d320e8a449149044ab3b92708ff8db9943084af48", - "/workspace/scratch/s3-installed-default-profile/production-build.cargo.stderr.log": "a6853762a2dac327eaeb9c58f1336fec8d1e214f2a716c510cdfbfd207e80e8f", - "/workspace/scratch/s3-installed-default-profile/production-build.json": "d071df18ee1b0e670e2678ecc21d7c63c1b17d88ea775b34f5221e7a74a5494e", - "/workspace/scratch/s3-installed-default-profile/query-oracle-format.log": "10869b88a75066aa23546ef1f95fcd4678c3fb92a56ed46ef91688052b67976a", - "/workspace/scratch/s3-installed-default-profile/query-oracle-green.log": "089ea9a28239a84c451fa250cbece3bb9748f343028e4c7ad63a9fd83a0a72d4", - "/workspace/scratch/s3-installed-default-profile/query-oracle-red.log": "129793a2949f08523a2ebf2871a893aa1dbcae28cfd3d1a65c221399de1ece29", - "/workspace/scratch/s3-installed-default-profile/query-oracle-ruff-ci-format.log": "b642d2f0cc49caff9e609808fb9c82854fc174b2f54b459a0d09dbe4c0f837ab", - "/workspace/scratch/s3-installed-default-profile/query-oracle-ruff-ci-lint.log": "82b3e6a6c090a57601d22943bd23fca9218d1031dbe5a7b754092f9a156b4f18", - "/workspace/scratch/s3-installed-default-profile/query-oracle-ruff-lint.log": "1811ee43bbd5312fc9928499677d3ff32192110d66e1cea167bae12a8345cb87", - "/workspace/scratch/s3-installed-default-profile/evidence-integrity.log": "8d4f4154fa490d2a76da0cac499bd8d5d7207b4076df66c814ebfe99949c5fe2" - }, - "scope_limits": [ - "no actual AWS/non-AWS/MinIO acceptance", - "no inference/native runtime obtained or executed", - "no desktop/UI/cross-platform/deployment/hosted CI acceptance", - "no release publication or external reviewer contact" - ], - "next_existing_plan_slice": "AC05/AC17 installed S3 pre-FilesReady process-loss and cold-custody fixture" -} diff --git a/docs/plans/artifact-acquisition/reports/s3-installed-process-loss-2026-10-06.md b/docs/plans/artifact-acquisition/reports/s3-installed-process-loss-2026-10-06.md deleted file mode 100644 index 4f64c66bf..000000000 --- a/docs/plans/artifact-acquisition/reports/s3-installed-process-loss-2026-10-06.md +++ /dev/null @@ -1,124 +0,0 @@ -# Installed S3 pre-FilesReady process-loss qualification — frozen milestone - -The original ten installed scenarios and exactly one process-loss case pass -on Linux x86_64 at source `81aea4c0d97aae2a27d1a0c0eebdd784e90f705d`, tree -`65cea0342055e4b76de0f0476a3a480fcce9cfdc`. The actual production binary hash -is unchanged. This adds one bounded AC05/AC17 observation, not gate acceptance. - -Parent explicitly admitted one bounded installed Linux acceptance milestone on -2026-10-06. Separate branch `feat/s3-installed-process-loss-ed31639` starts at -frozen `ed31639c2b0d096e5a8bb33ec0eca327f842fb9b`, tree -`16f1b5b8d0eecf54dda84b149bdae02baa343606`. The original branch/ref, installed -archive, records and failures remain preserved for parent publication. - -Exact admitted paths: `scripts/release/qualify-s3-installed.py`, -`scripts/release/test_s3_build_provenance.py`, this report and its matching JSON -evidence, `docs/plans/artifact-acquisition/{plan.md,execution-ledger.md}` and -`docs/plans/artifact-acquisition/reports/write-sets.md`. No Rust, production -store/schema, watcher/importer/manifest, SDK/retry/verification/credential, -ONNX, dependency, workflow or network-setting edit is admitted. - -Reuse the qualified default-plus-S3 production binary SHA-256 -`69df92ec6ece85cfc257e841cfd33f76d624e57a634fa7a319e8bd7a7e00ef57` and existing -build/notice/package verifier. Add exactly one authenticated token single-object -HTTPS fixture: hold GET after one byte; require actual written partial plus -running progress and exact schema-7 `transferring` custody without verified files -or receipts; SIGKILL/reap; reopen twice with no source replay, publication or -custody change. One same-demand cold submission must fail with retained work -before source I/O; a subsequent same-process submission is rejected. Cold task -getters are ephemeral and cannot substitute for durable evidence. - -Focused mocked controls cover kill/reap/join, boundary refusal, changed custody, -source replay/model/receipt refusal and secret scanning. Run the existing -16 controls plus additions, pinned CI Ruff, clean-source provenance builder, -the existing ten installed scenarios plus this single boundary, and integrity -checks. Existing release settings and exact binary hash must stay unchanged. -Failure evidence is retained and each child/listener has bounded drainage. - -Scope: one Linux process-loss boundary before FilesReady, not power loss, -resumable transfer or a fault campaign. Provider credentials/services, -desktop/platform/inference, hosted acceptance and full AQ-S3/Q4 remain separate. -Parent owns PR publication/reviews/merges. The harness is implemented; all 24 -controls (16 existing plus eight boundary/custody/process controls), pinned CI -Ruff lint/format and diff checks pass. Read-only source review found no -substantive issue. Actual clean-source installed execution passes 11/11 with -the fixed locked/offline builder and original release settings. Only Python -harness/tests and owning documentation differ from ed31639; no Rust changes. - -## Actual boundary and cold observations - -Demand `ff190dc6-0ac2-4abd-8218-30563139c722` retained acquisition -`387da144-007f-4ea7-8cfd-6d2871487b0c` in `transferring`, with no verified files -or consumer receipt. Public progress reported live `acquiring` and one byte. -The actual ordinary partial was one byte, device/inode `27/1706911`, SHA-256 -`333e0a1e27815d0ceee55c473fe3dc93d56c63e3bee2b3b4aee8eed6d70191a3`. -Selected identity remained `models/shared`, `weights-v1`, `weights.gguf`, -size 24, caller SHA-256 -`a4e5e156ddec27e286f75328784d7106b60a4eb1d246e950a001a3f944fbda99`. - -The backend was killed as its owned process group and reaped with status `-9`; -its bounded output reader joined, and the held source connection closed. The -canonical store hash before kill and after both cold owners remained -`02000d511a853f7b9aab2d98eb26f1b3f4d80465f810784a77bf8f7a35ce7e34`. -The entire acquisition/manifest/workspace row, physical workspace/partial, -partial size/hash, sentinel and empty logical model rows matched exactly. -SQLite was opened read-only without `immutable=1`, including WAL visibility; -no byte-identical SQLite-file claim is made. - -Both cold owners returned exact `not_found` for the former operation and `idle` -without an ID. Both exposed an empty successful public model map and drained -gracefully with status 0. The second owner's same-demand submission first ran, -then returned `failed`, `retained_work=true`, `published_model_id=null`, with -the non-sensitive invalid-request error `-32005`; its next same-process -submission was rejected. Custody still matched after drainage. The source -observed exactly one HEAD and one GET, both pinned to weights-v1, and no request -after the kill. No completed input, model output/index row or publication receipt -was created. The measured cold windows are bounded, not an indefinite promise. - -No production timeout/retry/identity/verification or recovery policy changed. -The prefix is process-loss evidence only; it was not synced to assert power-loss -durability. The test neither resumes transfer nor manufactures a persisted task -result. The disposable root stays retained under the external qualification -output, including on failure; safe failure metadata and bounded child/listener -cleanup preserve the original failure. Backend logs/requests with credentials -are never persisted. RPC outputs, captured logs, all root files, committed -evidence and uncompressed archive members pass synthetic-secret checks. - -## Artifact, API and evidence - -The new archive hash is -`65672d5d9a763b6f93a16da8404d80ed858fd22fe4d19764a2e64e0dcb799482`. -It contains the same binary/license/full 415-entry S3 attribution profile and a -new source-bound qualification record, with exact member/hash checks through -extraction. The old frozen archive remains unchanged. No new CLI flag or Rust -API is introduced: the existing installed harness now includes the one process- -loss case in its normal qualification sequence and retains its disposable root. - -External evidence is `/workspace/scratch/s3-installed-process-loss/`: actual -`production-build.json`, Cargo `.jsonl`/`.stderr.log`, `installed.log`, -`installed/installed-result.json`, `installed/process-loss-result.json`, the -archive, retained `installed/process-loss-root`, 24-control and pinned Ruff logs. -An independent offline snapshot recomputation after all children exited exactly -matches the recorded custody. Full results and external hashes are committed in -[machine-readable evidence](s3-installed-process-loss-evidence-2026-10-06.json). -This is unsigned local evidence. Subsequent docs-only commits do not change the -qualified harness or production binary. - -## Next documented feature and blocked gates - -The next documented implementation feature is **Q2: exact approved wheel-file- -set acquisition and local-only consumption in the existing Torch installer** -(plan AD7 and milestone table). It requires accepted AQ-HTTP, whose authoritative -[gate record](dependency-gates.md) still says not ready. Do not open Q2 or Runtime -R1 from this local S3 fixture result. - -No further unblocked S3 feature is named. The next S3 work is actual-provider -Q3/AQ-S3 acceptance, followed by full Q4. It needs authorized version-enabled -AWS and named non-AWS fixtures with exact pins/digests/approved model set and -owner-supplied scoped access, plus approved MinIO inputs or a preinstalled -versioned TLS service. None are supplied, and this task forbids obtaining or -provisioning real credentials. The prior ordinary MinIO installation denial is -not bypassed. Desktop and Windows/macOS acceptance need supported hosts/packages; -deployment needs independent-client, retained-root, old-writer and rollback facts. -Hosted/review/publication remain parent-owned. This milestone is closed without -expanding into additional fault cases, native changes or inference downloads. diff --git a/docs/plans/artifact-acquisition/reports/s3-installed-process-loss-evidence-2026-10-06.json b/docs/plans/artifact-acquisition/reports/s3-installed-process-loss-evidence-2026-10-06.json deleted file mode 100644 index cd859d4af..000000000 --- a/docs/plans/artifact-acquisition/reports/s3-installed-process-loss-evidence-2026-10-06.json +++ /dev/null @@ -1,523 +0,0 @@ -{ - "schema_version": 1, - "purpose": "one installed Linux pre-FilesReady process-loss boundary; controlled HTTPS only", - "branch": "feat/s3-installed-process-loss-ed31639", - "base": { - "head": "ed31639c2b0d096e5a8bb33ec0eca327f842fb9b", - "tree": "16f1b5b8d0eecf54dda84b149bdae02baa343606" - }, - "installed_qualification": { - "source_head": "81aea4c0d97aae2a27d1a0c0eebdd784e90f705d", - "source_tree": "65cea0342055e4b76de0f0476a3a480fcce9cfdc", - "binary_sha256": "69df92ec6ece85cfc257e841cfd33f76d624e57a634fa7a319e8bd7a7e00ef57", - "build_provenance": { - "schema_version": 1, - "purpose": "unsigned local installed S3 qualification; no provider or inference acceptance", - "source": { - "head": "81aea4c0d97aae2a27d1a0c0eebdd784e90f705d", - "tree": "65cea0342055e4b76de0f0476a3a480fcce9cfdc" - }, - "build": { - "command": [ - "cargo", - "build", - "--locked", - "--offline", - "--manifest-path", - "rust/Cargo.toml", - "--release", - "-p", - "pumas-rpc", - "--features", - "s3", - "--message-format=json-render-diagnostics" - ], - "target": "x86_64-unknown-linux-gnu", - "host": "x86_64-unknown-linux-gnu", - "rustc": "rustc 1.92.0 (ded5c06cf 2025-12-08)\nbinary: rustc\ncommit-hash: ded5c06cf21d2b93bffd5d884aa6e96934ee4234\ncommit-date: 2025-12-08\nhost: x86_64-unknown-linux-gnu\nrelease: 1.92.0\nLLVM version: 21.1.3", - "cargo": "cargo 1.92.0 (344c4567c 2025-10-21)", - "profile": "release", - "checked_in_release_settings": { - "lto": true, - "codegen-units": 1, - "strip": "debuginfo" - }, - "default_features": true, - "features": [ - "s3" - ] - }, - "binary_sha256": "69df92ec6ece85cfc257e841cfd33f76d624e57a634fa7a319e8bd7a7e00ef57", - "artifacts": { - "core": { - "features": [ - "gpu-monitor", - "hf-client", - "onnx-runtime", - "process-manager", - "s3" - ], - "profile": { - "opt_level": "3", - "debuginfo": 0, - "debug_assertions": false, - "overflow_checks": false, - "test": false - }, - "package_id": "path+file:///workspace/Pumas-Library-s3-installed-prefix-main95/rust/crates/pumas-core#pumas-library@0.7.0" - }, - "rpc": { - "features": [ - "default", - "inference-plugins", - "s3" - ], - "profile": { - "opt_level": "3", - "debuginfo": 0, - "debug_assertions": false, - "overflow_checks": false, - "test": false - }, - "package_id": "path+file:///workspace/Pumas-Library-s3-installed-prefix-main95/rust/crates/pumas-rpc#0.7.0", - "executable": "/workspace/Pumas-Library/rust/target/release/pumas-rpc" - } - }, - "fingerprints": { - "rpc": { - "json_sha256": "8cbd578accd47806ca30850902288cfeac6f8a9e8778e2e5ce60eb7ff42142d3", - "features": [ - "default", - "inference-plugins", - "s3" - ], - "rustflags": [], - "opaque_profile_fingerprint": 8055818090833361886 - }, - "core": { - "json_sha256": "e30236ed53e81f11af499b7f02bc4ccd520ee190ffc5f516499dd855fb3e46a3", - "features": [ - "gpu-monitor", - "hf-client", - "onnx-runtime", - "process-manager", - "s3" - ], - "rustflags": [], - "opaque_profile_fingerprint": 5060731410821673174 - } - }, - "attribution": { - "directory": "docs/release-attribution/0.7.0-s3", - "sha256": { - "README.md": "663a2d352f455938a5c14d950e26e2ffe4e2e76a68fcbfede2df70c2b5d91f77", - "inventory.json": "0b3cad4cfd7a6509422c34a32da255529b447e2febcb137e226ac59c6ad9c03b", - "THIRD-PARTY-NOTICES.txt": "90d6b8226b5cee95faa44b15a11e51e923b87d4442797715725f8c07231d5612" - } - }, - "evidence_sha256": { - "cargo_jsonl": "cbf7220057af2203908736287ff7ba6bf0e46397d0a101cee74cf64020ed3ba9", - "cargo_stderr": "a58a7822e22f5f9a949095cf5e2189dcdded99435193789598a16b73f325b4b1" - } - }, - "provider": "controlled TLS protocol fixture; not an actual S3-compatible service", - "target": "Linux x86_64", - "production_profile": "release with defaults and explicit s3; no test-support; no inference claim", - "packaged_files": { - "pumas-rpc": "69df92ec6ece85cfc257e841cfd33f76d624e57a634fa7a319e8bd7a7e00ef57", - "LICENSE.txt": "cd39fd1216a0187a1c36350649249f3f98391c5c65426ec41c6c8043e1039281", - "THIRD-PARTY-NOTICES.txt": "90d6b8226b5cee95faa44b15a11e51e923b87d4442797715725f8c07231d5612", - "ATTRIBUTION-README.md": "663a2d352f455938a5c14d950e26e2ffe4e2e76a68fcbfede2df70c2b5d91f77", - "ATTRIBUTION-inventory.json": "0b3cad4cfd7a6509422c34a32da255529b447e2febcb137e226ac59c6ad9c03b" - }, - "scenarios": [ - { - "mode": "success", - "authenticated": false, - "session_token": false, - "single": true, - "requests": [ - { - "method": "HEAD", - "version": "weights-v1" - }, - { - "method": "GET", - "version": "weights-v1", - "range_start": 0 - } - ], - "drained_exit": 0, - "result": "passed" - }, - { - "mode": "success", - "authenticated": false, - "session_token": false, - "single": false, - "requests": [ - { - "method": "HEAD", - "version": "data-v2" - }, - { - "method": "HEAD", - "version": "weights-v1" - }, - { - "method": "GET", - "version": "weights-v1", - "range_start": 0 - } - ], - "drained_exit": 0, - "result": "passed" - }, - { - "mode": "success", - "authenticated": true, - "session_token": false, - "single": false, - "requests": [ - { - "method": "HEAD", - "version": "data-v2" - }, - { - "method": "HEAD", - "version": "weights-v1" - }, - { - "method": "GET", - "version": "weights-v1", - "range_start": 0 - } - ], - "drained_exit": 0, - "result": "passed" - }, - { - "mode": "success", - "authenticated": true, - "session_token": true, - "single": false, - "requests": [ - { - "method": "HEAD", - "version": "data-v2" - }, - { - "method": "HEAD", - "version": "weights-v1" - }, - { - "method": "GET", - "version": "weights-v1", - "range_start": 0 - } - ], - "drained_exit": 0, - "result": "passed" - }, - { - "mode": "digest", - "authenticated": true, - "session_token": true, - "single": false, - "requests": [ - { - "method": "HEAD", - "version": "data-v2" - }, - { - "method": "HEAD", - "version": "weights-v1" - } - ], - "drained_exit": 0, - "result": "passed" - }, - { - "mode": "missing", - "authenticated": true, - "session_token": true, - "single": false, - "requests": [ - { - "method": "HEAD", - "version": "data-v2" - }, - { - "method": "HEAD", - "version": "weights-v1" - } - ], - "drained_exit": 0, - "result": "passed" - }, - { - "mode": "unknown", - "authenticated": true, - "session_token": true, - "single": false, - "requests": [ - { - "method": "HEAD", - "version": "data-v2" - }, - { - "method": "HEAD", - "version": "weights-v1" - } - ], - "drained_exit": 0, - "result": "passed" - }, - { - "mode": "truncated", - "authenticated": true, - "session_token": true, - "single": false, - "requests": [ - { - "method": "HEAD", - "version": "data-v2" - }, - { - "method": "HEAD", - "version": "weights-v1" - }, - { - "method": "GET", - "version": "weights-v1", - "range_start": 0 - }, - { - "method": "GET", - "version": "weights-v1", - "range_start": 1 - }, - { - "method": "GET", - "version": "weights-v1", - "range_start": 2 - } - ], - "drained_exit": 0, - "result": "passed" - }, - { - "mode": "cancel", - "authenticated": true, - "session_token": true, - "single": false, - "requests": [ - { - "method": "HEAD", - "version": "data-v2" - }, - { - "method": "HEAD", - "version": "weights-v1" - }, - { - "method": "GET", - "version": "weights-v1", - "range_start": 0 - } - ], - "drained_exit": 0, - "result": "passed" - }, - { - "mode": "empty-primary", - "authenticated": true, - "session_token": true, - "single": false, - "requests": [ - { - "method": "HEAD", - "version": "data-v2" - }, - { - "method": "HEAD", - "version": "weights-v1" - } - ], - "drained_exit": 1, - "result": "passed" - }, - { - "mode": "process-loss", - "authenticated": true, - "session_token": true, - "single": true, - "boundary": "one written byte before FilesReady", - "progress": { - "operation_id": "ff190dc6-0ac2-4abd-8218-30563139c722", - "progress": { - "downloaded_for_current_file": "1", - "phase": "acquiring" - }, - "status": "running" - }, - "custody": { - "acquisition": { - "id": "387da144-007f-4ea7-8cfd-6d2871487b0c", - "demand": { - "consumer": "model.s3.workflow", - "operation": "ff190dc6-0ac2-4abd-8218-30563139c722" - }, - "manifest": { - "schema_version": 1, - "source": { - "provider": "s3", - "source_id": "manifest:path:68747470733a2f2f6c6f63616c686f73743a34333335352f:666978747572652d6275636b6574", - "revision": { - "authority": "s3.explicit_versions", - "value": "[{\"provider\":\"s3\",\"source_id\":\"path:68747470733a2f2f6c6f63616c686f73743a34333335352f:666978747572652d6275636b6574:6d6f64656c732f736861726564\",\"revision\":{\"authority\":\"s3.version_id\",\"value\":\"weights-v1\",\"strength\":\"immutable\"}}]", - "strength": "immutable" - } - }, - "files": [ - { - "logical_path": "weights.gguf", - "source_key": "[\"models/shared\",\"weights-v1\"]", - "expected_size": 24, - "expected_sha256": { - "authority": "caller.sha256", - "value": "a4e5e156ddec27e286f75328784d7106b60a4eb1d246e950a001a3f944fbda99" - }, - "verification": "sha256" - } - ] - }, - "workspace": { - "root_identity": "1b:1a0b8d", - "relative_target": ".s3-import-ff190dc6-0ac2-4abd-8218-30563139c722" - }, - "phase": { - "state": "transferring" - }, - "files": [] - }, - "store_sha256": "02000d511a853f7b9aab2d98eb26f1b3f4d80465f810784a77bf8f7a35ce7e34", - "workspace": { - "device": 27, - "inode": 1706919 - }, - "partial": { - "device": 27, - "inode": 1706911, - "bytes": 1, - "sha256": "333e0a1e27815d0ceee55c473fe3dc93d56c63e3bee2b3b4aee8eed6d70191a3" - }, - "model_rows": [], - "sentinel_sha256": "12b67dc961a035b68675e7241f8aa7458ad66fe8397ba0c7b993d6ff080bb11c" - }, - "killed_exit": -9, - "cold_owners": [ - { - "not_found": { - "operation_id": "ff190dc6-0ac2-4abd-8218-30563139c722", - "status": "not_found" - }, - "idle": { - "status": "idle" - }, - "drained_exit": 0 - }, - { - "not_found": { - "operation_id": "ff190dc6-0ac2-4abd-8218-30563139c722", - "status": "not_found" - }, - "idle": { - "status": "idle" - }, - "retained_refusal": { - "operation_id": "ff190dc6-0ac2-4abd-8218-30563139c722", - "result": { - "error": { - "class": "invalid_request", - "code": -32005, - "message": "Request parameters are invalid." - }, - "published_model_id": null, - "retained_work": true, - "status": "failed" - }, - "status": "finished" - }, - "drained_exit": 0 - } - ], - "requests": [ - { - "method": "HEAD", - "version": "weights-v1" - }, - { - "method": "GET", - "version": "weights-v1", - "range_start": 0 - } - ], - "result": "passed" - } - ], - "archive_sha256": "65672d5d9a763b6f93a16da8404d80ed858fd22fe4d19764a2e64e0dcb799482", - "result": "passed" - }, - "controls": { - "tests": 24, - "pinned_ruff": "0.15.2", - "ruff_scope": [ - "torch-server", - "scripts/release" - ] - }, - "external_evidence_sha256": { - "/workspace/scratch/s3-installed-process-loss/controls.log": "6bf252d4f3a85a7943da98491eadfa60904d5465506620923f90f9f25c93b494", - "/workspace/scratch/s3-installed-process-loss/format.log": "10869b88a75066aa23546ef1f95fcd4678c3fb92a56ed46ef91688052b67976a", - "/workspace/scratch/s3-installed-process-loss/installed/installed-result.json": "ea577880834aa2b35b54ec42078fe7f0a1a902d0726b1f341c39ea9bb446cc0b", - "/workspace/scratch/s3-installed-process-loss/installed/process-loss-result.json": "ee795bb4906af5ed018756cc0f95340c8652db2a67153717d80f8fe3e8de00c2", - "/workspace/scratch/s3-installed-process-loss/installed/process-loss-root/custody-sentinel": "12b67dc961a035b68675e7241f8aa7458ad66fe8397ba0c7b993d6ff080bb11c", - "/workspace/scratch/s3-installed-process-loss/installed/process-loss-root/launcher-data/.downloads.lock": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "/workspace/scratch/s3-installed-process-loss/installed/process-loss-root/launcher-data/.s3-import-ff190dc6-0ac2-4abd-8218-30563139c722/weights.gguf.part": "333e0a1e27815d0ceee55c473fe3dc93d56c63e3bee2b3b4aee8eed6d70191a3", - "/workspace/scratch/s3-installed-process-loss/installed/process-loss-root/launcher-data/downloads.json": "02000d511a853f7b9aab2d98eb26f1b3f4d80465f810784a77bf8f7a35ce7e34", - "/workspace/scratch/s3-installed-process-loss/installed/process-loss-root/launcher-data/metadata/runtime-profiles.json": "9c232e2a08478ff2417800162619b8ed360e6530ce177bd8be4e30cf8c9d0216", - "/workspace/scratch/s3-installed-process-loss/installed/process-loss-root/llama-cpp-versions/.llama-install.lock": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "/workspace/scratch/s3-installed-process-loss/installed/process-loss-root/registry.db": "e7a10584db7364ec72675cdfd40ce0913e4ac2ffad99c1cc3fd02a6f54844ce4", - "/workspace/scratch/s3-installed-process-loss/installed/process-loss-root/registry.db-shm": "440ee175942e386bb0f80131e4f1b252bbd3673ed7d14023b4b7bb01be1d1d6e", - "/workspace/scratch/s3-installed-process-loss/installed/process-loss-root/registry.db-wal": "894bd72edd7568f7f8dc74f005e2505ca79110d77c154b012c74617803c5705f", - "/workspace/scratch/s3-installed-process-loss/installed/process-loss-root/shared-resources/cache/search.sqlite": "5b961a334c76479772901968d56defaeb7bad9ddf0ee09d8e45d3ca98620dacc", - "/workspace/scratch/s3-installed-process-loss/installed/process-loss-root/shared-resources/models/.pumas-library-id.json": "1fda379e6ef1cb5c0ac76581aa0bb19b99a0bb955d2a54c08b89479a7c430698", - "/workspace/scratch/s3-installed-process-loss/installed/process-loss-root/shared-resources/models/.pumas-library-id.lock": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "/workspace/scratch/s3-installed-process-loss/installed/process-loss-root/shared-resources/models/models.db": "de679a528c16bccd25957cc06b181b8b5eaad8a36d25fd3d867bded13d617ef4", - "/workspace/scratch/s3-installed-process-loss/installed/process-loss-root/shared-resources/models/models.db-shm": "fd4c9fda9cd3f9ae7c962b0ddf37232294d55580e1aa165aa06129b8549389eb", - "/workspace/scratch/s3-installed-process-loss/installed/process-loss-root/shared-resources/models/models.db-wal": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "/workspace/scratch/s3-installed-process-loss/installed/process-loss-root/torch-versions/.torch-versions.lock": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "/workspace/scratch/s3-installed-process-loss/installed/pumas-s3-qualification-linux.tar.gz": "65672d5d9a763b6f93a16da8404d80ed858fd22fe4d19764a2e64e0dcb799482", - "/workspace/scratch/s3-installed-process-loss/installed.log": "f96fd258626559adb6af417f36f12723d62ee5188dd7da8ea3af0f8ded4415cf", - "/workspace/scratch/s3-installed-process-loss/production-build.cargo.jsonl": "cbf7220057af2203908736287ff7ba6bf0e46397d0a101cee74cf64020ed3ba9", - "/workspace/scratch/s3-installed-process-loss/production-build.cargo.stderr.log": "a58a7822e22f5f9a949095cf5e2189dcdded99435193789598a16b73f325b4b1", - "/workspace/scratch/s3-installed-process-loss/production-build.json": "81be3b9af56c288792621ac9d9074f202f0fb211917db03b36e690df1dc997b4", - "/workspace/scratch/s3-installed-process-loss/production-build.log": "95495cebbae3e6f09270b0cbddf0feb015469e1a2d149dfd955ff20e38969131", - "/workspace/scratch/s3-installed-process-loss/ruff-format.log": "b642d2f0cc49caff9e609808fb9c82854fc174b2f54b459a0d09dbe4c0f837ab", - "/workspace/scratch/s3-installed-process-loss/ruff-lint.log": "82b3e6a6c090a57601d22943bd23fca9218d1031dbe5a7b754092f9a156b4f18", - "/workspace/scratch/s3-installed-process-loss/integrity.log": "656f39e20cd7b77444b14340c8c4288894c7bb88f5dfc1fcf57702ebf4f2b4c7" - }, - "scope_limits": [ - "one SIGKILL before FilesReady, no power-loss durability claim", - "two bounded cold owners, no ongoing monitoring or resumed-transfer claim", - "actual-provider/desktop/platform/inference/hosted/deployment gates stay open", - "no Rust, dependency, ONNX, network-setting or production policy change" - ], - "next_documented_feature": { - "milestone": "Q2", - "feature": "exact approved wheel-file-set acquisition and local-only Torch installation", - "dependency": "AQ-HTTP", - "gate_status": "not ready" - } -} diff --git a/docs/plans/artifact-acquisition/reports/s3-manifest-qualification-2026-10-05.md b/docs/plans/artifact-acquisition/reports/s3-manifest-qualification-2026-10-05.md deleted file mode 100644 index 2b68d782b..000000000 --- a/docs/plans/artifact-acquisition/reports/s3-manifest-qualification-2026-10-05.md +++ /dev/null @@ -1,92 +0,0 @@ -# Explicit pinned S3 file sets and GGUF auxiliary composition - -**Review correction:** Independent review found acquired recovery could accept missing/null publication identities through legacy readiness helpers, skipping held payload proof. The earlier focused checks did not cover this defect. See [bounded proof repair](s3-publication-proof-repair-2026-10-05.md); this report's output-proof claim is superseded for that gap. - -Branch `feat/acquisition-s3-manifest-ea1c4ae7`; exact parent -`ea1c4ae75a8a6d4719a95f31c684e1d0398acbb8`, tree -`736424cfd86f4c3d24ce268718ebec21e5e9613e`. Frozen dispatch e1ee893f, -accepted reader `2c7d6014658ef44575f3724f0ff6e7395f1fd7d8` and accepted main -`96c2dca97fad673a2735f9f778013067569fe692` remain ancestors. Parent owns -independent review, PR actions and integration. This advances a bounded explicit -file-set consumer result; AQ-S3 and complete acquisition acceptance remain open. - -## Authority and covered requirements - -Each caller-declared entry supplies its exact source key, immutable VersionId, -logical path and expected SHA256 under one explicit reader endpoint/bucket/addressing -authority. The resolver sorts logical paths, validates all object identities and -the complete shared-manifest namespace before any HEAD, then resolves every entry. -Missing or changed declared versions return an error, never a shortened selection. -The group immutable revision serializes the original per-object source identities -in canonical order, preserving exact endpoint, addressing, bucket, key and VersionId. -The existing 16-KiB revision limit bounds this encoding before network calls. -This is an explicit set and makes no atomic remote-prefix snapshot claim. HEAD -operation and transfer retry budgets remain per object, not one aggregate deadline. - -The opaque selection feeds all objects to the existing shared transfer, checkpoint, -verification, receipt, worker and settlement owner. No listing, new store/schema, -retry owner or protocol parser is introduced. Every declared member must verify -before consumer preparation. A later member's version/digest failure retains the -existing transfer state and already verified input, without model publication. - -The bounded model consumer accepts one primary GGUF named by the exact bound -serialized import spec and digest-verified data/text auxiliaries with extensions -json, txt, md, model, tiktoken, vocab or merges. It refuses other/sharded weights, -executable auxiliaries and root metadata/receipt reservations. Extension admission -is a copy policy, not semantic validation of tokenizer/config contents. All held -verified descriptors enter one registered copied-import producer; the primary -can occur anywhere in canonical order. Auxiliary logical paths are preserved, -parent directories are created by existing held stage authority, each copy's -size/SHA256 is checked, and the existing complete-payload publisher confirms the -model/index before the acquisition owner acknowledges it. No ambient source path -is reopened. Ordinary directory and single-file copy behavior is preserved. - -Cold complete-bundle reconciliation requires the exact issued/current acquisition -receipt, confirmed output receipt, canonical Ready metadata/index, physical held -payload proof and every exact logical path, size and digest. Changed or omitted -members retain uncertainty. The existing consumer alone settles the exact use; -observation performs no transfer, import, index repair, output deletion or Pending -promotion. Existing output receipt version 2 already binds the full acquired set; -ordinary copied output retains readable version 1. No format version/migration, -Cargo dependency/lock, attribution generator, HF or speech source change occurs. - -## Local evidence and limits - -Final source passes 29 S3 acquisition/import cases (20 prior plus nine new), -11 reader fixtures and five HTTP cases: 45 focused runtime tests. New controls -cover canonical exact pins, whole-set preflight with zero IO, missing member -resolution, full nested-auxiliary Ready publication, confirmed cold Using-to-Adopted -settlement without requests, same-size auxiliary mutation, omitted member intent, -last-member version/digest failures before handoff, and unsupported/reserved input -refusal. Reopened owners use a live loopback counter; successful recovery observes -no requests beyond the initial two HEADs and two GETs. Negative output assertions -compare post-startup baselines, retaining existing unavailable-index projections. -Synthetic input is a 24-byte GGUF and two-byte auxiliary file. Real shared owners, -model publisher/index and independent read-only Ready selector are exercised. - -Strict `s3,test-support` all-target Clippy with warnings denied, actual headless -compile, 12 feature contracts, canonical attribution/dependency ownership, -formatting and 20 release/workflow tests passed. Locked/offline Linux x86_64 checks -used Rust 1.92, one build job, task-owned XDG config and the existing shared target -with root-package debug/incremental/strip overrides. Logs, exact command arrays, -source identities and task-only cache-retirement SHA256 journals accompany handoff. -The first integration compile failed Rust's nested module lookup (E0583); an explicit -path attribute corrected it before runtime. A static-command recorder initially -omitted the environment setup and could not locate Cargo; it was rerun with -the established toolchain. No failed runtime case was hidden. - -No complete unit/default ONNX suite is executed. The 32-GiB environment has about -135 MiB free after focused checks; existing ort-sys build-script artifacts have no -completed native output. No large native acquisition was attempted, unrelated -cache removed, or permission/network/credential change made. Feature graph checks -cover default declarations but do not constitute default runtime qualification. - -Fresh same-process owner reopening models the confirmed-publication/pre-acknowledgement -window; it is not hard SIGKILL, power loss or the full interruption/cancellation -matrix. No deployed migration/old-writer isolation, native cross-platform run, -real weights/inference, desktop/RPC source workflow, authenticated/refreshing -credentials, live AWS/non-AWS/MinIO, atomic prefix snapshot, sharded GGUF or other -multi-file weight format is qualified. Independent review and exact-head hosted -execution remain pending. AQ-S3 remains not ready. The next separately useful -source requirement is the source-facing application workflow; provider/credential -qualification needs its explicit authority and resources. diff --git a/docs/plans/artifact-acquisition/reports/s3-model-workflow-qualification-2026-10-05.md b/docs/plans/artifact-acquisition/reports/s3-model-workflow-qualification-2026-10-05.md deleted file mode 100644 index 64d02f24b..000000000 --- a/docs/plans/artifact-acquisition/reports/s3-model-workflow-qualification-2026-10-05.md +++ /dev/null @@ -1,149 +0,0 @@ -# Native explicit S3 model workflow qualification — 2026-10-05 - -## Candidate and authority - -The coordinator froze authenticated reader -`ffecce07220f6504fb1db2e348759473bd284de6`, tree -`0acb23784970e86859851c9063e76d04cd740b8b`, reported independent static acceptance, -and explicitly delegated the smallest useful source-facing native application -successor. Separate branch `feat/s3-model-workflow-ffecce07` commits and normally -pushes tested code `2b8e0a4401224212d84f4c02abcbd175369728ab`, tree -`d78dd9ed0113eaee6d728056ae22dfde14115d80`. - -PR40 ancestor remains `63123fd8f9f866064a8315096ab3fb1fc81e8f0f`, tree -`163ef2442695b44555ac0e42ff79a6a88de9e817`. Accepted main remains -`05717338c2aea737483fb4b28c3ed4053a65de96`, tree -`c4dc1a7a0c28099a3ec66f925bb67db73a9177a5`. This is a descendant of the actual -frozen reader, not the old environment seed. Parent owns PRs, reviews, hosted -qualification and merges. No reviewer was contacted. - -Repository AGENTS/local skills were absent in the earlier verified inspection. -The CONTRIBUTING-directed MrScripty/Coding-Standards checkout at -`188beda1fa477d21d576c233dd8c7f4c4c267d23` supplies the already read Core, -Router and applicable Rust/library/API/async/security/verification/documentation -standards. The existing route record is copied to the raw evidence directory. -Q3 and the credential contract select this scope; the coordinator excludes -frozen native watcher/importer/reconciliation and reader/manifest production paths. - -## Public surface and ownership - -With optional `s3`, the additive root exports are `S3ModelImportRequest`, -`S3ModelImportControl`, `S3ModelImportPhase`, `S3ModelImportProgress` and -`S3ModelImportError`; `PumasApi::import_s3_model` returns the existing -`ModelImportResult` after settlement. Existing public constructors/configuration -and anonymous behavior remain unchanged. - -The owned request carries explicit endpoint/region/bucket/addressing/timeout, -pinned key/VersionId/logical path/SHA-256 facts, the selected primary GGUF import -spec, caller-reserved workspace, finite retry budgets, retained operation UUID -and optional explicit credentials. The request has no Debug or serde -implementation. Credentials only construct the ephemeral reader. The importer -payload is the existing model spec; credentials never enter that payload, -manifest, receipt, model metadata or progress. - -Source selection uses a crate-private invocation on the existing bounded -acquisition consumer scope. It validates finite transfer budgets before I/O and -admits no durable record until selection completes. Transfer/verification and -receipts remain with `AcquisitionConsumer::acquire_s3_manifest`; the existing -importer owns single GGUF or GGUF-plus-explicit-data/text publication. There is -no new transfer, storage or publication owner and no persisted source/account -configuration. Production authentication still requires HTTPS, with existing -endpoint/proxy/redirect and SDK retry policies unchanged. - -One request control exposes coalesced safe phase/current-file byte observation -and an atomic cancellation/finalization gate. Cancellation can win before -finalization, including during verification; the prepare callback closes its -admission before receipt issuance. Late stage/cancellation notifications cannot -replace a newer terminal observation. Progress bytes can reset and do not prove -verification. Receiver disconnection does not cancel work. Cancellation -acknowledgement is not a stopped-effects result; the caller keeps awaiting -owned drainage. Dropping the result waiter yields Interrupted, and shared -shutdown drains registered effects. Publication can be uncertain on interruption; -the facade does not promise successful settlement after a dropped waiter. - -Typed failures preserve selection errors, operation errors and scope-drain -failure. Drain failure retains an already published result or the original -operation error. Errors/cancellation can retain staged/Using custody. The stable -demand owner is `model.s3.workflow`; callers keep the same operation UUID and -use the existing exact consumer/model-output reconciliation path rather than -replay uncertain publication with a fresh identity. No new automatic recovery, -blanket cleanup or format eligibility policy is added. - -## Local verification - -All commands ran from the repository root after sourcing -`/workspace/.pumas-tools/env.sh` (Rust 1.92.0, four Cargo jobs), locked/offline, -with disposable `XDG_CONFIG_HOME=/tmp/pumas-s3-auth-config`. -Test profile debug symbols and incremental compilation were disabled; check/ -Clippy additionally used `CARGO_PROFILE_DEV_DEBUG=0` and -`CARGO_PROFILE_DEV_INCREMENTAL=false`. No HOME, permissions, credentials, -network security or production TLS policy was changed. - -```bash -cargo test --locked --offline --manifest-path rust/Cargo.toml -p pumas-library --no-default-features --features s3 --test s3_model_workflow --test s3_acquisition --test s3_reader -cargo test --locked --offline --manifest-path rust/Cargo.toml -p pumas-library --no-default-features --features s3 --lib acquisition::s3::auth_tests -cargo test --locked --offline --manifest-path rust/Cargo.toml -p pumas-library --no-default-features --features s3 --lib api::s3_models::tests -cargo clippy --locked --offline --manifest-path rust/Cargo.toml -p pumas-library --no-default-features --features s3,test-support --all-targets -- -D warnings -cargo check --locked --offline --manifest-path rust/Cargo.toml -p pumas-library --no-default-features -cargo fmt --manifest-path rust/Cargo.toml --all -- --check -git diff --check -``` - -Seventy selected tests passed: six workflow, 41 existing S3 acquisition/import, -13 reader, nine authentication and one control test. Two isolated child runs -also passed. This is not the full Rust/native suite. Strict enabled-S3 all-target -Clippy, headless check, workspace formatting and diff checks passed. -Dependency/lockfile inputs are unchanged; the preceding reader's 12 graph -qualification is inherited, not claimed as rerun here. - -The workflow fixtures prove public single/bundled import, Ready/GetModel, -exact bytes, same operation demand, adopted exact completion binding, clean -shutdown and cold reopened output without replay. Refusals cover primary -selection, unbounded retry configuration, missing VersionId, production plaintext -credentials, mismatched digest and pre-cancelled requests. Stalled HEAD and GET -exercise selection/transfer cancellation, one-byte progress observation, no model -publication and source socket closure before drainage returns. A dropped HEAD -waiter exercises Interrupted observation and shared shutdown drainage. The -co-located control test covers both admission outcomes and stale observations. - -The Linux-only HTTPS child trusts the repository's existing synthetic localhost -certificate through an isolated OpenSSL certificate-file setting. Peer/hostname -verification remains enabled. It uses the production authenticated constructor, -captures explicit access-key/session-token headers on HEAD/GET, imports and -settles, then scans owned output, staging and cache files for all synthetic -credential values. No production root/transport API was changed. The successor -authentication oracle explicitly requires `x-amz-security-token` in SignedHeaders -and rejects token tampering for both addressing styles and methods; the frozen -reader branch itself is untouched. - -Initial integration compilation caught a missing await in a test assertion -(E0599); the original failed log is retained and the assertion was corrected. -The later five-test exploratory run and final six-test plus regression run -passed. The final code differs from that final runtime tree only in documentation -comments; no behavior changed after verification. - -## Evidence and remaining scope - -Raw logs and command/status/hash inventory are under -`/workspace/scratch/s3-workflow/`: `integration-tests.log`, `auth-unit.log`, -`control-unit.log`, `clippy.log`, `headless.log`, `fmt.log`, `diff.log`, -`verification.json`, `feature-boundaries.log`, `standards-route.json`, -`code-commit.log`, `code-push.log` and `log-inventory.json`. Initial compilation/ -exploratory logs are retained as `s3-workflow-tests.log` and -`s3-workflow-tests-2.log`. Final commit/push/ref evidence is recorded alongside -those logs after the documentation milestone. Frozen-file equality checks cover -reader, manifest, staging/VersionId fixtures, reconciliation and dependency -inputs; no importer/watcher file is changed. - -This implements the selected native source-facing workflow. Static review, -exact-head hosted qualification and integration of this successor remain -parent-owned. Linux controlled TLS is not live AWS/non-AWS/MinIO acceptance, -packaged consumer qualification or a cross-platform trust test. Refresh, -account provisioning, desktop/RPC source entry, other/sharded weight formats, -large-payload concurrent discovery and frozen native repairs remain separate. -No real account credentials, paid provider, security bypass or external reviewer -contact occurred. AC13/AC14 and AQ-S3 remain pending. - -The next existing-plan implementation feature is Q3 desktop/RPC explicit source -selection/configuration and progress/cancellation/result through this native -entry; real-provider acceptance requires its separate authorized environment. diff --git a/docs/plans/artifact-acquisition/reports/s3-prefix-budget-review-repair-2026-10-06.md b/docs/plans/artifact-acquisition/reports/s3-prefix-budget-review-repair-2026-10-06.md deleted file mode 100644 index 6fbaf0056..000000000 --- a/docs/plans/artifact-acquisition/reports/s3-prefix-budget-review-repair-2026-10-06.md +++ /dev/null @@ -1,52 +0,0 @@ -# Prefix byte-capacity review repair - -Independent review identified that transport XML-byte overflow was collapsed into -`S3ReaderError::Protocol`, despite the prefix API's typed capacity outcome. -Original prefix and successful RPC recovery remain preserved at -`b5c97e8e3440e3fc11cfec806bee1af178e024e4`, tree -`96e1df067881873b55f024eca796163b4dd9ae34`. Separate formatting repair -`6f260de60a90f379a5e47db3d1edccc8579e953f`, tree -`8bf31066dbe309c5032880cfec2e7b3b9b5403d5`, applies pinned Ruff0.15.2 only to -the two changed release Python files; their ASTs are unchanged. Full Ruff lint -passes and those two formatting checks pass. Full formatting retains an -unchanged-baseline failure in `qualify-s3-installed.py`; exact base bytes and -failure evidence are recorded, without weakening the CI check. - -## Repair and retained behavior - -A private static `ListingByteBudgetExceeded` error travels in the successful -listing body stream as its original boxed typed cause. The SDK's existing error -source chain preserves it; a prefix-only mapper returns -`S3PrefixError::Incomplete("XML byte bound exhausted")`. The defensive XML guard -uses the same marker for byte overflow. This does not match error text, expose -provider diagnostics or add mutable side-channel state. Malformed XML and other -reader/protocol errors keep their existing classification. Error-response bodies, -HEAD/range reads, source identity, credentials, retry/timeout policy, verification, -manifest/receipt formats and protected native/ONNX source remain unchanged. - -## Regression evidence - -Three strengthened regressions fail on the old implementation: completed valid -XML one byte over the per-page bound, a second valid page one byte over the -remaining total bound, and overflow before body EOF. Actual red result: 13 pass, -three fail and one child helper ignored; evidence `prefix-budget-classification-red.log`. - -The repaired full S3 unit set passes 30 tests, with two subprocess helper entries -ignored and exercised by parent tests (`prefix-budget-classification-green.log`). -Exact per-page and aggregate boundaries succeed with checked VersionIds and byte -counts; one-over returns typed Incomplete and no HEAD pin/shortened selection. -Malformed XML within capacity remains Reader(Protocol). Unfinished overflow still -closes its connection before the caller deadline. Existing signed/anonymous/token, -TRACE redaction, receipt identity and cancellation regressions remain passed. -All 66 S3 integrations and strict all-target core Clippy pass. Production RPC -Clippy passes with the inherited dead-code allowance; the exact default-plus-S3 -RPC suite passes 302 units, 20 integrations and two intent integrations, with -12 existing ignores unchanged. No active qualification remains for this repair. - -Logs are under `/workspace/scratch/s3-prefix-main95/`: `prefix-budget-` repair -logs, `release-ruff-format-only.json`, `release-ruff-check-repair.log`, -`release-ruff-format-repair.log` and `release-ruff-unchanged-baseline-failure.log`. -No dependency or source-authentication API change is introduced. Parent retains -PR/review/publication/integration authority. The next independent Q4 candidate -is installed default-plus-S3 build provenance and complete S3 notice packaging; -provider/platform/inference acceptance remains separate. diff --git a/docs/plans/artifact-acquisition/reports/s3-prefix-enumeration-2026-10-06.md b/docs/plans/artifact-acquisition/reports/s3-prefix-enumeration-2026-10-06.md deleted file mode 100644 index e7db457cf..000000000 --- a/docs/plans/artifact-acquisition/reports/s3-prefix-enumeration-2026-10-06.md +++ /dev/null @@ -1,265 +0,0 @@ -# Bounded S3 prefix enumeration - -Successor `feat/s3-prefix-main95` retains integrated checkpoint -`7cf17383001d582056ac4299803c83d0f9ae68a7`, tree -`046771b37c9a9f563936376539301b3225b48656`, and attribution prerequisite -`a39121b4cc7667f901959497f71368179341cfd1`, tree -`35e24f3265b6064d16516493378e89f695609a4b`. The prerequisite qualified default -plus S3 RPC compilation and 302 tests, eight attribution regressions, eleven -release contracts and 33 dependency graphs. The final source milestone and -review comparison are bound in the successor review packet. Source checkpoint -`253cc3d17aeae04f4df996133e0f7f4745e03a71`, tree -`1bf9e7614f8cfb9850f62399a0cd8f839db500d3`, is committed and pushed. - -## Owner and authority - -One AWS SDK client remains the protocol/signing owner over the existing explicit -reqwest transport. There is no object_store fallback, AWS config discovery, -default SDK HTTP client or second listing backend. The promoted XML/SDK agreement -guard comes from reviewed spike `ba1a9d908010f23f2391059cb93bfe61dcca6aa1`; -its exact scalar/namespace/completion/selection comparisons remain intact. -Added operation-local annotations bound the listing body before SDK buffering; -an observed byte counter supplies the aggregate budget. This guard checks evidence -after the maintained SDK decodes S3; it does not replace the SDK protocol owner. -Optional `roxmltree = =0.21.1` uses its authoritative MIT/Apache-2.0 crate texts. - -`S3Reader::enumerate_prefix` uses a caller-authorized raw prefix, one page at a -time, no delimiter or encoding conversion, and explicit positive page/object/XML -capacity. Each page is at most 1 MiB and retains the reviewed 4096-node/no-DTD -guard. The existing reader timeout covers the entire call, including all pages -and HEAD pins. The maximum source-call count is `max_pages + max_objects`. -These capacity bounds are not a production RSS or wire-header overhead claim. -The API does not impose a new fixed service deadline or SDK retry policy. - -Completion must be explicit and unambiguous. All scope/count echoes must match; -next tokens must be nonempty and noncyclic; keys must be exact, in scope, unique -and in the general-purpose service's lexicographic order. Grouped or encoded -results, unsupported keys, failed pages and contradictions return no partial -success. Limits report typed `S3PrefixError::Incomplete`; other errors wrap the -unchanged `S3ReaderError`. The existing constructors/config/error enum remain -source-compatible. Directory buckets remain refused by existing construction. - -No HEAD pins are resolved until listing pagination finishes. Every current HEAD -uses the listed opaque ETag as If-Match, must match size/ETag and must return a -valid immutable, non-null VersionId. The returned listing has ordered version -observations, no credential/read capability and no serialization. Debug shows -counts; object Debug is redacted. Opaque tokens are scoped local state. All SDK -and body/guard polls retain the same NoSubscriber boundary without changing the -global subscriber; caller-owned safe status remains visible. - -The underlying [ListObjectsV2 API](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html) -specifies 200 responses, opaque continuation tokens, a maximum page size of 1000, -raw prefix selection and lexicographical ordering for general-purpose buckets. -The production API is a deliberately bounded subset of these semantics. Multiple -pages and sequential HEADs do not create an atomic multi-object snapshot. Caller -paths and authoritative SHA-256 evidence remain required before the unchanged -explicit manifest/acquisition/import path can admit and verify content. - -## Boundary and receipt qualification - -The focused wire fixtures cover anonymous, access-key/secret and session-token -requests in both addressing styles; exact query/signature bytes are checked by -the existing RFC-anchored independent HMAC oracle. They qualify malformed and -duplicate completion fields, XML/SDK CDATA disagreement, namespace/DTD/node -limits, scope/count mismatches, grouped/encoded results, duplicate/out-of-order -keys, cycles, empty advancing pages and empty complete results. Byte/page/object -limits and exact response-size boundaries are distinguished from successful -completion. Changed size/ETag, missing/null versions and source failure never -produce a shorter returned set. Redirects, response status, SDK retries, reflected -provider errors, fresh-process ambient/proxy rejection, global TRACE redaction, -unfinished body overflow, cancellation and total elapsed budget are exercised. - -The public native workflow fixture maps two discovered keys to caller-chosen -logical paths and SHA-256 evidence. Distinct config/model versions pass through -the unchanged importer, publication and exact receipts. Before explicit import, -discovery creates neither acquisition records nor workspace files. GetModel and -Ready metadata, payload bytes, version-qualified source keys, adopted custody -and exact receipt pairing are checked; cold reopen requires no source replay. -Continuation tokens are absent from persisted acquisition state. - -The source write set excludes `s3/manifest.rs`, watcher, importer/recovery, -stores, consumer/receipt formats, transfer retries/verification and ONNX source. -Their protected bytes are compared to integrated 7cf17383. New listing transport -authority leaves HEAD and conditional range GET behavior intact; existing reader, -acquisition and public workflow regressions remain required. No prefix RPC/UI, -automatic import, credential refresh or native runtime acquisition is added. - -## Evidence and limits - -Execution and source/check logs live under `/workspace/scratch/s3-prefix-main95/`. -Completed checks before the final fixture-module cleanup: - -| Check | Result | Log in evidence directory | -| --- | --- | --- | -| Core S3 units | 28 passed, 2 subprocess helpers ignored; helpers exercised by parent tests | `prefix-unit-final.log` | -| S3 reader/acquisition/model workflow integrations | 44 + 14 + 8 passed | `prefix-integration-final.log` | -| Attribution and release-contract Node tests | 8 + 11 passed | `prefix-release-contracts-final.log` | -| Dependency feature graphs | 33 passed | `prefix-feature-contracts.log` | -| Dependency ownership | passed | `prefix-dependency-ownership.log` | -| Formatting | passed | `prefix-format-final.log` | -| Default/S3 attribution | 365 / 415 entries validated | attribution generation/check logs | - -Strict core Clippy found a duplicate test fixture module. The fixture was moved -to the shared S3 test parent, retaining its original visibility and bytes. An -intermediate sibling import failed visibility checks; that compiler evidence is -retained in `prefix-clippy-core-fixture-reuse.log`. Post-cleanup strict core Clippy passed with `--all-targets -- -D warnings` -in `prefix-clippy-core-shared-fixture.log`; the final focused unit rerun passed 28 tests, with the two subprocess helpers -exercised by their parent tests, in `prefix-unit-shared-fixture-recovered.log`. Post-prefix production default-plus-S3 RPC Clippy passed (`-D warnings --A dead_code`, preserving the inherited dead-code allowance) in -`prefix-rpc-production-clippy.log`. Post-prefix RPC tests and hosted checks remain -pending at this checkpoint. -The 302 RPC tests above qualified the attribution prerequisite before prefix -source changes; they are not a post-prefix result. -The actual default-plus-S3 graph retains approved-main dynamic ONNX loading and -forbids build download/copy/TLS features. Final S3 attribution includes 415 notice -entries; default remains 365. Platform graphs are not platform builds; separately -provisioned runtime/inference, actual desktop/accessibility, hosted checks and -AWS/non-AWS/MinIO provider acceptance are not claimed. AQ-S3/Q4 remain pending. - -Intermediate evidence is retained. The first unit build failed because String -fixtures used slice `repeat`, which requires Copy; cloning repeat_n fixes it. -The next link exhausted disk, failed with linker SIGBUS and temporarily prevented -normal sandbox startup (`No space left on device`). Managed automatic approval -allowed narrow cache cleanup; no sandbox/network/security settings changed. -Source, logs and packaged frozen evidence remain intact; paths/hashes of retired -recomputable caches are recorded. A subsequent actual run passed 26 units and -caught two fixture expectations: existing construction already refuses directory -bucket selectors, and the reqwest budget may win the outer timeout race. Tests -now check the existing contained error behavior and connection drainage, without -changing reader error mapping/retry policy. A workflow fixture also initially attempted serialization of the entire UUID-keyed -record map, whose key has no serde feature; it now serializes the individual -existing record without changing UUID dependencies. The diagnostic is retained -in `prefix-integration-key-serialization-intermediate.log`. -The saved source checkpoint records successful checks and explicitly pending -qualification; it does not claim all release gates have passed. No external reviewer was contacted and no -PR mutation occurred; parent owns draft publication, review and integration. - - -The first post-fixture unit link failed with SIGBUS after the remaining disk -space reached zero (`prefix-unit-shared-fixture.log`). Only its 17 recomputable -object files and one superseded 1.1 GB debug test executable were retired, with -paths, sizes and SHA-256 evidence in `retired-final-fixture-link-cache.json` and -`retired-superseded-debug-unit-cache.json`. Source, dependency maps, prior logs and -frozen qualification archives remain intact. The recovery unit run passed 28 tests (two subprocess helper entries ignored -and exercised by parent tests) in `prefix-unit-shared-fixture-recovered.log`. - - -Two additional superseded test executables (the attribution-prerequisite RPC -binary and earlier SDK unit binary) were retired for link headroom. Their hashes -and sizes are retained in `retired-recovery-headroom-cache.json`. Prior passing -logs and frozen packaged qualification evidence remain intact. - -## Reproduction and resume - -Use Rust 1.92 with the checked-in lockfile, one build job, disabled incremental -compilation and debug level zero for dev/test. Keep `XDG_CONFIG_HOME` isolated -for fixtures and permit enough recomputable cache space for the test linker. -All qualification commands use `--locked --offline`; the selected production -graph retains dynamic ORT loading without a build-time runtime download. - -```sh -cargo fmt --all --manifest-path rust/Cargo.toml --check -cargo clippy --locked --offline --manifest-path rust/Cargo.toml \ - -p pumas-library --features s3,test-support --all-targets -- -D warnings -cargo test --locked --offline --manifest-path rust/Cargo.toml \ - -p pumas-library --features s3,test-support --lib acquisition::s3:: \ - -- --test-threads=1 --nocapture -cargo test --locked --offline --manifest-path rust/Cargo.toml \ - -p pumas-library --features s3,test-support \ - --test s3_reader --test s3_acquisition --test s3_model_workflow -``` - -Resume post-prefix production/default-plus-S3 RPC qualification before claiming -completion. Provider/platform gates remain separate; no hidden credentials or -runtime provisioning may be introduced to close them. - - -### Safe-boundary resume checkpoint at 99% allowance - -Final source remains `253cc3d17aeae04f4df996133e0f7f4745e03a71` (tree -`1bf9e7614f8cfb9850f62399a0cd8f839db500d3`). Core strict Clippy, final units -and production RPC Clippy have completed successfully. No active test is -interrupted. The next bounded command is the actual default-plus-S3 RPC suite: - -```sh -cargo test --locked --offline --manifest-path rust/Cargo.toml \ - -p pumas-rpc --features s3 -- --test-threads=1 -``` - -Use the reproduction environment above. Retain output at -`/workspace/scratch/s3-prefix-main95/prefix-rpc-final-tests.log`. At this -checkpoint its result is pending. A running process must be polled before -starting any replacement; service interruption is not evidence of test success. -Provider/platform gates and parent PR coordination remain open. - - -### Final RPC attempt: qualification remains blocked - -The above exact RPC test command exited 101 while linking the normal RPC -executable (`pumas_rpc-f5f33b788485001f`) with linker SIGBUS. A direct filesystem -check confirmed zero free space. No RPC tests ran and the earlier 302 tests are -still only the attribution prerequisite result. Full failure output is preserved -in `prefix-rpc-final-tests.log`. Only 17 failed-link object files and its temporary -output were retired; hashes/sizes are in `retired-final-rpc-link-cache.json`. -No test was interrupted. No source/security/network/runtime policy was changed. - -This is a concrete link-headroom blocker, not a successful qualification or an -observed service-limit rejection. Resume by providing sufficient recomputable -build-cache headroom, then rerun the exact RPC test command above. Preserve the -existing failure log under a new filename before the rerun. Actual service-limit -exhaustion has not been observed. Draft PR publication remains parent-owned. - - -## Recovery completed: actual default-plus-S3 RPC qualification - -The owner explicitly authorized deletion of reproducible Rust build artifacts. -An actual process check found no active Cargo/rustc/Clippy/linker job. Disk -inspection attributed 29 GB to debug dependencies, 2.2 GB to examples and -762 MB to incremental caches. Cleanup removed exactly four inactive integration -ELF executables (2,228,060,536 bytes), retaining their dependency maps and all -source, logs, evidence, uncommitted content and current qualification outputs. -`retired-rpc-recovery-inactive-tests.json` records exact paths, sizes and hashes. -Available space rose from 196 MB to 2.3 GB and remained about 2.1 GB after the run. - -The original `prefix-rpc-final-tests.log` is unchanged. The exact unchanged -command above completed with exit zero in `prefix-rpc-recovery-tests.log`: - -| RPC target | Passed | Existing ignored | Evidence scope | -| --- | ---: | ---: | --- | -| Unit binary | 302 | 0 | Actual default-plus-S3 RPC suite | -| Integration binary | 20 | 10 | Producer/process/transport/retained-state fixtures | -| Intent integration binary | 2 | 2 | Shared owner/restart; live HF/CDN cases remain ignored | - -Total: 324 passed, 12 existing ignored; no assertions were weakened or tests -changed. Settings remained one job, dev/test debug level zero and incremental -off, with the same shared target and isolated XDG configuration used before -recovery. Cargo remained locked/offline. Production dependencies and ONNX -configuration are unchanged; no runtime was downloaded or provisioned. -Final strict core Clippy, production RPC Clippy with the inherited dead-code -allowance, 28 S3 units, 66 S3 integrations, 19 Node release tests, 33 dependency -graphs, ownership, formatting and both notice profiles remain qualified. -No source change followed source checkpoint 253cc3d1. Local RPC qualification -is now complete; the earlier failure and pending-state paragraphs are historical -evidence, not current blockers. Parent still owns PR publication/review/merges. - -## Next existing-plan gates and concrete inputs - -Q3/AQ-S3 still requires native AWS, a named independent S3-compatible provider -and local MinIO acceptance. Current harmless checks find no MinIO executable -and no Docker image. The earlier official MinIO installation denial remains -preserved; it was not retried through an alternate route. An approved versioned -MinIO installation with HTTPS and an owned synthetic versioned fixture would -permit that local gate without real account credentials. AWS/non-AWS endpoints, -versioned fixture identities/digests and separately authorized scoped access -are not supplied; this task must not obtain/provision real credentials. - -Q4 remains installed/native/UI/platform and inference qualification, not this -local suite. The current Chromium helper is `nobody:nogroup`, mode 4755; its -supported owner requirement remains unmet. No sandbox flag, ownership/security -change or network bypass was used. A supported desktop/browser environment, -exact shipping candidate packages, supported Windows/macOS hosts and separately -supplied runtime/model/deployment facts are still needed. The prior Linux -installed fixture archive does not certify this new source head or inference. -Next useful work needs those external fixtures/artifacts or parent-coordinated -hosted acceptance; these gates cannot be honestly closed with synthetic reader -fixtures. No additional feature or acceptance claim was invented. diff --git a/docs/plans/artifact-acquisition/reports/s3-prefix-review-packet-2026-10-06.md b/docs/plans/artifact-acquisition/reports/s3-prefix-review-packet-2026-10-06.md deleted file mode 100644 index 54063b682..000000000 --- a/docs/plans/artifact-acquisition/reports/s3-prefix-review-packet-2026-10-06.md +++ /dev/null @@ -1,85 +0,0 @@ -# Parent draft PR packet: bounded S3 prefix enumeration - -Status: locally qualified source checkpoint; hosted/provider/platform gates open. Parent must -coordinate before any PR mutation. No external reviewer has been contacted. - -Suggested title: Add bounded explicit S3 prefix enumeration - -Base: `7cf17383001d582056ac4299803c83d0f9ae68a7`, tree -`046771b37c9a9f563936376539301b3225b48656`. -Branch: `feat/s3-prefix-main95`. Attribution prerequisite: -`a39121b4cc7667f901959497f71368179341cfd1`, tree -`35e24f3265b6064d16516493378e89f695609a4b`. -Source checkpoint: `253cc3d17aeae04f4df996133e0f7f4745e03a71`, tree -`1bf9e7614f8cfb9850f62399a0cd8f839db500d3`, committed and nonforce pushed. -Review comparison: `7cf17383001d582056ac4299803c83d0f9ae68a7..253cc3d17aeae04f4df996133e0f7f4745e03a71`. -Subsequent evidence-only commits do not change that source tree's Rust bytes. - -## Proposed description - -Callers can explicitly enumerate a raw S3 prefix with positive page, object and -XML budgets. Complete pagination is checked against the maintained SDK and the -reviewed XML agreement guard; every listed object then requires a matching -conditional HEAD with immutable VersionId. Errors and exhausted budgets return -no successful partial selection. Listing is discovery, not an atomic package. -Caller-selected paths and trusted digests still enter the existing manifest and -verified acquisition/import owner. - -The additive API exports `S3PrefixLimits`, `S3PrefixError`, `S3PrefixListing`, -`S3PrefixObject` and `S3Reader::enumerate_prefix`. Config, existing constructors -and `S3ReaderError` remain compatible. One SDK owner preserves explicit in-memory -credentials, endpoint/TLS/proxy/redirect constraints, diagnostic redaction, -reader timeout and unchanged transfer/receipt identity policy. No ambient -credentials, hidden transport owner, arbitrary timeout or runtime download. - -The same branch includes explicit S3 release attribution and 33 dependency graph -checks preserving the approved dynamic ONNX/no-build-download contract. Default -attribution remains 365 entries; S3 attribution is 415 with optional roxmltree. -Frozen manifest/native watcher/importer/recovery/ONNX sources are unchanged. - -## Validation and open gates - -Focused prefix checks pass 28 S3 units and 66 S3 integrations, including signing, -session tokens, anonymous compatibility, pagination refusal, cancellation, -TRACE redaction, prefix-to-import and exact cold receipts. Node attribution and -release-contract tests pass 19; graph/ownership/format/attribution checks pass. -The final shared test-fixture cleanup passes strict core Clippy with -`--all-targets -- -D warnings` and the 28-test focused unit rerun. -Production RPC compilation and 302 RPC tests passed before prefix implementation; -post-prefix production RPC Clippy passes with the inherited dead-code -allowance; post-prefix exact default-plus-S3 RPC suite now passes 324 tests with -12 existing ignores (302 unit, 20 integration, 2 intent integration). Hosted CI, actual provider acceptance, -platform/runtime/inference and desktop/accessibility are separate pending gates. -No provider account credentials have been used or provisioned. - -Evidence: `/workspace/scratch/s3-prefix-main95/`; intermediate failures are -retained. See [qualification](s3-prefix-enumeration-2026-10-06.md) for scope, -check logs and limitations. Next planned work: Q3 actual-provider acceptance, -then Q4; do not silently close either gate. - - -Final attempt: post-prefix RPC suite is blocked before execution by link SIGBUS -with zero filesystem headroom. Failure evidence is `prefix-rpc-final-tests.log`; -no RPC result is claimed. Restore build-cache link headroom and rerun the exact -command in the qualification report. The service limit was not observed; this -checkpoint records the concrete filesystem blocker. - - -Recovery is complete: owner-authorized retirement of four inactive reproducible -integration-test executables freed 2.23 GB. The unchanged exact RPC command -passed with 324 tests and 12 existing ignores in `prefix-rpc-recovery-tests.log`. -The original failure log and cache-removal hashes are preserved. No source, -assertion or production dependency changed. The earlier blocker entry is -historical. The source comparison remains 7cf17383..253cc3d1; later commits only -add qualification evidence. Parent can publish the draft after coordinating its -base/head; hosted review/CI, MinIO/AWS/non-AWS and Q4 remain separate open gates. - - -Independent-review repair: listing XML byte exhaustion now preserves a private -typed cause through SDK transport and maps to Incomplete, including valid page -and remaining-total one-over boundaries. Malformed XML remains protocol error. -Final repaired S3 units pass 30; all 66 integrations, core/production RPC Clippy -and 324 RPC cases pass, with existing ignores unchanged. No API shape/dependency -change. Separate Ruff0.15.2 formatting commit 6f260de6 preserves both changed -Python ASTs; the unchanged installed harness baseline formatting issue remains. -See [repair qualification](s3-prefix-budget-review-repair-2026-10-06.md). diff --git a/docs/plans/artifact-acquisition/reports/s3-preflight-expectation-repair-2026-10-09.md b/docs/plans/artifact-acquisition/reports/s3-preflight-expectation-repair-2026-10-09.md deleted file mode 100644 index 97f3a07fa..000000000 --- a/docs/plans/artifact-acquisition/reports/s3-preflight-expectation-repair-2026-10-09.md +++ /dev/null @@ -1,75 +0,0 @@ -# S3 preflight expectation repair — 2026-10-09 - -This follow-up starts from frozen authored-bundle RPC commit -`c6069ce9104c92cc4c31bf477256b69b67b2e302`, whose exact native parent is -`766f4784b97cde38dac897985a41c21eb4b1a5b9`. It changes tests and this report only. -Production transport, shared package qualification, publication, custody and -custom-code policy are unchanged. Main and version files are unchanged. - -## Demonstrated cause - -The older `source_bundle_structural_preflight_refuses_entire_set_before_admission` -asserted that selecting `config/run.py` must be rejected at transport admission. -Fresh exact-parent compilation with diagnostic-only test instrumentation, and -current candidate instrumentation, both identify that exact stale table row. -Removing that row alone makes the exact-parent test pass, including all remaining -structural refusals. The original failed logs are preserved verbatim with hashes. - -Commit `bb8a8956895f4ccf9d04a615f3482bdf8b17c6d5` intentionally removed the -auxiliary extension whitelist from `S3BundleImportParams::validate` as part of the -format-independent public bridge. Byte selection must not assign model semantics. -This is an obsolete test expectation, not a fixture configuration issue or a -production transport regression. - -The full current S3/RPC run found a second copy of the same obsolete expectation: -`source_bundle_rpc_https_complete_pins_totals_cancellation_and_redaction` expected -`run.py` to return InvalidParams before transfer. Running its owned TLS child -directly exposed the exact assertion (null error code versus `-32602`). Both -obsolete Python-path rejection rows are now removed. All other namespace, -reserved-destination, pin and hash rejection cases remain, with better diagnostics. -A focused admission test checks that root/nested Python, a safetensors shard and -unknown bytes preserve their selected paths without granting model qualification. - -The shared importer still refuses Python package members (`AUXILIARIES` excludes -`py`) and custom-code `auto_map` documents. The production authored-bundle suite -checks verified custom-code bytes retain a consumer receipt but produce no model. -Downloading or admitting selected bytes does not authorize their execution. - -## Qualification and ownership - -Detailed commands, counts and failures are in the accompanying local/Library -source-and-evidence packet. Cargo runs use official cached dependencies, -`--offline --locked`, `ORT_SKIP_DOWNLOAD=1`, isolated owned XDG configuration/cache, -a rejecting proxy for non-loopback traffic and serial test execution. No provider -campaign, inference, release, version change or main modification is performed. -The exact-parent diagnostic worktree is restored clean after qualification. - -The full S3-enabled RPC run completes with 247 passed, three failed and thirteen -ignored tests (including 226 passed/three failed/one ignored unit tests). All five -integration targets pass, including the actual 32 authored-bundle and 18 -single-object production-process cases. Native S3 integration has 82 passed and -one ignored test; the ignored sharded cohort requires its separate HTTPS -controller. The native S3 unit set (`--lib s3`) has 46 passed and two ignored -child fixtures that their parent tests execute separately. The full no-S3 RPC -profile has 233 passed and twelve ignored tests. All 20 desktop S3 -contract/transport checks pass. - -The three RPC failures reach the physical-store ownership gate during cold -reopen. The single import and prefix-discovery tests visibly retain old library -and acquisition clones. The persisted-inspection test reaches the same gate -without those explicit clones before its first reopen; its exact retained owner -has not been localized here. Do not classify that third failure as a proven -fixture-only issue or claim a production ownership fix. Main owns the pending -runtime/cold-reopen work, and those test sections remain untouched. Their exact -errors are preserved. This follow-up does not claim the entire S3/RPC suite is -green or relax the physical lifetime lock. - -## Integration - -Apply this narrow follow-up after the frozen `c6069ce9` authored-bundle source. -When composing with main's pending combined integration, preserve main's -cold-reopen fixture edits and apply only the preflight table correction, positive -admission test and diagnostic hunks in `s3_imports/tests.rs`. Do not replace that -whole file. This follow-up changes no schema or generated client. Retain the -previous requirement to regenerate both combined clients once after composing -the main and authored-bundle schemas, then rerun the full S3/RPC suite. diff --git a/docs/plans/artifact-acquisition/reports/s3-publication-proof-repair-2026-10-05.md b/docs/plans/artifact-acquisition/reports/s3-publication-proof-repair-2026-10-05.md deleted file mode 100644 index 9f49fd598..000000000 --- a/docs/plans/artifact-acquisition/reports/s3-publication-proof-repair-2026-10-05.md +++ /dev/null @@ -1,74 +0,0 @@ -# Acquired output publication-identity proof repair - -Separate branch `fix/acquisition-publication-proof-772294c1` over frozen file-set -candidate `772294c1c3d1ea29552a33c81cff0ad3c040baf1`. Reconciliation ea1c4ae7, -dispatch e1ee893f and accepted reader histories are preserved. Accepted main `73fec2e06c75ddae8c0e58be6ffcf352923376bd` is now verified locally: -tree `b449f2c88d3e34a9cfa16dd14c778d6b802c8495`, ordered parents -`96c2dca97fad673a2735f9f778013067569fe692` and -`e1ee893ff67752bdc839a067f15519f25a323c1a`. A direct SHA fetch initially failed -authentication. The subsequent normal repair push and branch fetch succeeded -through existing access, without any credential/settings change. The exact -accepted-main merge identity is preserved in this repair composition. The merge -initially reproduced the frozen repair tree exactly; only these documentation -updates were added, with no runtime source or test change. - -## Demonstrated defect and bounded owner repair - -Independent review identified that acquired output reconciliation reused legacy -readiness helpers. Those helpers intentionally return true when canonical/indexed -metadata lacks `import_publication`. Equality of two absent/null projections passed; -the held receipt helper then returned before Confirmed state, physical root identity -and payload verification. A matching version-2 acquisition binding alone could -therefore adopt changed or missing output. Prior positive test counts are accurate, -but their acquired-output proof claim was incomplete and is superseded here. - -Actual runtime reproduction on unchanged 772294c1 production, with the exact -new single-file fixture patch, failed `identity-bytes unexpectedly settled`: -both publication identities were removed, the original matching v2 acquisition -receipt was retained, and same-length model bytes were changed after confirmed -publication. The initial build never reached runtime because the linker terminated -with SIGBUS under disk pressure. After retiring only known completed task metadata, -the rerun reached runtime and reproduced the incorrect settlement. Both logs and -exact pre-repair test-only patch/SHA accompany handoff. No expected test failure -is reported as a passed check. - -The acquired-only reconciler now requires a canonical nonmissing publication -identity and explicitly matching indexed field before it may reach the held -Confirmed/root/payload proof. Missing and explicit null refuse, including canonical- -only and index-only loss. The generic legacy readiness and held receipt helpers -remain byte-for-byte unchanged. No output/acquisition format version, migration, -publication writer, worker/retry owner, cleanup or task-lifecycle change occurs. -Uncertain output remains retained; only the existing acquisition consumer may -settle a proven exact generation. The same observer protects single GGUF and -complete GGUF-plus-auxiliary bundles. - -## Qualification and limits - -Cold controls mutate disposable evidence after completed publication and before -fresh same-process owner construction. Canonical/indexed projections are set -explicitly after startup when needed; refusal is compared against post-startup -baselines. Missing/null identities with changed or missing primary payload, -canonical-only loss, index-only loss and missing/null bundle identities with -changed auxiliary bytes must return typed recovery-required, retain the original -Using row and exact acquisition/store/input/output/metadata/index evidence, and -make no source replay. Successful bound single/bundle cold controls remain in the -same focused target. Ordinary version-1 copied output is unchanged; an explicit legacy primary/index -projection without identity or receipt remains Ready through a cold read-only -selector. Two added legacy-control runs each had 32 passes/one fixture failure: -the first omitted the cached index projection, and post-startup index mutation -still left the effective metadata cache. The fixture now establishes both legacy -primary/index projections before cold startup, without changing production legacy -behavior. Both intermediate failed logs are retained. - -Final local qualification passes 33 acquisition/import tests plus 11 reader and -five HTTP cases (49 focused runtime tests), strict enabled-S3 all-target Clippy, -actual headless compile, 12 feature contracts, canonical attribution/dependency -ownership, formatting and 20 release/workflow tests. Exact command results are -recorded with handoff. Locked/offline Linux x86_64, -Rust 1.92, existing shared target, jobs=1, task-local XDG config and package-local -profile overrides fit constrained storage. Only identified completed/failed task -outputs are retired with size/SHA journals; unrelated work and targets remain. -No full/default ONNX suite, hard SIGKILL/power loss, deployed migration, -cross-platform/native execution, live providers/credentials, inference or -application source workflow is claimed. Hosted acceptance and independent review -of the repair remain coordinator-owned. AQ-S3 remains not ready. diff --git a/docs/plans/artifact-acquisition/reports/s3-reader-license-inventory.json b/docs/plans/artifact-acquisition/reports/s3-reader-license-inventory.json deleted file mode 100644 index 33868fd51..000000000 --- a/docs/plans/artifact-acquisition/reports/s3-reader-license-inventory.json +++ /dev/null @@ -1,5022 +0,0 @@ -{ - "schema_version": 1, - "scope": "Optional s3 normal/build dependency closure; target graphs only, not cross-platform compilation or distribution qualification", - "commands": [ - [ - "cargo", - "tree", - "--locked", - "--offline", - "--manifest-path", - "rust/Cargo.toml", - "-p", - "pumas-library", - "--target", - "x86_64-unknown-linux-gnu", - "--edges", - "normal,build", - "--prefix", - "none", - "--format", - "{p}", - "--no-default-features", - "--features", - "s3" - ], - [ - "cargo", - "tree", - "--locked", - "--offline", - "--manifest-path", - "rust/Cargo.toml", - "-p", - "pumas-library", - "--target", - "aarch64-apple-darwin", - "--edges", - "normal,build", - "--prefix", - "none", - "--format", - "{p}", - "--no-default-features", - "--features", - "s3" - ], - [ - "cargo", - "tree", - "--locked", - "--offline", - "--manifest-path", - "rust/Cargo.toml", - "-p", - "pumas-library", - "--target", - "x86_64-pc-windows-msvc", - "--edges", - "normal,build", - "--prefix", - "none", - "--format", - "{p}", - "--no-default-features", - "--features", - "s3" - ] - ], - "default_headless_isolation": [ - { - "target": "x86_64-unknown-linux-gnu", - "mode": "default", - "object_store_present": false - }, - { - "target": "x86_64-unknown-linux-gnu", - "mode": "headless", - "object_store_present": false - }, - { - "target": "aarch64-apple-darwin", - "mode": "default", - "object_store_present": false - }, - { - "target": "aarch64-apple-darwin", - "mode": "headless", - "object_store_present": false - }, - { - "target": "x86_64-pc-windows-msvc", - "mode": "default", - "object_store_present": false - }, - { - "target": "x86_64-pc-windows-msvc", - "mode": "headless", - "object_store_present": false - } - ], - "packages": [ - { - "name": "adler2", - "version": "2.0.1", - "license_declared": "0BSD OR MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-0BSD", - "sha256": "861399f8c21c042b110517e76dc6b63a2b334276c8cf17412fc3c8908ca8dc17" - }, - { - "path": "LICENSE-APACHE", - "sha256": "8ada45cd9f843acf64e4722ae262c622a2b3b3007c7310ef36ac1061a30f6adb" - }, - { - "path": "LICENSE-MIT", - "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" - } - ] - }, - { - "name": "ahash", - "version": "0.8.12", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "0444c6991eead6822f7b9102e654448d51624431119546492e8b231db42c48bb" - } - ] - }, - { - "name": "aho-corasick", - "version": "1.1.4", - "license_declared": "Unlicense OR MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "COPYING", - "sha256": "01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f" - }, - { - "path": "LICENSE-MIT", - "sha256": "0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f" - }, - { - "path": "UNLICENSE", - "sha256": "7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c" - } - ] - }, - { - "name": "ambient-authority", - "version": "0.0.2", - "license_declared": "Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "e9d4ee0d472d1cd2e28c97dfa124b3d8d992e10eb0a035f33f5d12e3a177ba3b", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "COPYRIGHT", - "sha256": "d00d6d48df2db6f91e4ca9c656e5e30782d5becf52bb3e5bfd0aff467bd37781" - }, - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-Apache-2.0_WITH_LLVM-exception", - "sha256": "268872b9816f90fd8e85db5a28d33f8150ebb8dd016653fb39ef1f94f2686bc5" - }, - { - "path": "LICENSE-MIT", - "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" - } - ] - }, - { - "name": "anyhow", - "version": "1.0.103", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a" - }, - { - "path": "LICENSE-MIT", - "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" - } - ] - }, - { - "name": "arrayref", - "version": "0.3.9", - "license_declared": "BSD-2-Clause", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "1bc7e6f475b3ec99b7e2643411950ae2368c250dd4c5c325f80f9811362a94a1" - } - ] - }, - { - "name": "arrayvec", - "version": "0.7.6", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "4da95ec4ecb65b738d470b7d762894ad9c97da93e6cbfb18b570fc2c96f4b871" - } - ] - }, - { - "name": "async-trait", - "version": "0.1.89", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a" - }, - { - "path": "LICENSE-MIT", - "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" - } - ] - }, - { - "name": "atomic-waker", - "version": "1.1.2", - "license_declared": "Apache-2.0 OR MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" - }, - { - "path": "LICENSE-THIRD-PARTY", - "sha256": "6226d0632e2e1a80c23597e964da9812ae193c535fe058154afb034e94167aa5" - } - ] - }, - { - "name": "autocfg", - "version": "1.5.0", - "license_declared": "Apache-2.0 OR MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "27995d58ad5c1145c1a8cd86244ce844886958a35eb2b78c6b772748669999ac" - } - ] - }, - { - "name": "base64", - "version": "0.22.1", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "0dd882e53de11566d50f8e8e2d5a651bcf3fabee4987d70f306233cf39094ba7" - } - ] - }, - { - "name": "bitflags", - "version": "1.3.2", - "license_declared": "MIT/Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb" - } - ] - }, - { - "name": "bitflags", - "version": "2.10.0", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb" - } - ] - }, - { - "name": "blake3", - "version": "1.8.3", - "license_declared": "CC0-1.0 OR Apache-2.0 OR Apache-2.0 WITH LLVM-exception", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "2468ef7d57b3fb7e16b576e8377cdbde2320c60e1491e961d11da40fc4f02a2d", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE_A2", - "sha256": "00fcc7a934ddbc9ece2a7cc063ac788e284b703b1d705ccbba72d462aa97921e" - }, - { - "path": "LICENSE_A2LLVM", - "sha256": "a5695f57ea0c221e0e8b7d784ff774c35e88c3d3270353646a925880bb3492cc" - }, - { - "path": "LICENSE_CC0", - "sha256": "a2010f343487d3f7618affe54f789f5487602331c0a8d03f49e9a7c547cf0499" - } - ] - }, - { - "name": "block-buffer", - "version": "0.10.4", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" - }, - { - "path": "LICENSE-MIT", - "sha256": "d5c22aa3118d240e877ad41c5d9fa232f9c77d757d4aac0c2f943afc0a95e0ef" - } - ] - }, - { - "name": "block2", - "version": "0.6.2", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "block2-LICENSE", - "sha256": "7f976f7e9cb2d87df7230606feb932c3f21ac0e664045a775b600046ff850c54" - } - ] - }, - { - "name": "bytes", - "version": "1.11.1", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "45f522cacecb1023856e46df79ca625dfc550c94910078bd8aec6e02880b3d42" - } - ] - }, - { - "name": "cap-primitives", - "version": "4.0.3", - "license_declared": "Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "8b5f74729fd2f44701d1a8eb47e906cdb3ccd9ec0f02baad85a744b791940b18", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "COPYRIGHT", - "sha256": "a8799c2a07dabcb8d52481f885c5ab7000acb8a4d3cd9503fbcb97c84d350e65" - }, - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-Apache-2.0_WITH_LLVM-exception", - "sha256": "268872b9816f90fd8e85db5a28d33f8150ebb8dd016653fb39ef1f94f2686bc5" - }, - { - "path": "LICENSE-MIT", - "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" - } - ] - }, - { - "name": "cap-std", - "version": "4.0.3", - "license_declared": "Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "c1ec78e242cfa2cfe276807ac2ecc00315a6c97786977414bcd1c3963b6c91b8", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "COPYRIGHT", - "sha256": "6b1691fdee3b03c3946696a7be125fcf50eff310b9486fac850c1b8aea91478b" - }, - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-Apache-2.0_WITH_LLVM-exception", - "sha256": "268872b9816f90fd8e85db5a28d33f8150ebb8dd016653fb39ef1f94f2686bc5" - }, - { - "path": "LICENSE-MIT", - "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" - } - ] - }, - { - "name": "cc", - "version": "1.2.53", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "755d2fce177175ffca841e9a06afdb2c4ab0f593d53b4dee48147dfaade85932", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397" - } - ] - }, - { - "name": "cfg-if", - "version": "1.0.4", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397" - } - ] - }, - { - "name": "cfg_aliases", - "version": "0.2.1", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "31b94860253d8ec7b4529f51901044d3b459d6292d996504a36b1bae3a36a812" - } - ] - }, - { - "name": "chrono", - "version": "0.4.43", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE.txt", - "sha256": "946c9835d8034d24404f8cfec5f4654cee5dad17e944afc3d06d742cf2882831" - } - ] - }, - { - "name": "constant_time_eq", - "version": "0.4.2", - "license_declared": "CC0-1.0 OR MIT-0 OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a" - }, - { - "path": "LICENSE-CC0", - "sha256": "a2010f343487d3f7618affe54f789f5487602331c0a8d03f49e9a7c547cf0499" - }, - { - "path": "LICENSE-MIT0", - "sha256": "9a3aeb3f63659c4c6302d315e1d98784d1e8559858a47ff9562e091bb922d28d" - } - ] - }, - { - "name": "core-foundation", - "version": "0.10.1", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6", - "notice_inventory": "s3-reader-third-party-notices.txt", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "62065228e42caebca7e7d7db1204cbb867033de5982ca4009928915e4095f3a3" - } - ] - }, - { - "name": "core-foundation", - "version": "0.9.4", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "62065228e42caebca7e7d7db1204cbb867033de5982ca4009928915e4095f3a3" - } - ] - }, - { - "name": "core-foundation-sys", - "version": "0.8.7", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "62065228e42caebca7e7d7db1204cbb867033de5982ca4009928915e4095f3a3" - } - ] - }, - { - "name": "cpufeatures", - "version": "0.2.17", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" - }, - { - "path": "LICENSE-MIT", - "sha256": "ae9baa7beea910273c2f384c2a6b721fb7bd02bda3436074a1072e4ee689f985" - } - ] - }, - { - "name": "crc32fast", - "version": "1.5.0", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "c6596eb7be8581c18be736c846fb9173b69eccf6ef94c5135893ec56bd92ba08" - }, - { - "path": "LICENSE-MIT", - "sha256": "61d383b05b87d78f94d2937e2580cce47226d17823c0430fbcad09596537efcf" - } - ] - }, - { - "name": "crossbeam-channel", - "version": "0.5.15", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "5734ed989dfca1f625b40281ee9f4530f91b2411ec01cb748223e7eb87e201ab" - }, - { - "path": "LICENSE-THIRD-PARTY", - "sha256": "b16db96b93b1d7cf7bea533f572091ec6bca3234fbe0a83038be772ff391a44c" - } - ] - }, - { - "name": "crossbeam-deque", - "version": "0.8.6", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "5734ed989dfca1f625b40281ee9f4530f91b2411ec01cb748223e7eb87e201ab" - } - ] - }, - { - "name": "crossbeam-epoch", - "version": "0.9.20", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "5734ed989dfca1f625b40281ee9f4530f91b2411ec01cb748223e7eb87e201ab" - } - ] - }, - { - "name": "crossbeam-utils", - "version": "0.8.21", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "5734ed989dfca1f625b40281ee9f4530f91b2411ec01cb748223e7eb87e201ab" - } - ] - }, - { - "name": "crypto-common", - "version": "0.1.7", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" - }, - { - "path": "LICENSE-MIT", - "sha256": "3521672491a3479422d5fe1aca6645dd2984090f85da6e5205abfb18fb7a6897" - } - ] - }, - { - "name": "ctrlc", - "version": "3.5.1", - "license_declared": "MIT/Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "73736a89c4aff73035ba2ed2e565061954da00d4970fc9ac25dcc85a2a20d790", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "3481c338b8e2760b5a58e129339501c01e640f7597767f91d1a84e25e68fbdb4" - }, - { - "path": "LICENSE-MIT", - "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" - } - ] - }, - { - "name": "dashmap", - "version": "5.5.3", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "16692e8cee4aa06e3913787497eba2d47c42002014136f5da67be6ee640e28a3" - } - ] - }, - { - "name": "dashmap", - "version": "6.1.0", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "16692e8cee4aa06e3913787497eba2d47c42002014136f5da67be6ee640e28a3" - } - ] - }, - { - "name": "digest", - "version": "0.10.7", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" - }, - { - "path": "LICENSE-MIT", - "sha256": "9e0dfd2dd4173a530e238cb6adb37aa78c34c6bc7444e0e10c1ab5d8881f63ba" - } - ] - }, - { - "name": "dirs", - "version": "5.0.1", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "d3174ad63e721d4c9dccb8ad4320848992d314369bc46319720b5802c9153fe9" - }, - { - "path": "LICENSE-MIT", - "sha256": "6a2e0ade09a7d5f816f11566fee2b151b32235a7fad52b41d49cce96f833c1a9" - } - ] - }, - { - "name": "dirs-sys", - "version": "0.4.1", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "d3174ad63e721d4c9dccb8ad4320848992d314369bc46319720b5802c9153fe9" - }, - { - "path": "LICENSE-MIT", - "sha256": "6a2e0ade09a7d5f816f11566fee2b151b32235a7fad52b41d49cce96f833c1a9" - } - ] - }, - { - "name": "dispatch2", - "version": "0.3.0", - "license_declared": "Zlib OR Apache-2.0 OR MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "dispatch2-LICENSE", - "sha256": "7f976f7e9cb2d87df7230606feb932c3f21ac0e664045a775b600046ff850c54" - } - ] - }, - { - "name": "displaydoc", - "version": "0.2.5", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" - } - ] - }, - { - "name": "either", - "version": "1.15.0", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "7576269ea71f767b99297934c0b2367532690f8c4badc695edf8e04ab6a1e545" - } - ] - }, - { - "name": "encoding_rs", - "version": "0.8.35", - "license_declared": "(Apache-2.0 OR MIT) AND BSD-3-Clause", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "COPYRIGHT", - "sha256": "11789f45bb180841cd362a5eee6789c68ddb573a11105e30768c308a6add0190" - }, - { - "path": "LICENSE-APACHE", - "sha256": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30" - }, - { - "path": "LICENSE-MIT", - "sha256": "3fa4ca83dcc9237839b1bdeb2e6d16bdfb5ec0c5ce42b24694d8bbf0dcbef72c" - }, - { - "path": "LICENSE-WHATWG", - "sha256": "838118388fe5c2e7f1dbbaeed13e1c7f3ebf88be91319c7c1d77c18e987d1a50" - } - ] - }, - { - "name": "equivalent", - "version": "1.0.2", - "license_declared": "Apache-2.0 OR MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "7365cc8878a1d7ce155a58c4ca09c3d7a6be413efa5334a80ea842912b669349" - } - ] - }, - { - "name": "errno", - "version": "0.3.14", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "8764a597675778ddfd4e25f81b08a05dbcf089ac05662df7613fe67f150e3aa2" - } - ] - }, - { - "name": "fallible-iterator", - "version": "0.3.0", - "license_declared": "MIT/Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "c6596eb7be8581c18be736c846fb9173b69eccf6ef94c5135893ec56bd92ba08" - }, - { - "path": "LICENSE-MIT", - "sha256": "0816e154b159ba255c563f7c8c7df5bbb8cc5fc96f5ab8cf9f4743b4f41fe7eb" - } - ] - }, - { - "name": "fallible-streaming-iterator", - "version": "0.1.9", - "license_declared": "MIT/Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "c6596eb7be8581c18be736c846fb9173b69eccf6ef94c5135893ec56bd92ba08" - }, - { - "path": "LICENSE-MIT", - "sha256": "8dcec5569a9be5b0e086c80faed6f1aefa670af0ec29cecc2f714303096887e0" - } - ] - }, - { - "name": "fastrand", - "version": "2.3.0", - "license_declared": "Apache-2.0 OR MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" - } - ] - }, - { - "name": "filetime", - "version": "0.2.27", - "license_declared": "MIT/Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "f98844151eee8917efc50bd9e8318cb963ae8b297431495d3f758616ea5c57db", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397" - } - ] - }, - { - "name": "find-msvc-tools", - "version": "0.1.8", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "8591b0bcc8a98a64310a2fae1bb3e9b8564dd10e381e6e28010fde8e8e8568db", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397" - } - ] - }, - { - "name": "flate2", - "version": "1.1.8", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "b375d6465b98090a5f25b1c7703f3859783755aa9a80433b36e0379a3ec2f369", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "75d3bf11a47fed60aee0a6cc56a97b896b470ee8fb52d6cd553bd8348337f422" - } - ] - }, - { - "name": "fnv", - "version": "1.0.7", - "license_declared": "Apache-2.0 / MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "65fdb6c76cd61612070c066eec9ecdb30ee74fb27859d0d9af58b9f499fd0c3e" - } - ] - }, - { - "name": "foreign-types", - "version": "0.3.2", - "license_declared": "MIT/Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "c6596eb7be8581c18be736c846fb9173b69eccf6ef94c5135893ec56bd92ba08" - }, - { - "path": "LICENSE-MIT", - "sha256": "333ea3aaa3cadb819f4acd9f9153f9feee060a995ca8710f32bc5bd9a4b91734" - } - ] - }, - { - "name": "foreign-types-shared", - "version": "0.1.1", - "license_declared": "MIT/Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "c6596eb7be8581c18be736c846fb9173b69eccf6ef94c5135893ec56bd92ba08" - }, - { - "path": "LICENSE-MIT", - "sha256": "333ea3aaa3cadb819f4acd9f9153f9feee060a995ca8710f32bc5bd9a4b91734" - } - ] - }, - { - "name": "form_urlencoded", - "version": "1.2.2", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "20c7855c364d57ea4c97889a5e8d98470a9952dade37bd9248b9a54431670e5e" - } - ] - }, - { - "name": "fs-set-times", - "version": "0.20.3", - "license_declared": "Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "94e7099f6313ecacbe1256e8ff9d617b75d1bcb16a6fddef94866d225a01a14a", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "COPYRIGHT", - "sha256": "e196ffeb5ab101e9ec8bbe395c9f367c5380ee2d28c47e5c03371523798a9af7" - }, - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-Apache-2.0_WITH_LLVM-exception", - "sha256": "268872b9816f90fd8e85db5a28d33f8150ebb8dd016653fb39ef1f94f2686bc5" - }, - { - "path": "LICENSE-MIT", - "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" - } - ] - }, - { - "name": "fs2", - "version": "0.4.3", - "license_declared": "MIT/Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "7b63ecd5f1902af1b63729947373683c32745c16a10e8e6292e2e2dcd7e90ae0" - } - ] - }, - { - "name": "fsevent-sys", - "version": "4.1.0", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "c4d64f0ce17c85d4a14e22d224fbbd76dbb1e03eb38f0d3c209fb38bdc8dc646" - } - ] - }, - { - "name": "futures", - "version": "0.3.31", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "275c491d6d1160553c32fd6127061d7f9606c3ea25abfad6ca3f6ed088785427" - }, - { - "path": "LICENSE-MIT", - "sha256": "6652c868f35dfe5e8ef636810a4e576b9d663f3a17fb0f5613ad73583e1b88fd" - } - ] - }, - { - "name": "futures-channel", - "version": "0.3.31", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "275c491d6d1160553c32fd6127061d7f9606c3ea25abfad6ca3f6ed088785427" - }, - { - "path": "LICENSE-MIT", - "sha256": "6652c868f35dfe5e8ef636810a4e576b9d663f3a17fb0f5613ad73583e1b88fd" - } - ] - }, - { - "name": "futures-core", - "version": "0.3.31", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "275c491d6d1160553c32fd6127061d7f9606c3ea25abfad6ca3f6ed088785427" - }, - { - "path": "LICENSE-MIT", - "sha256": "6652c868f35dfe5e8ef636810a4e576b9d663f3a17fb0f5613ad73583e1b88fd" - } - ] - }, - { - "name": "futures-executor", - "version": "0.3.31", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "275c491d6d1160553c32fd6127061d7f9606c3ea25abfad6ca3f6ed088785427" - }, - { - "path": "LICENSE-MIT", - "sha256": "6652c868f35dfe5e8ef636810a4e576b9d663f3a17fb0f5613ad73583e1b88fd" - } - ] - }, - { - "name": "futures-io", - "version": "0.3.31", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "275c491d6d1160553c32fd6127061d7f9606c3ea25abfad6ca3f6ed088785427" - }, - { - "path": "LICENSE-MIT", - "sha256": "6652c868f35dfe5e8ef636810a4e576b9d663f3a17fb0f5613ad73583e1b88fd" - } - ] - }, - { - "name": "futures-macro", - "version": "0.3.31", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "275c491d6d1160553c32fd6127061d7f9606c3ea25abfad6ca3f6ed088785427" - }, - { - "path": "LICENSE-MIT", - "sha256": "6652c868f35dfe5e8ef636810a4e576b9d663f3a17fb0f5613ad73583e1b88fd" - } - ] - }, - { - "name": "futures-sink", - "version": "0.3.31", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "275c491d6d1160553c32fd6127061d7f9606c3ea25abfad6ca3f6ed088785427" - }, - { - "path": "LICENSE-MIT", - "sha256": "6652c868f35dfe5e8ef636810a4e576b9d663f3a17fb0f5613ad73583e1b88fd" - } - ] - }, - { - "name": "futures-task", - "version": "0.3.31", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "275c491d6d1160553c32fd6127061d7f9606c3ea25abfad6ca3f6ed088785427" - }, - { - "path": "LICENSE-MIT", - "sha256": "6652c868f35dfe5e8ef636810a4e576b9d663f3a17fb0f5613ad73583e1b88fd" - } - ] - }, - { - "name": "futures-timer", - "version": "3.0.3", - "license_declared": "MIT/Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397" - } - ] - }, - { - "name": "futures-util", - "version": "0.3.31", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "275c491d6d1160553c32fd6127061d7f9606c3ea25abfad6ca3f6ed088785427" - }, - { - "path": "LICENSE-MIT", - "sha256": "6652c868f35dfe5e8ef636810a4e576b9d663f3a17fb0f5613ad73583e1b88fd" - } - ] - }, - { - "name": "generic-array", - "version": "0.14.7", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "c09aae9d3c77b531f56351a9947bc7446511d6b025b3255312d3e3442a9a7583" - } - ] - }, - { - "name": "getrandom", - "version": "0.2.17", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "aaff376532ea30a0cd5330b9502ad4a4c8bf769c539c87ffe78819d188a18ebf" - }, - { - "path": "LICENSE-MIT", - "sha256": "42fa16951ce7f24b5a467a40e5b449a1d41e662f97ca779864f053f39e097737" - } - ] - }, - { - "name": "getrandom", - "version": "0.3.4", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "aaff376532ea30a0cd5330b9502ad4a4c8bf769c539c87ffe78819d188a18ebf" - }, - { - "path": "LICENSE-MIT", - "sha256": "29e9fe5074bd27e0e5d5d110394fbbcd841baee2651a3c4b4560a632702cede4" - } - ] - }, - { - "name": "governor", - "version": "0.7.0", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "0746aa765db78b521451ef74221663b57ba595bf83f75d0ce23cc09447c8139f", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "governor-LICENSE", - "sha256": "2248fdedb215c73b6431d4c0419c6476c0aa19621fa94041aa7c5a3ce952e5cc" - } - ] - }, - { - "name": "h2", - "version": "0.4.16", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "a9f37a958b41b3b19ee2707c06439c0e9e547e847223eb791ecb0cb821c65e27", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "b21623012e6c453d944b0342c515b631cfcbf30704c2621b291526b69c10724d" - } - ] - }, - { - "name": "hashbrown", - "version": "0.14.5", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "ff8f68cb076caf8cefe7a6430d4ac086ce6af2ca8ce2c4e5a2004d4552ef52a2" - } - ] - }, - { - "name": "hashbrown", - "version": "0.16.1", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "ff8f68cb076caf8cefe7a6430d4ac086ce6af2ca8ce2c4e5a2004d4552ef52a2" - } - ] - }, - { - "name": "hashlink", - "version": "0.9.1", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "c144680885b29e4719e2a51f0aab5439a1e02d980692b5aaf086cae12727f28b" - }, - { - "path": "LICENSE-MIT", - "sha256": "e915669a595b11a200873df8286561881b0e04932f6412a585db6297ba0bc97c" - } - ] - }, - { - "name": "hex", - "version": "0.4.3", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "c6596eb7be8581c18be736c846fb9173b69eccf6ef94c5135893ec56bd92ba08" - }, - { - "path": "LICENSE-MIT", - "sha256": "f7bdb3426d045cd50efd4953026e3eb5a83d0199f458a075602611b9344da5b9" - } - ] - }, - { - "name": "http", - "version": "1.4.0", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "8bb1b50b0e5c9399ae33bd35fab2769010fa6c14e8860c729a52295d84896b7a" - }, - { - "path": "LICENSE-MIT", - "sha256": "dc91f8200e4b2a1f9261035d4c18c33c246911a6c0f7b543d75347e61b249cff" - } - ] - }, - { - "name": "http-body", - "version": "1.0.1", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "cddabf8adc6ccd6c3e68f5d71eac9fae3094116623cf23a46af0a5fd6b8ee813" - } - ] - }, - { - "name": "http-body-util", - "version": "0.1.3", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "b843fb7430efdf9732c834b6814beda44fccf3f0ddf7c9e030b39da17f6b159c" - } - ] - }, - { - "name": "httparse", - "version": "1.10.1", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "391a5396cec6230bfabd4ef4eb2350eb895bc5efce377a2218f5702ed020d3e3" - } - ] - }, - { - "name": "humantime", - "version": "2.4.0", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "15cdd26707701c53297e2fa6afb323d55fbc1d0810c3aec078ae3ef0424c3c15", - "notice_inventory": "s3-reader-third-party-notices.txt", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "c6596eb7be8581c18be736c846fb9173b69eccf6ef94c5135893ec56bd92ba08" - }, - { - "path": "LICENSE-MIT", - "sha256": "f6deca8261a8f4a3403dc74c725c46051157fd36c27cd4b100277eb1f303ad11" - } - ] - }, - { - "name": "hyper", - "version": "1.8.1", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "8f2eee700f56dd8b381d92dc5b136befe09f90e186f2c1c8414a70c4c7534550" - } - ] - }, - { - "name": "hyper-rustls", - "version": "0.27.7", - "license_declared": "Apache-2.0 OR ISC OR MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58", - "notice_inventory": "s3-reader-third-party-notices.txt", - "texts": [ - { - "path": "LICENSE", - "sha256": "d1ef92123fc699442e1e8d971fe84921947efc8d9a1249ab037f1e661a972a6d" - }, - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-ISC", - "sha256": "7cfafc877eccc46c0e346ccbaa5c51bb6b894d2b818e617d970211e232785ad4" - }, - { - "path": "LICENSE-MIT", - "sha256": "709e3175b4212f7b13aa93971c9f62ff8c69ec45ad8c6532a7e0c41d7a7d6f8c" - } - ] - }, - { - "name": "hyper-tls", - "version": "0.6.0", - "license_declared": "MIT/Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "7b033f57f23fffca5bee9406cf453ce31e919c1b867df54bfa7487e73d8c9c1f" - } - ] - }, - { - "name": "hyper-util", - "version": "0.1.19", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "9e0a97848ea543aef745c98e84fde696a9a3e0735538f6daefdd3cb1942effc1" - } - ] - }, - { - "name": "iana-time-zone", - "version": "0.1.64", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "696759d65dfe558ff7d9f031c76db19ec5c0767470fb67c4e8d990820d1e99c9" - }, - { - "path": "LICENSE-MIT", - "sha256": "da28ccc6b158fc2d8cccc74e99794b1cff1d29bd7bbeb019442fcf0c04c6cad9" - } - ] - }, - { - "name": "icu_collections", - "version": "2.1.1", - "license_declared": "Unicode-3.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "f367c1b8e1aa262435251e442901da4607b4650e0e63a026f5044473ecfb90f2" - } - ] - }, - { - "name": "icu_locale_core", - "version": "2.1.1", - "license_declared": "Unicode-3.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "f367c1b8e1aa262435251e442901da4607b4650e0e63a026f5044473ecfb90f2" - } - ] - }, - { - "name": "icu_normalizer", - "version": "2.1.1", - "license_declared": "Unicode-3.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "f367c1b8e1aa262435251e442901da4607b4650e0e63a026f5044473ecfb90f2" - } - ] - }, - { - "name": "icu_normalizer_data", - "version": "2.1.1", - "license_declared": "Unicode-3.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "f367c1b8e1aa262435251e442901da4607b4650e0e63a026f5044473ecfb90f2" - } - ] - }, - { - "name": "icu_properties", - "version": "2.1.2", - "license_declared": "Unicode-3.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "f367c1b8e1aa262435251e442901da4607b4650e0e63a026f5044473ecfb90f2" - } - ] - }, - { - "name": "icu_properties_data", - "version": "2.1.2", - "license_declared": "Unicode-3.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "f367c1b8e1aa262435251e442901da4607b4650e0e63a026f5044473ecfb90f2" - } - ] - }, - { - "name": "icu_provider", - "version": "2.1.1", - "license_declared": "Unicode-3.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "f367c1b8e1aa262435251e442901da4607b4650e0e63a026f5044473ecfb90f2" - } - ] - }, - { - "name": "idna", - "version": "1.1.0", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "b38f11f6096706e6de553dabe2a7ed142d59b6fa8c97e290c67496154745cdd5" - } - ] - }, - { - "name": "idna_adapter", - "version": "1.2.1", - "license_declared": "Apache-2.0 OR MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "8b43ce8accd61e9d370b5ca9e9c4f953279b5c239926c62315b40e24df51b726" - } - ] - }, - { - "name": "indexmap", - "version": "2.13.0", - "license_declared": "Apache-2.0 OR MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "ecc269ef87fd38a1d98e30bfac9ba964a9dbd9315c3770fed98d4d7cb5882055" - } - ] - }, - { - "name": "inotify", - "version": "0.10.2", - "license_declared": "ISC", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "fdd168d97690d0b8c412d6b6c10360277f4d7ee495c5d0d5d5fe0854923255cc", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "7f78b31de4e7a3e2ac8de40e2b409eda313f03637aa62b8416fbde9bdc5ce4c9" - } - ] - }, - { - "name": "inotify-sys", - "version": "0.1.5", - "license_declared": "ISC", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "f68878c9ca61b25d4b2c470de571cb85ce97804a62bb153607f7e0e0d2684c8a" - } - ] - }, - { - "name": "instant", - "version": "0.1.13", - "license_declared": "BSD-3-Clause", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "2510d4cde8c4e13d8c54b9fe2a9d144daf567ec8d02832f1454e7ca2d58cdda6" - } - ] - }, - { - "name": "io-extras", - "version": "0.19.0", - "license_declared": "Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "20fd6de4ccfcc187e38bc21cfa543cb5a302cb86a8b114eb7f0bf0dc9f8ac00f", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "COPYRIGHT", - "sha256": "f0c1d22de8bd3b776a40f2691f08b84e91c7bafc78b72a51150e231002b88db3" - }, - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-Apache-2.0_WITH_LLVM-exception", - "sha256": "268872b9816f90fd8e85db5a28d33f8150ebb8dd016653fb39ef1f94f2686bc5" - }, - { - "path": "LICENSE-MIT", - "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" - } - ] - }, - { - "name": "io-lifetimes", - "version": "2.0.4", - "license_declared": "Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "06432fb54d3be7964ecd3649233cddf80db2832f47fec34c01f65b3d9d774983", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "COPYRIGHT", - "sha256": "495c30b45120f8af07cfa26eb9cb1ebfe8324560dca2b3b1e76cad1b9b6b489a" - }, - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-Apache-2.0_WITH_LLVM-exception", - "sha256": "268872b9816f90fd8e85db5a28d33f8150ebb8dd016653fb39ef1f94f2686bc5" - }, - { - "path": "LICENSE-MIT", - "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" - } - ] - }, - { - "name": "io-lifetimes", - "version": "3.0.1", - "license_declared": "Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "2f0fb0570afe1fed943c5c3d4102d5358592d8625fda6a0007fdbe65a92fba96", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "COPYRIGHT", - "sha256": "495c30b45120f8af07cfa26eb9cb1ebfe8324560dca2b3b1e76cad1b9b6b489a" - }, - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-Apache-2.0_WITH_LLVM-exception", - "sha256": "268872b9816f90fd8e85db5a28d33f8150ebb8dd016653fb39ef1f94f2686bc5" - }, - { - "path": "LICENSE-MIT", - "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" - } - ] - }, - { - "name": "ipnet", - "version": "2.11.0", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "87d9feb9238c6bd8e0024fc4733b06cff036f89f36d93b7df1c8a0549bbb7a5b" - }, - { - "path": "LICENSE-MIT", - "sha256": "47dc9ff29128ddfb4d6a0435383c9f89120bc374dbcc1dd00b933a0b28aa7865" - } - ] - }, - { - "name": "iri-string", - "version": "0.7.10", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE.txt", - "sha256": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30" - }, - { - "path": "LICENSE-MIT.txt", - "sha256": "21ab3c8e9af71d0212606c98a210f71d6a86234b179b3babff0ccc4798b90f33" - } - ] - }, - { - "name": "itertools", - "version": "0.14.0", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "7576269ea71f767b99297934c0b2367532690f8c4badc695edf8e04ab6a1e545" - } - ] - }, - { - "name": "itoa", - "version": "1.0.17", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a" - }, - { - "path": "LICENSE-MIT", - "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" - } - ] - }, - { - "name": "jobserver", - "version": "0.1.34", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397" - } - ] - }, - { - "name": "libc", - "version": "0.2.180", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a" - }, - { - "path": "LICENSE-MIT", - "sha256": "a8d47ff51ca256f56a8932dba07660672dbfe3004257ca8de708aac1415937a1" - } - ] - }, - { - "name": "libsqlite3-sys", - "version": "0.30.1", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "f59ba65550f2a5adff98ec6478d783402c8e0a3eb515025c0b3438f3d30dc39e" - }, - { - "path": "sqlcipher/LICENSE", - "sha256": "ea4fcb309f14a22065e1ea45362d494d320012249ed865fe9c7c0946db754131" - } - ] - }, - { - "name": "linux-raw-sys", - "version": "0.11.0", - "license_declared": "Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "COPYRIGHT", - "sha256": "3290ae0fbc9ddb77d2239121d710f0bb9d31b3b4744e6d97fe01e652b4c1870b" - }, - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-Apache-2.0_WITH_LLVM-exception", - "sha256": "268872b9816f90fd8e85db5a28d33f8150ebb8dd016653fb39ef1f94f2686bc5" - }, - { - "path": "LICENSE-MIT", - "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" - } - ] - }, - { - "name": "litemap", - "version": "0.8.1", - "license_declared": "Unicode-3.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "f367c1b8e1aa262435251e442901da4607b4650e0e63a026f5044473ecfb90f2" - } - ] - }, - { - "name": "lock_api", - "version": "0.4.14", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "c9a75f18b9ab2927829a208fc6aa2cf4e63b8420887ba29cdb265d6619ae82d5" - } - ] - }, - { - "name": "log", - "version": "0.4.29", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb" - } - ] - }, - { - "name": "maybe-owned", - "version": "0.3.4", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "4facc753ae494aeb6e3c22f839b158aebd4f9270f55cd3c79906c45476c47ab4", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "aecc100d0547aa3bcbe04bcf5cb87c7db0be11004602adfa5056edf8bb847b35" - }, - { - "path": "LICENSE-MIT", - "sha256": "ef2b3bbd7b718a7881253226313f103e89b379e1279681a3c1ebcb65a27d209d" - } - ] - }, - { - "name": "md-5", - "version": "0.10.6", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf", - "notice_inventory": "s3-reader-third-party-notices.txt", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" - }, - { - "path": "LICENSE-MIT", - "sha256": "b4eb00df6e2a4d22518fcaa6a2b4646f249b3a3c9814509b22bd2091f1392ff1" - } - ] - }, - { - "name": "memchr", - "version": "2.7.6", - "license_declared": "Unlicense OR MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "COPYING", - "sha256": "01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f" - }, - { - "path": "LICENSE-MIT", - "sha256": "0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f" - }, - { - "path": "UNLICENSE", - "sha256": "7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c" - } - ] - }, - { - "name": "mime", - "version": "0.3.17", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "df9cfd06d8a44d9a671eadd39ffd97f166481da015a30f45dfd27886209c5922" - } - ] - }, - { - "name": "mini-moka", - "version": "0.10.3", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "c325dfab65f261f386debee8b0969da215b3fa0037e74c8a1234db7ba986d803", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "ba89a4b8a10b1efdb962455a59c990a86bbf0aa05fb769a77e4c04bd78238564" - }, - { - "path": "LICENSE-MIT", - "sha256": "2ed395d26a3ffee03fd4172436f8d9e32fe0d96832fdfdf405bac2a6ed6a4040" - } - ] - }, - { - "name": "miniz_oxide", - "version": "0.8.9", - "license_declared": "MIT OR Zlib OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "4108245a1f2df9d4e94df8abed5b4ba0759bb2f9b40a6b939f1be141077ae50b" - }, - { - "path": "LICENSE-APACHE.md", - "sha256": "0d542e0c8804e39aa7f37eb00da5a762149dc682d7829451287e11b938e94594" - }, - { - "path": "LICENSE-MIT.md", - "sha256": "799e9ca9d179295ef372f25d3769cdda7d25bb2668add6a6a1e22d1e4c678b8d" - }, - { - "path": "LICENSE-ZLIB.md", - "sha256": "0a54e647fe54104658b5e563c04c6f9edf251710e47bce692e0bd990a4ddaa39" - } - ] - }, - { - "name": "mio", - "version": "1.1.1", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "07919255c7e04793d8ea760d6c2ce32d19f9ff02bdbdde3ce90b1e1880929a9b" - } - ] - }, - { - "name": "native-tls", - "version": "0.2.14", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "c6596eb7be8581c18be736c846fb9173b69eccf6ef94c5135893ec56bd92ba08" - }, - { - "path": "LICENSE-MIT", - "sha256": "f2ad7982ddbfa8c45eb965315718c55b70b9cc311b49afacb50d5fe84173ae2c" - } - ] - }, - { - "name": "nix", - "version": "0.29.0", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "66e3ee1fa7f909ad3c612d556f2a0cdabcd809ad6e66f3b0605015ac64841b70" - } - ] - }, - { - "name": "nix", - "version": "0.30.1", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "66e3ee1fa7f909ad3c612d556f2a0cdabcd809ad6e66f3b0605015ac64841b70" - } - ] - }, - { - "name": "no-std-compat", - "version": "0.4.1", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "b93853da6d84c2e3c7d730d6473e8817692dd89be387eb01b94d7f108ecb5b8c", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "a82f9dd9371fddd9b1b5ad38f970bcfa4197c0da07b3dfb3f568089edf79f168" - } - ] - }, - { - "name": "nonzero_ext", - "version": "0.3.0", - "license_declared": "Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "38bf9645c8b145698bb0b18a4637dcacbc421ea49bef2317e4fd8065a387cf21", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE.txt", - "sha256": "3b842ae825a82c84830590457664b56d3b45390892bb5a1b73b1468c023a270e" - } - ] - }, - { - "name": "notify", - "version": "7.0.0", - "license_declared": "CC0-1.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "c533b4c39709f9ba5005d8002048266593c1cfaf3c5f0739d5b8ab0c6c504009", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-CC0", - "sha256": "e0456cbab4f7b5e7203e678faff37eadbdfef02e822db3b7a52a1dd9d3dc514a" - } - ] - }, - { - "name": "notify-types", - "version": "1.0.1", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "585d3cb5e12e01aed9e8a1f70d5c6b5e86fe2a6e48fc8cd0b3e0b8df6f6eb174", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "b5b413d7421d728c14f33d78198d6e255a0018beef717d78c4c3f6188be3dfb4" - }, - { - "path": "LICENSE-MIT", - "sha256": "b63e167d61ced1d872a588c5ac764b0dda477d62209dc4f6b6bfea5517d0a24c" - } - ] - }, - { - "name": "ntapi", - "version": "0.4.2", - "license_declared": "Apache-2.0 OR MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "c70f219e21142367c70c0b30c6a9e3a14d55b4d12a204d897fbec83a0363f081", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "cf90d659de5c1e6418267ab8043b756e65508ee5d8d50b29eb2d2fe444c2c3eb" - }, - { - "path": "LICENSE-MIT", - "sha256": "11a7964ccc0dd115d16720ab1d826c5d03e52838748ffaba3d21bae8bcacd82a" - } - ] - }, - { - "name": "num-traits", - "version": "0.2.19", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb" - } - ] - }, - { - "name": "objc2", - "version": "0.6.3", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "objc2-LICENSE", - "sha256": "7f976f7e9cb2d87df7230606feb932c3f21ac0e664045a775b600046ff850c54" - } - ] - }, - { - "name": "objc2-encode", - "version": "4.1.0", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "objc2-encode-LICENSE", - "sha256": "7f976f7e9cb2d87df7230606feb932c3f21ac0e664045a775b600046ff850c54" - } - ] - }, - { - "name": "object_store", - "version": "0.12.4", - "license_declared": "MIT/Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "4c1be0c6c22ec0817cdc77d3842f721a17fd30ab6965001415b5402a74e6b740", - "notice_inventory": "s3-reader-third-party-notices.txt", - "texts": [ - { - "path": "LICENSE.txt", - "sha256": "240b8a39fdfd2bd3b3539c02e34466334884fc84b056b57f06e9da35323ecd97" - }, - { - "path": "NOTICE.txt", - "sha256": "ce50585d0a01fc345ea216f3c4fee8f1c4efcb6d79ef4af9a0af7e6ba78d7204" - } - ] - }, - { - "name": "once_cell", - "version": "1.21.3", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" - } - ] - }, - { - "name": "openssl", - "version": "0.10.75", - "license_declared": "Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "f3d4287b4a21c5176fea2f9bd4ae800696004e2fb8e05cbc818be513f188a941" - }, - { - "path": "LICENSE-APACHE", - "sha256": "c6596eb7be8581c18be736c846fb9173b69eccf6ef94c5135893ec56bd92ba08" - } - ] - }, - { - "name": "openssl-macros", - "version": "0.1.1", - "license_declared": "MIT/Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "c6596eb7be8581c18be736c846fb9173b69eccf6ef94c5135893ec56bd92ba08" - }, - { - "path": "LICENSE-MIT", - "sha256": "ea5ab440900ab271811d5c2dc02a9de6e03a6956ac5727e85c11d76df5883d30" - } - ] - }, - { - "name": "openssl-probe", - "version": "0.1.6", - "license_declared": "MIT/Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397" - } - ] - }, - { - "name": "openssl-probe", - "version": "0.2.1", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe", - "notice_inventory": "s3-reader-third-party-notices.txt", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397" - } - ] - }, - { - "name": "openssl-sys", - "version": "0.9.111", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-MIT", - "sha256": "378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397" - } - ] - }, - { - "name": "option-ext", - "version": "0.2.0", - "license_declared": "MPL-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE.txt", - "sha256": "66a3107d5ad6a058aab753eaac2047ccb2ed0e39465dd0fe5844da3e300d5172" - } - ] - }, - { - "name": "parking_lot", - "version": "0.12.5", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "c9a75f18b9ab2927829a208fc6aa2cf4e63b8420887ba29cdb265d6619ae82d5" - } - ] - }, - { - "name": "parking_lot_core", - "version": "0.9.12", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "c9a75f18b9ab2927829a208fc6aa2cf4e63b8420887ba29cdb265d6619ae82d5" - } - ] - }, - { - "name": "percent-encoding", - "version": "2.3.2", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "b38f11f6096706e6de553dabe2a7ed142d59b6fa8c97e290c67496154745cdd5" - } - ] - }, - { - "name": "pin-project-lite", - "version": "0.2.16", - "license_declared": "Apache-2.0 OR MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "0d542e0c8804e39aa7f37eb00da5a762149dc682d7829451287e11b938e94594" - }, - { - "path": "LICENSE-MIT", - "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" - } - ] - }, - { - "name": "pin-utils", - "version": "0.1.0", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a4db788775cb25f2da419a7ccd3f1f89c3d2cfa8748fb25257596b88183b4c77" - }, - { - "path": "LICENSE-MIT", - "sha256": "28802412d2bfbafe432b305634413b41a984d30fba0df41d30aa2c8a2077c5b1" - } - ] - }, - { - "name": "pkg-config", - "version": "0.3.32", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397" - } - ] - }, - { - "name": "portable-atomic", - "version": "1.13.0", - "license_declared": "Apache-2.0 OR MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "f89776e4d69bb58bc6993e99ffa1d11f228b839984854c7daeb5d37f87cbe950", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "0d542e0c8804e39aa7f37eb00da5a762149dc682d7829451287e11b938e94594" - }, - { - "path": "LICENSE-MIT", - "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" - } - ] - }, - { - "name": "potential_utf", - "version": "0.1.4", - "license_declared": "Unicode-3.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "f367c1b8e1aa262435251e442901da4607b4650e0e63a026f5044473ecfb90f2" - } - ] - }, - { - "name": "ppv-lite86", - "version": "0.2.21", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "0218327e7a480793ffdd4eb792379a9709e5c135c7ba267f709d6f6d4d70af0a" - }, - { - "path": "LICENSE-MIT", - "sha256": "4cada0bd02ea3692eee6f16400d86c6508bbd3bafb2b65fed0419f36d4f83e8f" - } - ] - }, - { - "name": "proc-macro2", - "version": "1.0.105", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a" - }, - { - "path": "LICENSE-MIT", - "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" - } - ] - }, - { - "name": "quanta", - "version": "0.12.6", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "f3ab5a9d756f0d97bdc89019bd2e4ea098cf9cde50ee7564dde6b81ccc8f06c7", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "7bdd587c9ff64c56323455bad7ec590698fbf56c02291c8e515b2afc85306282" - } - ] - }, - { - "name": "quick-xml", - "version": "0.38.4", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c", - "notice_inventory": "s3-reader-third-party-notices.txt", - "texts": [ - { - "path": "LICENSE-MIT.md", - "sha256": "5b2c207dcf571267ebe0bbdd5bf321f561ddc22ff597e7b363e96f4539507a29" - } - ] - }, - { - "name": "quote", - "version": "1.0.43", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a" - }, - { - "path": "LICENSE-MIT", - "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" - } - ] - }, - { - "name": "rand", - "version": "0.8.6", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "COPYRIGHT", - "sha256": "90eb64f0279b0d9432accfa6023ff803bc4965212383697eee27a0f426d5f8d5" - }, - { - "path": "LICENSE-APACHE", - "sha256": "35242e7a83f69875e6edeff02291e688c97caafe2f8902e4e19b49d3e78b4cab" - }, - { - "path": "LICENSE-MIT", - "sha256": "209fbbe0ad52d9235e37badf9cadfe4dbdc87203179c0899e738b39ade42177b" - } - ] - }, - { - "name": "rand", - "version": "0.9.3", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "7ec095654a25171c2124e9e3393a930bddbffdc939556c914957a4c3e0a87166", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "COPYRIGHT", - "sha256": "90eb64f0279b0d9432accfa6023ff803bc4965212383697eee27a0f426d5f8d5" - }, - { - "path": "LICENSE-APACHE", - "sha256": "35242e7a83f69875e6edeff02291e688c97caafe2f8902e4e19b49d3e78b4cab" - }, - { - "path": "LICENSE-MIT", - "sha256": "209fbbe0ad52d9235e37badf9cadfe4dbdc87203179c0899e738b39ade42177b" - } - ] - }, - { - "name": "rand_chacha", - "version": "0.3.1", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "COPYRIGHT", - "sha256": "90eb64f0279b0d9432accfa6023ff803bc4965212383697eee27a0f426d5f8d5" - }, - { - "path": "LICENSE-APACHE", - "sha256": "aaff376532ea30a0cd5330b9502ad4a4c8bf769c539c87ffe78819d188a18ebf" - }, - { - "path": "LICENSE-MIT", - "sha256": "209fbbe0ad52d9235e37badf9cadfe4dbdc87203179c0899e738b39ade42177b" - } - ] - }, - { - "name": "rand_chacha", - "version": "0.9.0", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "COPYRIGHT", - "sha256": "90eb64f0279b0d9432accfa6023ff803bc4965212383697eee27a0f426d5f8d5" - }, - { - "path": "LICENSE-APACHE", - "sha256": "35242e7a83f69875e6edeff02291e688c97caafe2f8902e4e19b49d3e78b4cab" - }, - { - "path": "LICENSE-MIT", - "sha256": "209fbbe0ad52d9235e37badf9cadfe4dbdc87203179c0899e738b39ade42177b" - } - ] - }, - { - "name": "rand_core", - "version": "0.6.4", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "COPYRIGHT", - "sha256": "90eb64f0279b0d9432accfa6023ff803bc4965212383697eee27a0f426d5f8d5" - }, - { - "path": "LICENSE-APACHE", - "sha256": "6df43f6f4b5d4587f3d8d71e45532c688fd168afa5fe89d571cb32fa09c4ef51" - }, - { - "path": "LICENSE-MIT", - "sha256": "209fbbe0ad52d9235e37badf9cadfe4dbdc87203179c0899e738b39ade42177b" - } - ] - }, - { - "name": "rand_core", - "version": "0.9.5", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "COPYRIGHT", - "sha256": "90eb64f0279b0d9432accfa6023ff803bc4965212383697eee27a0f426d5f8d5" - }, - { - "path": "LICENSE-APACHE", - "sha256": "6df43f6f4b5d4587f3d8d71e45532c688fd168afa5fe89d571cb32fa09c4ef51" - }, - { - "path": "LICENSE-MIT", - "sha256": "209fbbe0ad52d9235e37badf9cadfe4dbdc87203179c0899e738b39ade42177b" - } - ] - }, - { - "name": "raw-cpuid", - "version": "11.6.0", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE.md", - "sha256": "cdd45f4d0c552c3a51725728215919e0dedb1e1af250f130e7c2d60eef6721fe" - } - ] - }, - { - "name": "rayon", - "version": "1.11.0", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "0621878e61f0d0fda054bcbe02df75192c28bde1ecc8289cbd86aeba2dd72720" - } - ] - }, - { - "name": "rayon-core", - "version": "1.13.0", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "0621878e61f0d0fda054bcbe02df75192c28bde1ecc8289cbd86aeba2dd72720" - } - ] - }, - { - "name": "regex", - "version": "1.12.2", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb" - } - ] - }, - { - "name": "regex-automata", - "version": "0.4.13", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb" - } - ] - }, - { - "name": "regex-syntax", - "version": "0.8.8", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb" - }, - { - "path": "src/unicode_tables/LICENSE-UNICODE", - "sha256": "74db5baf44a41b1000312c673544b3374e4198af5605c7f9080a402cec42cfa3" - } - ] - }, - { - "name": "reqwest", - "version": "0.12.28", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "751963a8b88c0e3a9f27e98933079fbcf09b9998b2c13ac49c2e4d58444520d6" - }, - { - "path": "LICENSE-MIT", - "sha256": "47d4e1803702728e03d30f8a848ae2249ba274bbd9f8443e803f7924d83cd371" - } - ] - }, - { - "name": "ring", - "version": "0.17.14", - "license_declared": "Apache-2.0 AND ISC", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7", - "notice_inventory": "s3-reader-third-party-notices.txt", - "texts": [ - { - "path": "LICENSE", - "sha256": "b3d734001a94efff3579978d953391aa7115f877657d25eb54037a43875d078a" - }, - { - "path": "LICENSE-BoringSSL", - "sha256": "005fc765ddc5115da796cca915baa9557abae13ff35e0a47c47affc56f6c414d" - }, - { - "path": "LICENSE-other-bits", - "sha256": "f025ccfb7dfb6bdfedc75ca0f67acc69e6fb4998143d834f7c2f38a29989680f" - }, - { - "path": "src/polyfill/once_cell/LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "src/polyfill/once_cell/LICENSE-MIT", - "sha256": "6ee2ed6c77710de911761acd5fc1ad1da00f476beb1a7ef27e78c2d1858deafc" - }, - { - "path": "third_party/fiat/LICENSE", - "sha256": "9eacbcb81be660840c714a560a9d65ba07913db98dd4baf969f78dd499fdd60f" - } - ] - }, - { - "name": "rusqlite", - "version": "0.32.1", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "7753b721174eb8ff87a9a0e799e2d7bc3749323e773db92e0984debb00019d6e", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "f59ba65550f2a5adff98ec6478d783402c8e0a3eb515025c0b3438f3d30dc39e" - } - ] - }, - { - "name": "rustix", - "version": "1.1.3", - "license_declared": "Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "COPYRIGHT", - "sha256": "377c2e7c53250cc5905c0b0532d35973392af16ffb9596a41d99d202cf3617c9" - }, - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-Apache-2.0_WITH_LLVM-exception", - "sha256": "268872b9816f90fd8e85db5a28d33f8150ebb8dd016653fb39ef1f94f2686bc5" - }, - { - "path": "LICENSE-MIT", - "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" - } - ] - }, - { - "name": "rustix-linux-procfs", - "version": "0.1.1", - "license_declared": "Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "2fc84bf7e9aa16c4f2c758f27412dc9841341e16aa682d9c7ac308fe3ee12056", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "COPYRIGHT", - "sha256": "d415a86ccfd794129666247cbbadebee7a6d0ac3ff701c76c07b0f9424f0307d" - }, - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-Apache-2.0_WITH_LLVM-exception", - "sha256": "268872b9816f90fd8e85db5a28d33f8150ebb8dd016653fb39ef1f94f2686bc5" - }, - { - "path": "LICENSE-MIT", - "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" - } - ] - }, - { - "name": "rustls", - "version": "0.23.45", - "license_declared": "Apache-2.0 OR ISC OR MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "0d41d731c7d2f962d1ccc364cec258de3c0e93b38c2fb3ba97ac74513048d634", - "notice_inventory": "s3-reader-third-party-notices.txt", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-ISC", - "sha256": "7cfafc877eccc46c0e346ccbaa5c51bb6b894d2b818e617d970211e232785ad4" - }, - { - "path": "LICENSE-MIT", - "sha256": "709e3175b4212f7b13aa93971c9f62ff8c69ec45ad8c6532a7e0c41d7a7d6f8c" - } - ] - }, - { - "name": "rustls-native-certs", - "version": "0.8.4", - "license_declared": "Apache-2.0 OR ISC OR MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d", - "notice_inventory": "s3-reader-third-party-notices.txt", - "texts": [ - { - "path": "LICENSE", - "sha256": "d75967ce788187f83c3bd3328210974acfc443d4dc44909f1d7e34f21623a0c6" - }, - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-ISC", - "sha256": "7cfafc877eccc46c0e346ccbaa5c51bb6b894d2b818e617d970211e232785ad4" - }, - { - "path": "LICENSE-MIT", - "sha256": "709e3175b4212f7b13aa93971c9f62ff8c69ec45ad8c6532a7e0c41d7a7d6f8c" - } - ] - }, - { - "name": "rustls-pki-types", - "version": "1.14.0", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "45fd05c4865e7c350b98ad7ac50e1b15462d49af4a91e9b0c9dd933dc9a69742" - }, - { - "path": "LICENSE-MIT", - "sha256": "9117d922e667125508dde62b02c1f57ed22f5ad21eb536aa2e2d99e1c796e639" - } - ] - }, - { - "name": "rustls-webpki", - "version": "0.103.15", - "license_declared": "ISC", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "f3c3cf1d8b1e7d4927e2d154c3fcb02979afb9939629c62cd9048d4f07b60ac2", - "notice_inventory": "s3-reader-third-party-notices.txt", - "texts": [ - { - "path": "LICENSE", - "sha256": "5b698ca13897be3afdb7174256fa1574f8c6892b8bea1a66dd6469d3fe27885a" - } - ] - }, - { - "name": "ryu", - "version": "1.0.22", - "license_declared": "Apache-2.0 OR BSL-1.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "a50f4cf475b65d88e057964e0e9bb1f0aa9bbb2036dc65c64596b42932536984", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a" - }, - { - "path": "LICENSE-BOOST", - "sha256": "c9bff75738922193e67fa726fa225535870d2aa1059f91452c411736284ad566" - } - ] - }, - { - "name": "same-file", - "version": "1.0.6", - "license_declared": "Unlicense/MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "COPYING", - "sha256": "01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f" - }, - { - "path": "LICENSE-MIT", - "sha256": "cb3c929a05e6cbc9de9ab06a4c57eeb60ca8c724bef6c138c87d3a577e27aa14" - }, - { - "path": "UNLICENSE", - "sha256": "7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c" - } - ] - }, - { - "name": "schannel", - "version": "0.1.28", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE.md", - "sha256": "aa72991ac35b4de0034da0afe943e62b48c4092fc2ba13ae47806d8e9a4ad551" - } - ] - }, - { - "name": "scopeguard", - "version": "1.2.0", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "fb77f0a9c53e473abe5103c8632ef9f0f2874d4fb3f17cb2d8c661aab9cee9d7" - } - ] - }, - { - "name": "security-framework", - "version": "2.11.1", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "91e934255ba3b2f21103d68c5581c23ef34aa95c4628e4405b8c901935e11c69" - } - ] - }, - { - "name": "security-framework", - "version": "3.5.1", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef", - "notice_inventory": "s3-reader-third-party-notices.txt", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "91e934255ba3b2f21103d68c5581c23ef34aa95c4628e4405b8c901935e11c69" - } - ] - }, - { - "name": "security-framework-sys", - "version": "2.15.0", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "91e934255ba3b2f21103d68c5581c23ef34aa95c4628e4405b8c901935e11c69" - } - ] - }, - { - "name": "semver", - "version": "1.0.27", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a" - }, - { - "path": "LICENSE-MIT", - "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" - } - ] - }, - { - "name": "serde", - "version": "1.0.228", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a" - }, - { - "path": "LICENSE-MIT", - "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" - } - ] - }, - { - "name": "serde_core", - "version": "1.0.228", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a" - }, - { - "path": "LICENSE-MIT", - "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" - } - ] - }, - { - "name": "serde_derive", - "version": "1.0.228", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a" - }, - { - "path": "LICENSE-MIT", - "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" - } - ] - }, - { - "name": "serde_json", - "version": "1.0.149", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a" - }, - { - "path": "LICENSE-MIT", - "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" - } - ] - }, - { - "name": "serde_urlencoded", - "version": "0.7.1", - "license_declared": "MIT/Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a" - }, - { - "path": "LICENSE-MIT", - "sha256": "b9eb266294324f672cbe945fe8f2e32f85024f0d61a1a7d14382cdde0ac44769" - } - ] - }, - { - "name": "sha2", - "version": "0.10.9", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a9040321c3712d8fd0b09cf52b17445de04a23a10165049ae187cd39e5c86be5" - }, - { - "path": "LICENSE-MIT", - "sha256": "b4eb00df6e2a4d22518fcaa6a2b4646f249b3a3c9814509b22bd2091f1392ff1" - } - ] - }, - { - "name": "shlex", - "version": "1.3.0", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "553fffcd9b1cb158bc3e9edc35da85ca5c3b3d7d2e61c883ebcfa8a65814b583" - }, - { - "path": "LICENSE-MIT", - "sha256": "4455bf75a91154108304cb283e0fea9948c14f13e20d60887cf2552449dea3b1" - } - ] - }, - { - "name": "signal-hook-registry", - "version": "1.4.8", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "503558bfefe66ca15e4e3f7955b3cb0ec87fd52f29bf24b336af7bd00e946d5c" - } - ] - }, - { - "name": "simd-adler32", - "version": "0.3.8", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE.md", - "sha256": "42a35170233e83e18856792e748de4c1ce4a63b2afce9a370c89ef3fe23f9f2d" - } - ] - }, - { - "name": "slab", - "version": "0.4.11", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "8ce0830173fdac609dfb4ea603fdc002c2f4af0dc9b1a005653f5da9cf534b18" - } - ] - }, - { - "name": "smallvec", - "version": "1.15.1", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "0b28172679e0009b655da42797c03fd163a3379d5cfa67ba1f1655e974a2a1a9" - } - ] - }, - { - "name": "socket2", - "version": "0.6.1", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397" - } - ] - }, - { - "name": "spinning_top", - "version": "0.3.0", - "license_declared": "MIT/Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "d96d2d1d716fb500937168cc09353ffdc7a012be8475ac7308e1bdf0e3923300", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4" - }, - { - "path": "LICENSE-MIT", - "sha256": "984f3c74e72da2ffd0b10715e2e5e85307f30fb0ed41d08e88b37e7fac4f2d03" - } - ] - }, - { - "name": "stable_deref_trait", - "version": "1.2.1", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "5e05b024f653a5ce199e77cbbbd42fb5553562ec714b819421ed0c3e552a75d7" - } - ] - }, - { - "name": "subtle", - "version": "2.6.1", - "license_declared": "BSD-3-Clause", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292", - "notice_inventory": "s3-reader-third-party-notices.txt", - "texts": [ - { - "path": "LICENSE", - "sha256": "d1fc1bc0d155df60b2e7705b6b2ae02a05c96f948e1cec6e2fb86360b09f346b" - } - ] - }, - { - "name": "syn", - "version": "2.0.114", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a" - }, - { - "path": "LICENSE-MIT", - "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" - } - ] - }, - { - "name": "sync_wrapper", - "version": "1.0.2", - "license_declared": "Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "0d542e0c8804e39aa7f37eb00da5a762149dc682d7829451287e11b938e94594" - } - ] - }, - { - "name": "synstructure", - "version": "0.13.2", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "219920e865eee70b7dcfc948a86b099e7f4fe2de01bcca2ca9a20c0a033f2b59" - } - ] - }, - { - "name": "sysinfo", - "version": "0.32.1", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "4c33cd241af0f2e9e3b5c32163b873b29956890b5342e6745b917ce9d490f4af", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "1f14f9ce70a5fdedab449bb32cd7d3f20e6e9d18c2a2b74221fc203db8684d43" - } - ] - }, - { - "name": "system-configuration", - "version": "0.6.1", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "000cbb5bea6f21829c8f0d9e1fe87410bd5ef0453412ffc017845982a3e19824" - } - ] - }, - { - "name": "system-configuration-sys", - "version": "0.6.0", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "000cbb5bea6f21829c8f0d9e1fe87410bd5ef0453412ffc017845982a3e19824" - } - ] - }, - { - "name": "tagptr", - "version": "0.2.0", - "license_declared": "MIT/Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a2b15e1e900414317d0e00d887dd2747d4abd00382c6addeb5daf746bed4b52b" - }, - { - "path": "LICENSE-MIT", - "sha256": "175d33d2e88fc3944f1f54125e886e7232a85380b73dce505e9088fe4e91c576" - } - ] - }, - { - "name": "tar", - "version": "0.4.45", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "22692a6476a21fa75fdfc11d452fda482af402c008cdbaf3476414e122040973", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "8ca6b96cea9e67c6c5c63f452c31bd396db8bd2406231fdea5d48ef462b48077" - } - ] - }, - { - "name": "tempfile", - "version": "3.24.0", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "655da9c7eb6305c55742045d5a8d2037996d61d8de95806335c7c86ce0f82e9c", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "8b427f5bc501764575e52ba4f9d95673cf8f6d80a86d0d06599852e1a9a20a36" - } - ] - }, - { - "name": "thiserror", - "version": "2.0.18", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a" - }, - { - "path": "LICENSE-MIT", - "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" - } - ] - }, - { - "name": "thiserror-impl", - "version": "2.0.18", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a" - }, - { - "path": "LICENSE-MIT", - "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" - } - ] - }, - { - "name": "tinystr", - "version": "0.8.2", - "license_declared": "Unicode-3.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "f367c1b8e1aa262435251e442901da4607b4650e0e63a026f5044473ecfb90f2" - } - ] - }, - { - "name": "tinyvec", - "version": "1.13.2", - "license_declared": "Zlib OR Apache-2.0 OR MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "4cf0ded5c4e56918d8f8a339e1bb67d038d3bc6d144ac407904015ba2e4cde9b", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE.md", - "sha256": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30" - }, - { - "path": "LICENSE-MIT.md", - "sha256": "fd80a26fbb3f644af1fa994134446702932968519797227e07a1368dea80f0bc" - }, - { - "path": "LICENSE-ZLIB.md", - "sha256": "84b34dd7608f7fb9b17bd588a6bf392bf7de504e2716f024a77d89f1b145a151" - } - ] - }, - { - "name": "tinyvec_macros", - "version": "0.1.1", - "license_declared": "MIT OR Apache-2.0 OR Zlib", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE.md", - "sha256": "4f44572785f35152c1fd2eadf565b7e079c0f300b4324f0af653419f9d76b735" - }, - { - "path": "LICENSE-MIT.md", - "sha256": "1dd8eca0f83669e75fa119e34fb9e1be9d16e3e9b6368962b8019db6e8ae5f7b" - }, - { - "path": "LICENSE-ZLIB.md", - "sha256": "41ace205715d9f19a3214218cc1c01d57c533e02cd0fef7c8e51a49a7fce5ac5" - } - ] - }, - { - "name": "tokio", - "version": "1.49.0", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "253cd04c6714889df2d32f3f64d669179a1c95c76ac43c40882c52eb06bc3552" - } - ] - }, - { - "name": "tokio-macros", - "version": "2.6.0", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "0b83dc40cba89b9922bb84b0a9c7d2768ce37c1d7e138b7424fd4549915778c9" - } - ] - }, - { - "name": "tokio-native-tls", - "version": "0.3.1", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "898b1ae9821e98daf8964c8d6c7f61641f5f5aa78ad500020771c0939ee0dea1" - } - ] - }, - { - "name": "tokio-rustls", - "version": "0.26.4", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61", - "notice_inventory": "s3-reader-third-party-notices.txt", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "cc117d90b498b32b11a886f279b359da16a73c3b01efbb2f5cc004b20262334e" - }, - { - "path": "LICENSE-MIT", - "sha256": "e20fa2b8e0a2565f24a792b94b4bf4b6c2b9d36f781d8a9516e218a036e6677a" - } - ] - }, - { - "name": "tokio-util", - "version": "0.7.18", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "253cd04c6714889df2d32f3f64d669179a1c95c76ac43c40882c52eb06bc3552" - } - ] - }, - { - "name": "tower", - "version": "0.5.3", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "4249c8e6c5ebb85f97c77e6457c6fafc1066406eb8f1ef61e796fbdc5ff18482" - } - ] - }, - { - "name": "tower-http", - "version": "0.6.8", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "5049cf464977eff4b4fcfa7988d84e74116956a3eb9d5f1d451b3f828f945233" - } - ] - }, - { - "name": "tower-layer", - "version": "0.3.3", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "4249c8e6c5ebb85f97c77e6457c6fafc1066406eb8f1ef61e796fbdc5ff18482" - } - ] - }, - { - "name": "tower-service", - "version": "0.3.3", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "4249c8e6c5ebb85f97c77e6457c6fafc1066406eb8f1ef61e796fbdc5ff18482" - } - ] - }, - { - "name": "tracing", - "version": "0.1.44", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "898b1ae9821e98daf8964c8d6c7f61641f5f5aa78ad500020771c0939ee0dea1" - } - ] - }, - { - "name": "tracing-attributes", - "version": "0.1.31", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "898b1ae9821e98daf8964c8d6c7f61641f5f5aa78ad500020771c0939ee0dea1" - } - ] - }, - { - "name": "tracing-core", - "version": "0.1.36", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "898b1ae9821e98daf8964c8d6c7f61641f5f5aa78ad500020771c0939ee0dea1" - }, - { - "path": "src/spin/LICENSE", - "sha256": "58545fed1565e42d687aecec6897d35c6d37ccb71479a137c0deb2203e125c79" - } - ] - }, - { - "name": "triomphe", - "version": "0.1.15", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "dd69c5aa8f924c7519d6372789a74eac5b94fb0f8fcf0d4a97eb0bfc3e785f39", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a6b7260485462860838b76ad1846d21f1605e6d239141c3aa949a601d992676c" - }, - { - "path": "LICENSE-MIT", - "sha256": "15656cc11a8331f28c0986b8ab97220d3e76f98e60ed388b5ffad37dfac4710c" - } - ] - }, - { - "name": "try-lock", - "version": "0.2.5", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "c816a0749cdc6bf062a5111c159723de51b2bfac66a1dac2655abd9e6b1583eb" - } - ] - }, - { - "name": "typenum", - "version": "1.19.0", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "db11fec9946737df39ca3898d9cd8c10ec6f6c3a884a6802b0ad0b81b4e8f23a" - }, - { - "path": "LICENSE-APACHE", - "sha256": "516b24e051bf5630880ebbd55c40a25ce9552ebaf8970a53e8976eb70e522406" - }, - { - "path": "LICENSE-MIT", - "sha256": "a825bd853ab71619a4923d7b4311221427848070ff44d990da39b0b274c1683f" - } - ] - }, - { - "name": "unicode-ident", - "version": "1.0.22", - "license_declared": "(MIT OR Apache-2.0) AND Unicode-3.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a" - }, - { - "path": "LICENSE-MIT", - "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" - }, - { - "path": "LICENSE-UNICODE", - "sha256": "f7db81051789b729fea528a63ec4c938fdcb93d9d61d97dc8cc2e9df6d47f2a1" - } - ] - }, - { - "name": "unicode-normalization", - "version": "0.1.25", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "COPYRIGHT", - "sha256": "23860c2a7b5d96b21569afedf033469bab9fe14a1b24a35068b8641c578ce24d" - }, - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "7b63ecd5f1902af1b63729947373683c32745c16a10e8e6292e2e2dcd7e90ae0" - } - ] - }, - { - "name": "untrusted", - "version": "0.9.0", - "license_declared": "ISC", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1", - "notice_inventory": "s3-reader-third-party-notices.txt", - "texts": [ - { - "path": "LICENSE.txt", - "sha256": "7abd9b6960dcf7d4d0a48606a5b71bfe37d472db68d70637f3a58a56785f1621" - } - ] - }, - { - "name": "url", - "version": "2.5.8", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "b38f11f6096706e6de553dabe2a7ed142d59b6fa8c97e290c67496154745cdd5" - } - ] - }, - { - "name": "urlencoding", - "version": "2.1.3", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "5a952e4a62a3022a7f39e9f0eb8d0638addd3efffb3f4092890923668152296e" - } - ] - }, - { - "name": "utf8_iter", - "version": "1.0.4", - "license_declared": "Apache-2.0 OR MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "COPYRIGHT", - "sha256": "c30152c94a6d75e021adbc52b3a52470366a46edb917e17deae3259251af244c" - }, - { - "path": "LICENSE-APACHE", - "sha256": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30" - }, - { - "path": "LICENSE-MIT", - "sha256": "3fa4ca83dcc9237839b1bdeb2e6d16bdfb5ec0c5ce42b24694d8bbf0dcbef72c" - } - ] - }, - { - "name": "uuid", - "version": "1.19.0", - "license_declared": "Apache-2.0 OR MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "436bc5a105d8e57dcd8778730f3754f7bf39c14d2f530e4cde4bd2d17a83ec3d" - } - ] - }, - { - "name": "vcpkg", - "version": "0.2.15", - "license_declared": "MIT/Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "60c93a31f490375aadf64098b75f10715010379541021e00261045d7800611d3" - }, - { - "path": "LICENSE-MIT", - "sha256": "016d20f335060a70e79d9fcf8dfaa6201114d65d592211f4bdfb8ae9ca2bc1dc" - } - ] - }, - { - "name": "version_check", - "version": "0.9.5", - "license_declared": "MIT/Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "b7e650f3fce5c53249d1cdc608b54df156a97edd636cf9d23498d0cfe7aec63e" - } - ] - }, - { - "name": "walkdir", - "version": "2.5.0", - "license_declared": "Unlicense/MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "COPYING", - "sha256": "01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f" - }, - { - "path": "LICENSE-MIT", - "sha256": "0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f" - }, - { - "path": "UNLICENSE", - "sha256": "7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c" - } - ] - }, - { - "name": "want", - "version": "0.3.1", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "a65f5d0a945d267751344c95665945b90c030ea107faf5c85d518929886187da" - } - ] - }, - { - "name": "winapi", - "version": "0.3.9", - "license_declared": "MIT/Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "b40930bbcf80744c86c46a12bc9da056641d722716c378f5659b9e555ef833e1" - }, - { - "path": "LICENSE-MIT", - "sha256": "ce7bc3499fee93d5022ef430d5e4201e79a6d9154f3974e42f41349f0569e09b" - } - ] - }, - { - "name": "winapi-util", - "version": "0.1.11", - "license_declared": "Unlicense OR MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "COPYING", - "sha256": "01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f" - }, - { - "path": "LICENSE-MIT", - "sha256": "cb3c929a05e6cbc9de9ab06a4c57eeb60ca8c724bef6c138c87d3a577e27aa14" - }, - { - "path": "UNLICENSE", - "sha256": "7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c" - } - ] - }, - { - "name": "windows", - "version": "0.57.0", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "license-apache-2.0", - "sha256": "c16f8dcf1a368b83be78d826ea23de4079fe1b4469a0ab9ee20563f37ff3d44b" - }, - { - "path": "license-mit", - "sha256": "c2cfccb812fe482101a8f04597dfc5a9991a6b2748266c47ac91b6a5aae15383" - } - ] - }, - { - "name": "windows-core", - "version": "0.57.0", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "license-apache-2.0", - "sha256": "c16f8dcf1a368b83be78d826ea23de4079fe1b4469a0ab9ee20563f37ff3d44b" - }, - { - "path": "license-mit", - "sha256": "c2cfccb812fe482101a8f04597dfc5a9991a6b2748266c47ac91b6a5aae15383" - } - ] - }, - { - "name": "windows-implement", - "version": "0.57.0", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "license-apache-2.0", - "sha256": "c16f8dcf1a368b83be78d826ea23de4079fe1b4469a0ab9ee20563f37ff3d44b" - }, - { - "path": "license-mit", - "sha256": "c2cfccb812fe482101a8f04597dfc5a9991a6b2748266c47ac91b6a5aae15383" - } - ] - }, - { - "name": "windows-interface", - "version": "0.57.0", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "license-apache-2.0", - "sha256": "c16f8dcf1a368b83be78d826ea23de4079fe1b4469a0ab9ee20563f37ff3d44b" - }, - { - "path": "license-mit", - "sha256": "c2cfccb812fe482101a8f04597dfc5a9991a6b2748266c47ac91b6a5aae15383" - } - ] - }, - { - "name": "windows-link", - "version": "0.2.1", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "license-apache-2.0", - "sha256": "c16f8dcf1a368b83be78d826ea23de4079fe1b4469a0ab9ee20563f37ff3d44b" - }, - { - "path": "license-mit", - "sha256": "c2cfccb812fe482101a8f04597dfc5a9991a6b2748266c47ac91b6a5aae15383" - } - ] - }, - { - "name": "windows-registry", - "version": "0.6.1", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "license-apache-2.0", - "sha256": "c16f8dcf1a368b83be78d826ea23de4079fe1b4469a0ab9ee20563f37ff3d44b" - }, - { - "path": "license-mit", - "sha256": "c2cfccb812fe482101a8f04597dfc5a9991a6b2748266c47ac91b6a5aae15383" - } - ] - }, - { - "name": "windows-result", - "version": "0.1.2", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "license-apache-2.0", - "sha256": "c16f8dcf1a368b83be78d826ea23de4079fe1b4469a0ab9ee20563f37ff3d44b" - }, - { - "path": "license-mit", - "sha256": "c2cfccb812fe482101a8f04597dfc5a9991a6b2748266c47ac91b6a5aae15383" - } - ] - }, - { - "name": "windows-result", - "version": "0.4.1", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "license-apache-2.0", - "sha256": "c16f8dcf1a368b83be78d826ea23de4079fe1b4469a0ab9ee20563f37ff3d44b" - }, - { - "path": "license-mit", - "sha256": "c2cfccb812fe482101a8f04597dfc5a9991a6b2748266c47ac91b6a5aae15383" - } - ] - }, - { - "name": "windows-strings", - "version": "0.5.1", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "license-apache-2.0", - "sha256": "c16f8dcf1a368b83be78d826ea23de4079fe1b4469a0ab9ee20563f37ff3d44b" - }, - { - "path": "license-mit", - "sha256": "c2cfccb812fe482101a8f04597dfc5a9991a6b2748266c47ac91b6a5aae15383" - } - ] - }, - { - "name": "windows-sys", - "version": "0.48.0", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "license-apache-2.0", - "sha256": "c16f8dcf1a368b83be78d826ea23de4079fe1b4469a0ab9ee20563f37ff3d44b" - }, - { - "path": "license-mit", - "sha256": "c2cfccb812fe482101a8f04597dfc5a9991a6b2748266c47ac91b6a5aae15383" - } - ] - }, - { - "name": "windows-sys", - "version": "0.52.0", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "license-apache-2.0", - "sha256": "c16f8dcf1a368b83be78d826ea23de4079fe1b4469a0ab9ee20563f37ff3d44b" - }, - { - "path": "license-mit", - "sha256": "c2cfccb812fe482101a8f04597dfc5a9991a6b2748266c47ac91b6a5aae15383" - } - ] - }, - { - "name": "windows-sys", - "version": "0.59.0", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "license-apache-2.0", - "sha256": "c16f8dcf1a368b83be78d826ea23de4079fe1b4469a0ab9ee20563f37ff3d44b" - }, - { - "path": "license-mit", - "sha256": "c2cfccb812fe482101a8f04597dfc5a9991a6b2748266c47ac91b6a5aae15383" - } - ] - }, - { - "name": "windows-sys", - "version": "0.60.2", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "license-apache-2.0", - "sha256": "c16f8dcf1a368b83be78d826ea23de4079fe1b4469a0ab9ee20563f37ff3d44b" - }, - { - "path": "license-mit", - "sha256": "c2cfccb812fe482101a8f04597dfc5a9991a6b2748266c47ac91b6a5aae15383" - } - ] - }, - { - "name": "windows-sys", - "version": "0.61.2", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "license-apache-2.0", - "sha256": "c16f8dcf1a368b83be78d826ea23de4079fe1b4469a0ab9ee20563f37ff3d44b" - }, - { - "path": "license-mit", - "sha256": "c2cfccb812fe482101a8f04597dfc5a9991a6b2748266c47ac91b6a5aae15383" - } - ] - }, - { - "name": "windows-targets", - "version": "0.48.5", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "license-apache-2.0", - "sha256": "c16f8dcf1a368b83be78d826ea23de4079fe1b4469a0ab9ee20563f37ff3d44b" - }, - { - "path": "license-mit", - "sha256": "c2cfccb812fe482101a8f04597dfc5a9991a6b2748266c47ac91b6a5aae15383" - } - ] - }, - { - "name": "windows-targets", - "version": "0.52.6", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "license-apache-2.0", - "sha256": "c16f8dcf1a368b83be78d826ea23de4079fe1b4469a0ab9ee20563f37ff3d44b" - }, - { - "path": "license-mit", - "sha256": "c2cfccb812fe482101a8f04597dfc5a9991a6b2748266c47ac91b6a5aae15383" - } - ] - }, - { - "name": "windows-targets", - "version": "0.53.5", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "license-apache-2.0", - "sha256": "c16f8dcf1a368b83be78d826ea23de4079fe1b4469a0ab9ee20563f37ff3d44b" - }, - { - "path": "license-mit", - "sha256": "c2cfccb812fe482101a8f04597dfc5a9991a6b2748266c47ac91b6a5aae15383" - } - ] - }, - { - "name": "windows_x86_64_msvc", - "version": "0.48.5", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "license-apache-2.0", - "sha256": "c16f8dcf1a368b83be78d826ea23de4079fe1b4469a0ab9ee20563f37ff3d44b" - }, - { - "path": "license-mit", - "sha256": "c2cfccb812fe482101a8f04597dfc5a9991a6b2748266c47ac91b6a5aae15383" - } - ] - }, - { - "name": "windows_x86_64_msvc", - "version": "0.52.6", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "license-apache-2.0", - "sha256": "c16f8dcf1a368b83be78d826ea23de4079fe1b4469a0ab9ee20563f37ff3d44b" - }, - { - "path": "license-mit", - "sha256": "c2cfccb812fe482101a8f04597dfc5a9991a6b2748266c47ac91b6a5aae15383" - } - ] - }, - { - "name": "windows_x86_64_msvc", - "version": "0.53.1", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "license-apache-2.0", - "sha256": "c16f8dcf1a368b83be78d826ea23de4079fe1b4469a0ab9ee20563f37ff3d44b" - }, - { - "path": "license-mit", - "sha256": "c2cfccb812fe482101a8f04597dfc5a9991a6b2748266c47ac91b6a5aae15383" - } - ] - }, - { - "name": "winx", - "version": "0.36.4", - "license_declared": "Apache-2.0 WITH LLVM-exception", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "3f3fd376f71958b862e7afb20cfe5a22830e1963462f3a17f49d82a6c1d1f42d", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "268872b9816f90fd8e85db5a28d33f8150ebb8dd016653fb39ef1f94f2686bc5" - } - ] - }, - { - "name": "writeable", - "version": "0.6.2", - "license_declared": "Unicode-3.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "f367c1b8e1aa262435251e442901da4607b4650e0e63a026f5044473ecfb90f2" - } - ] - }, - { - "name": "xattr", - "version": "1.6.1", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2" - }, - { - "path": "LICENSE-MIT", - "sha256": "8b427f5bc501764575e52ba4f9d95673cf8f6d80a86d0d06599852e1a9a20a36" - } - ] - }, - { - "name": "yoke", - "version": "0.8.1", - "license_declared": "Unicode-3.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "f367c1b8e1aa262435251e442901da4607b4650e0e63a026f5044473ecfb90f2" - } - ] - }, - { - "name": "yoke-derive", - "version": "0.8.1", - "license_declared": "Unicode-3.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "f367c1b8e1aa262435251e442901da4607b4650e0e63a026f5044473ecfb90f2" - } - ] - }, - { - "name": "zerocopy", - "version": "0.8.33", - "license_declared": "BSD-2-Clause OR Apache-2.0 OR MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "668f5168d10b9ee831de31933dc111a459c97ec93225beb307aed970d1372dfd", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "9d185ac6703c4b0453974c0d85e9eee43e6941009296bb1f5eb0b54e2329e9f3" - }, - { - "path": "LICENSE-BSD", - "sha256": "83c1763356e822adde0a2cae748d938a73fdc263849ccff6b27776dff213bd32" - }, - { - "path": "LICENSE-MIT", - "sha256": "1a2f5c12ddc934d58956aa5dbdd3255fe55fd957633ab7d0d39e4f0daa73f7df" - } - ] - }, - { - "name": "zerofrom", - "version": "0.1.6", - "license_declared": "Unicode-3.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "f367c1b8e1aa262435251e442901da4607b4650e0e63a026f5044473ecfb90f2" - } - ] - }, - { - "name": "zerofrom-derive", - "version": "0.1.6", - "license_declared": "Unicode-3.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "f367c1b8e1aa262435251e442901da4607b4650e0e63a026f5044473ecfb90f2" - } - ] - }, - { - "name": "zeroize", - "version": "1.8.2", - "license_declared": "Apache-2.0 OR MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-APACHE", - "sha256": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30" - }, - { - "path": "LICENSE-MIT", - "sha256": "0b04ee3ce0021a922f43f37a17fee09a5a1ee6d1f4e149d5bf75b72395a49c72" - } - ] - }, - { - "name": "zerotrie", - "version": "0.2.3", - "license_declared": "Unicode-3.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "f367c1b8e1aa262435251e442901da4607b4650e0e63a026f5044473ecfb90f2" - } - ] - }, - { - "name": "zerovec", - "version": "0.11.5", - "license_declared": "Unicode-3.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "f367c1b8e1aa262435251e442901da4607b4650e0e63a026f5044473ecfb90f2" - } - ] - }, - { - "name": "zerovec-derive", - "version": "0.11.2", - "license_declared": "Unicode-3.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "f367c1b8e1aa262435251e442901da4607b4650e0e63a026f5044473ecfb90f2" - } - ] - }, - { - "name": "zmij", - "version": "1.0.16", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "dfcd145825aace48cff44a8844de64bf75feec3080e0aa5cdbde72961ae51a65", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE-MIT", - "sha256": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3" - } - ] - }, - { - "name": "zstd", - "version": "0.13.3", - "license_declared": "MIT", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "129e8edef29e9abcd2ebabe252f4ef1b1289cdca356bf0040284a2fbccfb96c8" - } - ] - }, - { - "name": "zstd-safe", - "version": "7.2.4", - "license_declared": "MIT OR Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "a77b7cfeaf911ed410ffbe76f0cb2b24ad8a4d94e7ead5727e914425c416cc63" - }, - { - "path": "LICENSE.Apache-2.0", - "sha256": "0d542e0c8804e39aa7f37eb00da5a762149dc682d7829451287e11b938e94594" - }, - { - "path": "LICENSE.Mit", - "sha256": "129e8edef29e9abcd2ebabe252f4ef1b1289cdca356bf0040284a2fbccfb96c8" - } - ] - }, - { - "name": "zstd-sys", - "version": "2.0.16+zstd.1.5.7", - "license_declared": "MIT/Apache-2.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "crate_checksum": "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748", - "notice_inventory": "docs/release-attribution/0.7.0/inventory.json", - "texts": [ - { - "path": "LICENSE", - "sha256": "a77b7cfeaf911ed410ffbe76f0cb2b24ad8a4d94e7ead5727e914425c416cc63" - }, - { - "path": "LICENSE.Apache-2.0", - "sha256": "0d542e0c8804e39aa7f37eb00da5a762149dc682d7829451287e11b938e94594" - }, - { - "path": "LICENSE.BSD-3-Clause", - "sha256": "48341f685c87304089aa099b23c386f8bacc519ef555aa7a13e239908907b3fd" - }, - { - "path": "LICENSE.Mit", - "sha256": "129e8edef29e9abcd2ebabe252f4ef1b1289cdca356bf0040284a2fbccfb96c8" - }, - { - "path": "zstd/COPYING", - "sha256": "f9c375a1be4a41f7b70301dd83c91cb89e41567478859b77eef375a52d782505" - }, - { - "path": "zstd/LICENSE", - "sha256": "7055266497633c9025b777c78eb7235af13922117480ed5c674677adc381c9d8" - } - ] - } - ], - "input_sha256": { - "rust/Cargo.lock": "9fcefac5230e9b94b3a731e004184ff2ddb110621b79844563d8d6a58b082b41", - "rust/crates/pumas-core/Cargo.toml": "c49a56e7d94263755bcc12a0ec1c74505611f5d5b6327cfa7b80a331bd48bf92", - "scripts/release/generate-notices.py": "27765a62c7e3919bd5d2a5219053e2bf783f647d2931fedf8036f57816d83c1e", - "docs/release-attribution/0.7.0/inventory.json": "aecb3b4e065a159b9b8d204b5f8049623307eb64548a94976acfca1fa5fbabba" - }, - "notices_sha256": "338b215fec4e2efbb07ba5bdcbf21fe361fb6176dd744ea8270f91ed5d9d8152" -} diff --git a/docs/plans/artifact-acquisition/reports/s3-reader-qualification-2026-10-04.md b/docs/plans/artifact-acquisition/reports/s3-reader-qualification-2026-10-04.md deleted file mode 100644 index 2bfa89a7b..000000000 --- a/docs/plans/artifact-acquisition/reports/s3-reader-qualification-2026-10-04.md +++ /dev/null @@ -1,136 +0,0 @@ -# Optional S3 reader milestone - -Base: `c70a78f7232f46dfb3a6b73db8bcc75fa9293acf`, tree -`4a63335d0ff5f2399ebcff8128839b138cdd5337`. -Branch: `feat/acquisition-s3-reader-c70a78f7`. The coordinator owns PR creation, -independent review, integration, and final gate decisions. - -This records the reader candidate `2c7d6014658ef44575f3724f0ff6e7395f1fd7d8`. -Its later [dispatch/import successor](s3-dispatch-import-qualification-2026-10-04.md) -implements shared service use and one-file GGUF import; those claims do not -retroactively extend this reader-only evidence. The optional license inventory -is refreshed for the successor's manifest/lock inputs, retaining exact texts. - -**Status: implemented reader milestone; independent review and hosted -qualification pending.** The coordinator resumed this slice after the separately -committed PR37 repair. Addressing style now participates in stable source identity; -the same-endpoint/key fixture observes distinct physical request paths and -identities, and stable identity across repeated equivalent reader construction. -All 11 local protocol tests and strict headless all-target Clippy passed on this -source. The complete S3 acquisition/import workflow and AQ-S3 remain open. - -## Implemented boundary - -The explicitly enabled `s3` feature exposes an anonymous protocol reader for one -caller-selected versioned object. Configuration owns endpoint, region, bucket, -addressing style, HTTP admission, and the complete operation budget. Construction -does not discover credentials, proxies, or endpoint settings from the environment. -Redirects, SDK retries, and reqwest's default protocol-NACK retry policy are -explicitly disabled. The maintained dependency owns S3 URL, -version, condition, range, and response parsing; Pumas adds no signer or XML parser. - -Selection validates exact remote-key identity and the portable logical path, -requests the selected VersionId with HEAD, and requires matching returned version -evidence and a strong ETag. Mutable `null` versions are unavailable to this reader. -Addressing style and losslessly hex-encoded endpoint/bucket/key fields form the -existing stable manifest identity; VersionId is immutable revision evidence. SHA-256 is supplied -as declared evidence and is never inferred from ETag. - -Range reads request VersionId and If-Match together. They check returned version, -validator, total size, and exact range before exposing bytes, then stream into -caller-owned staging under the operation budget. Short or excess bodies fail. -Dropping the future stops polling it; partial writes remain with their caller. -The adapter creates no runtime, acquisition tasks, store, verifier, retry policy, -or publisher. SDK/client connection internals remain dependency-owned. -Shared-service source dispatch and model import are not implemented in this slice. - -## Dependency decision and attribution - -Admitted direct dependency: `object_store = =0.12.4`, `default-features = false`, -features `aws`, optional in `pumas-library` only. Its declared license is -`MIT OR Apache-2.0`; the exact downloaded package supplies `LICENSE.txt` and -`NOTICE.txt` for the Apache license. The checksum is retained in `Cargo.lock`. - -Comparison inspected exact upstream crate sources for 0.12.4 and 0.14.2. -0.12.4 uses the existing reqwest 0.12 family and ring backend; 0.14.2 moves to -reqwest 0.13 and its `aws` feature adds AWS-LC. Both fit the installed Rust 1.92 -toolchain. The bounded optional reader uses 0.12.4 to preserve the existing HTTP -family and avoid another client/native-crypto family. This is a compatibility -decision for the observed reader contract, not a security audit or a promise that -all authenticated/refreshing-credential requirements have been qualified. -The core crate declares reqwest's minimum tested version, 0.12.28, locally because -this consumer uses the explicit retry-policy API. Its existing JSON/stream and -default TLS features remain enabled; other workspace consumers retain their -existing requirement. The locked reqwest version and dependency graph are unchanged. -The exact APIs support the admitted anonymous/version/range contract locally; -the broader Q3 credential and provider matrix remains open. - -No existing locked package identity was removed or upgraded. Cargo's unrelated -compatible Windows-edge reselections were restored to their admitted lock edges; -locked metadata accepted the preserved graph. New optional dependencies and -feature-dependent dependency edges remain explicitly visible in the lock diff. - -The canonical `scripts/release/generate-notices.py` ran unchanged and collected -374 default-release notice entries; its checker passed. Its first invocation -failed because this isolated worktree lacked frontend dependencies. Reusing the -existing installation after byte-comparing both package manifests and the pnpm -lock resolved that setup issue without an install or duplicate dependency tree. -The default release omits the optional SDK, so its notice text is unchanged. - -The [optional license inventory](s3-reader-license-inventory.json) separately -records all 276 registry packages in the normal/build closure for the three -desktop target graphs. Existing notices are referenced by exact package identity; -15 additional entries retain their exact license/NOTICE texts in -[supplemental notices](s3-reader-third-party-notices.txt). Collection reused the -canonical generator's unchanged license-discovery function. The inventory records -locked crate checksums, exact text hashes, input hashes, and graph commands. -Graph collection establishes neither cross-platform compilation nor distribution -qualification. Sources: [pinned crate](https://crates.io/crates/object_store/0.12.4) -and [AWS GetObject contract](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html). - -## Local evidence and limits - -On Linux x86_64, `cargo test --locked --offline --manifest-path rust/Cargo.toml --p pumas-library --no-default-features --features s3 --test s3_reader -- ---test-threads=1` passed 11 tests. The local fixture checks both addressing styles, -literal encoded key/version requests, exact range bytes, selected manifest -evidence, missing/different version or validator, invalid selection/ranges, -conditional failure, changed size/range, truncated/excess/ignored-range bodies, -redirect/retry refusal, unfinished-body cancellation, and destination backpressure -within the complete operation budget, plus distinct addressing identities at the -same endpoint/key and stable identity across equivalent reader construction. -The source stays reachable until requests -finish, so extra retries or followed redirects are observable. Fixture tasks are -joined and aborted on early test failure. - -The initial full unit-test link exhausted this environment's disk and returned a -linker bus error; it produced no test result. Removing only this task's failed -object outputs and using a separate integration-test target allowed the focused -suite to pass. Shared targets were reused; unrelated build caches and worktrees -were preserved. Root-package test debug/incremental output was disabled and -debuginfo stripped through command-local Cargo profile overrides to fit disk. -After PR37's separate qualification finished, its task-created executable cache -was retired (source commit/branch and saved evidence retained) to fit this resumed -reader build. No unrelated cache or worktree was removed. - -Strict all-target `pumas-library` Clippy passed with `--no-default-features ---features s3,test-support -- -D warnings`; root dev debug/incremental output was -disabled with command-local profile overrides. Rustfmt and authored-source diff -checks passed. The unrestricted staged diff check flags CRLF, trailing whitespace, -and a final separator in the supplemental notices, which preserve exact upstream -license text. That text was not normalized to silence the check. -The headless compile check passed using `cargo check --locked --offline --manifest-path -rust/Cargo.toml -p pumas-library --no-default-features` with the same bounded root -dev profile overrides. Test-only reverse-range syntax was expressed as a `Range` -struct to satisfy Clippy while preserving the invalid-range oracle. - -The repository dependency-feature checker passed all 12 default/headless/fixture -graphs across Linux, macOS ARM64, and Windows x86_64. Separate S3 graph checks -observed no SDK in the six default/headless core graphs. These are graph checks, -not native builds or full suites. No live AWS/non-AWS/MinIO, authenticated source, -Torch download, actual model import, default ONNX compilation, packaged consumer, -resource benchmark, hosted exact-head CI, or independent source review ran. -The local HTTP/1.1 fixture does not exercise HTTP/2 NACKs, TLS trust or public DNS; -the explicit reqwest retry policy was verified against the locked 0.12.28 API. -AQ-S3 remains not ready. The next admitted S3 slice must compose source dispatch -with the existing acquisition owner before claiming an import workflow. diff --git a/docs/plans/artifact-acquisition/reports/s3-reader-third-party-notices.txt b/docs/plans/artifact-acquisition/reports/s3-reader-third-party-notices.txt deleted file mode 100644 index 040b60b56..000000000 --- a/docs/plans/artifact-acquisition/reports/s3-reader-third-party-notices.txt +++ /dev/null @@ -1,3071 +0,0 @@ -Optional S3 reader dependency notices. This is not the default release closure. - - -core-foundation 0.10.1 -Declared license: MIT OR Apache-2.0 -Source: https://crates.io/api/v1/crates/core-foundation/0.10.1/download - ---- LICENSE-APACHE --- - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - ---- LICENSE-MIT --- -Copyright (c) 2012-2013 Mozilla Foundation - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - - -humantime 2.4.0 -Declared license: MIT OR Apache-2.0 -Source: https://crates.io/api/v1/crates/humantime/2.4.0/download - ---- LICENSE-APACHE --- - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - ---- LICENSE-MIT --- -Copyright (c) 2016 The humantime Developers - -Includes parts of http date with the following copyright: -Copyright (c) 2016 Pyfisch - -Includes portions of musl libc with the following copyright: -Copyright © 2005-2013 Rich Felker - - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -hyper-rustls 0.27.7 -Declared license: Apache-2.0 OR ISC OR MIT -Source: https://crates.io/api/v1/crates/hyper-rustls/0.27.7/download - ---- LICENSE --- -hyper-rustls is distributed under the following three licenses: - -- Apache License version 2.0. -- MIT license. -- ISC license. - -These are included as LICENSE-APACHE, LICENSE-MIT and LICENSE-ISC -respectively. You may use this software under the terms of any -of these licenses, at your option. - - ---- LICENSE-APACHE --- - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - ---- LICENSE-ISC --- -ISC License (ISC) -Copyright (c) 2016, Joseph Birr-Pixton - -Permission to use, copy, modify, and/or distribute this software for -any purpose with or without fee is hereby granted, provided that the -above copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL -WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE -AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL -DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR -PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS -ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. - ---- LICENSE-MIT --- -Copyright (c) 2016 Joseph Birr-Pixton - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - - -md-5 0.10.6 -Declared license: MIT OR Apache-2.0 -Source: https://crates.io/api/v1/crates/md-5/0.10.6/download - ---- LICENSE-APACHE --- - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - ---- LICENSE-MIT --- -Copyright (c) 2006-2009 Graydon Hoare -Copyright (c) 2009-2013 Mozilla Foundation -Copyright (c) 2016 Artyom Pavlov - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - - -object_store 0.12.4 -Declared license: MIT/Apache-2.0 -Source: https://crates.io/api/v1/crates/object_store/0.12.4/download - ---- LICENSE.txt --- - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - - ---- NOTICE.txt --- -Apache Arrow Object Store -Copyright 2020-2024 The Apache Software Foundation - -This product includes software developed at -The Apache Software Foundation (http://www.apache.org/). - - -openssl-probe 0.2.1 -Declared license: MIT OR Apache-2.0 -Source: https://crates.io/api/v1/crates/openssl-probe/0.2.1/download - ---- LICENSE-APACHE --- - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - ---- LICENSE-MIT --- -Copyright (c) 2014 Alex Crichton - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - - -quick-xml 0.38.4 -Declared license: MIT -Source: https://crates.io/api/v1/crates/quick-xml/0.38.4/download - ---- LICENSE-MIT.md --- -The MIT License (MIT) - -Copyright (c) 2016 Johann Tuffe - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - -ring 0.17.14 -Declared license: Apache-2.0 AND ISC -Source: https://crates.io/api/v1/crates/ring/0.17.14/download - ---- LICENSE --- -*ring* uses an "ISC" license, like BoringSSL used to use, for new code -files. See LICENSE-other-bits for the text of that license. - -See LICENSE-BoringSSL for code that was sourced from BoringSSL under the -Apache 2.0 license. Some code that was sourced from BoringSSL under the ISC -license. In each case, the license info is at the top of the file. - -See src/polyfill/once_cell/LICENSE-APACHE and src/polyfill/once_cell/LICENSE-MIT -for the license to code that was sourced from the once_cell project. - ---- LICENSE-BoringSSL --- - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - -Licenses for support code -------------------------- - -Parts of the TLS test suite are under the Go license. This code is not included -in BoringSSL (i.e. libcrypto and libssl) when compiled, however, so -distributing code linked against BoringSSL does not trigger this license: - -Copyright (c) 2009 The Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -BoringSSL uses the Chromium test infrastructure to run a continuous build, -trybots etc. The scripts which manage this, and the script for generating build -metadata, are under the Chromium license. Distributing code linked against -BoringSSL does not trigger this license. - -Copyright 2015 The Chromium Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - ---- LICENSE-other-bits --- -Copyright 2015-2025 Brian Smith. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - ---- src/polyfill/once_cell/LICENSE-APACHE --- - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - ---- src/polyfill/once_cell/LICENSE-MIT --- -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHOR OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - ---- third_party/fiat/LICENSE --- -The Apache License, Version 2.0 (Apache-2.0) - -Copyright 2015-2020 the fiat-crypto authors (see the AUTHORS file) - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - - -rustls 0.23.45 -Declared license: Apache-2.0 OR ISC OR MIT -Source: https://crates.io/api/v1/crates/rustls/0.23.45/download - ---- LICENSE-APACHE --- - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - ---- LICENSE-ISC --- -ISC License (ISC) -Copyright (c) 2016, Joseph Birr-Pixton - -Permission to use, copy, modify, and/or distribute this software for -any purpose with or without fee is hereby granted, provided that the -above copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL -WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE -AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL -DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR -PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS -ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. - ---- LICENSE-MIT --- -Copyright (c) 2016 Joseph Birr-Pixton - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - - -rustls-native-certs 0.8.4 -Declared license: Apache-2.0 OR ISC OR MIT -Source: https://crates.io/api/v1/crates/rustls-native-certs/0.8.4/download - ---- LICENSE --- -Rustls is distributed under the following three licenses: - -- Apache License version 2.0. -- MIT license. -- ISC license. - -These are included as LICENSE-APACHE, LICENSE-MIT and LICENSE-ISC -respectively. You may use this software under the terms of any -of these licenses, at your option. - - ---- LICENSE-APACHE --- - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - ---- LICENSE-ISC --- -ISC License (ISC) -Copyright (c) 2016, Joseph Birr-Pixton - -Permission to use, copy, modify, and/or distribute this software for -any purpose with or without fee is hereby granted, provided that the -above copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL -WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE -AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL -DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR -PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS -ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF -THIS SOFTWARE. - ---- LICENSE-MIT --- -Copyright (c) 2016 Joseph Birr-Pixton - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - - -rustls-webpki 0.103.15 -Declared license: ISC -Source: https://crates.io/api/v1/crates/rustls-webpki/0.103.15/download - ---- LICENSE --- -Except as otherwise noted, this project is licensed under the following -(ISC-style) terms: - -Copyright 2015 Brian Smith. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -The files under third-party/chromium are licensed as described in -third-party/chromium/LICENSE. - - -security-framework 3.5.1 -Declared license: MIT OR Apache-2.0 -Source: https://crates.io/api/v1/crates/security-framework/3.5.1/download - ---- LICENSE-APACHE --- - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - ---- LICENSE-MIT --- -The MIT License (MIT) - -Copyright (c) 2015 Steven Fackler - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - -subtle 2.6.1 -Declared license: BSD-3-Clause -Source: https://crates.io/api/v1/crates/subtle/2.6.1/download - ---- LICENSE --- -Copyright (c) 2016-2017 Isis Agora Lovecruft, Henry de Valence. All rights reserved. -Copyright (c) 2016-2024 Isis Agora Lovecruft. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -tokio-rustls 0.26.4 -Declared license: MIT OR Apache-2.0 -Source: https://crates.io/api/v1/crates/tokio-rustls/0.26.4/download - ---- LICENSE-APACHE --- - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - -Copyright 2017 quininer kel - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - ---- LICENSE-MIT --- -Copyright (c) 2017 quininer kel - -Permission is hereby granted, free of charge, to any -person obtaining a copy of this software and associated -documentation files (the "Software"), to deal in the -Software without restriction, including without -limitation the rights to use, copy, modify, merge, -publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software -is furnished to do so, subject to the following -conditions: - -The above copyright notice and this permission notice -shall be included in all copies or substantial portions -of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. - - -untrusted 0.9.0 -Declared license: ISC -Source: https://crates.io/api/v1/crates/untrusted/0.9.0/download - ---- LICENSE.txt --- -// Copyright 2015-2016 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR -// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - diff --git a/docs/plans/artifact-acquisition/reports/s3-reconciliation-qualification-2026-10-05.md b/docs/plans/artifact-acquisition/reports/s3-reconciliation-qualification-2026-10-05.md deleted file mode 100644 index e07aa49e1..000000000 --- a/docs/plans/artifact-acquisition/reports/s3-reconciliation-qualification-2026-10-05.md +++ /dev/null @@ -1,100 +0,0 @@ -# Confirmed S3 model publication reconciliation - -**Review correction:** Independent review found acquired recovery could accept missing/null publication identities through legacy readiness helpers, skipping held payload proof. The earlier focused checks did not cover this defect. See [bounded proof repair](s3-publication-proof-repair-2026-10-05.md); this report's output-proof claim is superseded for that gap. - -Branch: `feat/acquisition-s3-reconcile-e1ee893f`. Parent candidate: -`e1ee893ff67752bdc839a067f15519f25a323c1a`, tree -`b449f2c88d3e34a9cfa16dd14c778d6b802c8495`. Accepted reader -`2c7d6014658ef44575f3724f0ff6e7395f1fd7d8` and accepted main -`96c2dca97fad673a2735f9f778013067569fe692` remain ancestors. The prior reviewed -branch and reader PR38 are preserved. Coordinator owns PR/review/integration. - -## Selected acceptance and authority - -Contract section 9 requires exact consumer-generation reconciliation when -domain commit precedes acquisition acknowledgement. AC05 includes no repeated -side effects and retained uncertainty across reopen. This successor implements -that bounded window for the anonymous, single-GGUF S3 path through the existing -copied importer. It does not advance the complete AC05 or AQ-S3 gate. - -The existing publication authority persists the exact issued consumer receipt -inside its model output receipt before publication. Source, manifest, demand, -workspace, lease, verified files and serialized import intent are bound there. -The acquisition service remains authoritative for its own current receipt and -use generation. Recovery passes through `AcquisitionConsumer::reconcile`; -`ModelImporter::reconcile_acquired_gguf` only observes candidate model output. -No parallel acquisition store, retry owner, installer or recovery writer is added. - -The output proof requires a primary canonical model record, an acknowledged -Ready index with the same publication identity, exact model ID and acquisition -binding, a Confirmed publication receipt, held physical root/payload identity, -complete payload hashing, and the single verified input size/digest. The model -ID is a lookup candidate, not a path or authority receipt. Held model-root -authority and acquisition custody survive the registered blocking observation. -Completed read-only refusal is a nested observation result, not an unresolved -producer effect; join failures still belong to the task owner. Only the existing -consumer settles the proven exact use. No network, copying, index repair, -Pending promotion, output deletion or workspace reclamation occurs here. - -## Persisted contract disposition - -Ordinary copied imports still emit receipt version 1, with unchanged serialization -and no acquisition field. That retained format remains readable. Acquired copies -emit version 2 and require an acquisition binding. The decoder explicitly accepts -`1 + no binding` or `2 + binding`, and rejects other version/binding combinations. -The existing model-metadata publication identity remains version 1; this is a -different representation from the physical output receipt. - -Old version-1 outputs created by the dispatch-only candidate are not silently -upgraded or treated as proof of an interrupted acquisition. Their model readiness -remains supported; their unbound acquisition settlement remains unresolved. -No live-root migration or rollback claim is made. An older reader rejects new -version-2 receipts; coordinator must own any deployed consumer cutover. The -canonical acquisition schema and all dependency/lock/license inputs are unchanged. - -## Evidence and honest limits - -Final source local qualification passed: 20 S3 dispatch/import/reconciliation -integration cases, 11 reader fixtures and five HTTP integration cases (36 total), -strict enabled-S3 all-target Clippy, actual headless compile, 12 feature contracts, -canonical attribution/dependency ownership, formatting and 20 release/workflow -contract tests. These are Linux x86_64 locked/offline checks with Rust 1.92 and -existing shared targets. Task-local XDG configuration, one build job and -command-local root-package debug/incremental/strip overrides fit constrained disk. -No complete unit/default ONNX suite or hosted execution is claimed. Runtime logs, -command arrays, source hashes and cache-retirement hashes accompany the handoff. -The ordinary copied-import control observes a version-1 output with no acquisition -field and Ready canonical metadata. The confirmed cold control settles Using to -Adopted, repeats output proof, preserves original input/output bytes, and observes -Ready through the independent read-only selector. All seven negative controls -retain their post-startup model/index/store/workspace evidence and observe only -the initial two source requests through shutdown. - -The first check exposed a private helper -visibility and unnecessary Eq derive; both were corrected without widening public -types. The first integration run had 15 passes and five failures. A read-only -changed-output refusal was counted as a failed blocking effect by the original -observation wrapper. Several negative fixtures also tried to treat restored -fixture bytes as authority to repair a cold-start unavailable index. The observer -now separates observation refusal from effect failure; negative fixtures retain -their actual unresolved state instead of restoring it or expecting index repair. - -Fixtures use a loopback S3-compatible HTTP/1.1 source and a synthetic 24-byte GGUF, -the real shared service/copied publisher, fresh same-process owner/root reopening, -primary files, the actual index and an independent read-only library selector. -The protocol listener remains alive during recovery to count any request replay. -Negative fixtures mutate only disposable evidence after completed model publication; -the Pending case tests refusal of Pending-shaped output, not a process killed -at the producer's Pending boundary. Startup may apply its existing unavailable -index projection; reconciliation itself is compared with a post-startup baseline. - -No hard process/power loss, complete interruption matrix, pending-output -finalization, old-writer isolation, deployed-root migration, native cross-platform -build, full unit/default ONNX suite, live AWS/non-AWS/MinIO, credentials, -multi-file import, desktop/RPC source workflow, packaged consumer, real weights -or inference is qualified. Exact-head hosted execution and independent review -remain pending. AQ-S3 remains not ready. - -The next required source capability is complete explicit multi-file selection -and consumer composition, plus a source-facing application workflow. Provider -and credential qualification remains separately authorized. diff --git a/docs/plans/artifact-acquisition/reports/s3-release-attribution-2026-10-06.md b/docs/plans/artifact-acquisition/reports/s3-release-attribution-2026-10-06.md deleted file mode 100644 index 5cb3cdc84..000000000 --- a/docs/plans/artifact-acquisition/reports/s3-release-attribution-2026-10-06.md +++ /dev/null @@ -1,68 +0,0 @@ -# S3 release profile attribution and qualification - -Successor branch `feat/s3-prefix-main95` starts exactly from integrated checkpoint -`7cf17383001d582056ac4299803c83d0f9ae68a7`, tree -`046771b37c9a9f563936376539301b3225b48656`. Approved main95 and the reviewed -SDK9077, AC0810f and HF4eb remain ancestors; frozen evidence is preserved. - -The existing generator now accepts an explicit `--features s3` profile, selecting -`pumas-rpc` defaults plus S3 across the three desktop targets. Both metadata and -normal/build graph collection use that feature selection. The generator refuses -missing selected Rust notices. Inventories record the package, defaults, features, -targets and exact union of Rust versions; the checker rejects profile mismatch, -duplicate/missing closure entries or S3 inventories without the SDK owner. -Default legacy inventories remain readable; the regenerated default inventory -also carries the explicit profile. No new Rust API or dependency is introduced -by this first milestone. - -`docs/release-attribution/0.7.0-s3` contains 414 entries and 387 Rust versions, -covering all 365 default notice entries plus 49 additional versions. These are -normal/build and runtime-notice supersets, not claims that every component is -linked or bundled. SIMD license text comes from previously qualified immutable -upstream evidence; its hash matches the frozen SDK collection. It is retained -under `scripts/release/licenses` with the exact declared crate revision. No -runtime, credentials or provider account was obtained or provisioned. - -Both generators/checkers, eight attribution tests, eleven release contract -tests, dependency ownership and Python syntax checks pass. The expanded feature -checker passes 33 graph contracts: the existing 21 and twelve S3 default/headless -core/RPC combinations. The graphs retain dynamic ONNX loading/disable-linking -and reject download, copy and ONNX TLS features, ambient credential loaders, -hidden object-store owners and default AWS HTTP transports. Graph validation -does not establish cross-platform builds. Production default-plus-S3 RPC compiles -with locked offline Cargo and no test-support; all 302 default-plus-S3 RPC tests -pass (the Cargo test graph includes its existing dev fixtures). No ONNX runtime download or inference -acceptance is implied. - -CI now validates both attribution profiles and S3 feature graphs, and explicitly -runs S3 signing/discovery units in its existing enabled-S3 job. No hosted run was -started or claimed. S3 distributions must use this profile's notices; unchanged -default packaging alone is not an S3 packaging certification. - -Two intermediate failures are retained: the new identity projection initially -encountered an empty Cargo-tree row (`ValueError`, fixed by ignoring empty rows); -the first S3 selection still used default-only metadata and emitted 365 entries. -The new checker actually rejected that missing closure; the corrected generator -emits 414 and the regression refuses a selected SDK absent from metadata. - -Logs are under `/workspace/scratch/s3-prefix-main95/`, including -`attribution-empty-tree-row-intermediate.log`, `attribution-s3-metadata-omission-red.log`, -the generator/check/test logs, `feature-contracts.log`, `release-contracts.log`, -`dependency-ownership.log`, `rpc-release-profile-check.log` and -`rpc-release-profile-tests.log`. Tight disk space required retiring named, -superseded debug test executables and recomputable incremental caches; retirement -paths and executable hashes were saved first. Source, frozen logs and packaged -qualification evidence remain intact. - -The next admitted write set is bounded prefix discovery: core S3 reader/SDK and -new prefix/XML-guard/test children, optional roxmltree dependency and lock, -acquisition exports, focused S3 model-workflow integration tests, README/contract, -current acquisition plan/ledger and successor qualification/review reports. -`s3/manifest.rs`, watcher, importer/recovery, stores, retry/verification/receipt -formats and ONNX source remain outside that write set. Every page and listed -object stays under one SDK and caller-provided bounds. Listings receive exact -XML/SDK agreement validation; only complete enumeration followed by checked -immutable HEAD observations returns discovery results. Caller-provided digests -and explicit manifest/import owners remain required. No PR mutations are made; -parent coordinates publication and independent review. Provider/platform gates -remain pending. diff --git a/docs/plans/artifact-acquisition/reports/s3-sdk-reader-replacement-2026-10-06.md b/docs/plans/artifact-acquisition/reports/s3-sdk-reader-replacement-2026-10-06.md deleted file mode 100644 index f79b52676..000000000 --- a/docs/plans/artifact-acquisition/reports/s3-sdk-reader-replacement-2026-10-06.md +++ /dev/null @@ -1,252 +0,0 @@ -# Production S3 SDK reader replacement qualification - -The isolated replacement branch `feat/s3-sdk-reader-493b935c` starts at -`493b935c6a41d4d4aeca8e8a66f10b4aba114365`, tree -`ecb51f20c0740fa7d88e6d0eface06c45feb2e07`: the composed authenticated reader, -including accepted PR40 discovery/VersionId repairs. It preserves the reviewed -spike `ba1a9d908010f23f2391059cb93bfe61dcca6aa1`, tree -`fee4b11a76306bcf224abbd8b11811e329ca0483`, as an independent checkpoint. -HF and AC08 successors remain separate branches. Parent owns PRs, reviews and -integration; this is local synthetic qualification, not live-provider acceptance. - -## Result and scope - -Production uses one maintained AWS SDK protocol/credential owner over the -existing reqwest client pool. `object_store` and its connector are removed with -no fallback. Public `S3ReaderConfig`, `S3Reader::new`, `S3Credentials::new` and -`S3Reader::new_authenticated`, selection/range/manifest methods and consumer/RPC -contracts keep their signatures. Anonymous construction supplies no credentials; -authenticated construction consumes explicit in-memory credentials with optional -session token. HTTPS remains mandatory in production. Literal-loopback plaintext -credential transport exists only in private unit-test builds. - -The fixed endpoint resolver checks the configured bucket, and transport checks -origin, GET/HEAD and empty request body. Existing no-proxy, no-redirect, no-HTTP- -retry configuration remains. SDK retries, identity caching, S3 Express session -authentication and multi-region access points are disabled. SDK stalled-stream -protection is also disabled so its default five-second grace period cannot -override the caller's sole operation/transfer budget. There is no ambient -provider, refresh, credential persistence or anonymous fallback. - -HEAD checks exact VersionId, strong ETag and known nonnegative size. GET retains -VersionId plus If-Match, requires a partial response, checks full size and exact -half-open range before writes, and retains body length/destination/operation -budgets. GET carries the SDK-standard `x-id=GetObject` query marker alongside -the same immutable VersionId; it does not alter artifact or continuation identity. -The signature oracle sorts encoded query pairs as SigV4 requires rather than -assuming wire order. Empty members keep the existing HEAD-only protocol plus shared verifier -and receipt path. Source identities remain the same endpoint/addressing/bucket/ -key/VersionId tuple and exclude credentials. The private key wrapper retains the -previous exact-key segment rules so frozen `acquisition/s3/manifest.rs` stays -byte-identical; no importer/watcher/native repair owner changes. - -SDK construction, entire operation futures and each body poll use a scoped -NoSubscriber because upstream TRACE can expose access-key IDs before transport -header redaction. The embedding application's global subscriber and outer safe -status events remain active. Authorization/session-token headers are marked -sensitive before reqwest. Public errors retain fixed safe messages; remote error -bodies are capped at 1 MiB before SDK parsing and are never exposed in receipts, -cache or durable diagnostics. - -The reviewed XML guard is for ListObjectsV2, not model bytes. This HEAD/range-GET -slice contains no listing route; XML/cardinality/exact-value guard integration -belongs to the next prefix enumeration slice. No namespace, pagination or prefix -snapshot acceptance is claimed here. - -## Actual dependency delta - -Rust 1.92 resolves the production lock offline from the original lock, retaining -existing versions unless required by the new owner. A discarded full-regeneration -attempt selected unrelated upgrades and encountered uncached tokio-macros; it is -not the delivered lock. Final lock: 482 to 511 package versions, 51 added and 22 -removed (net +29). Existing-name replacements are md-5, proc-macro2 and quote. -The latter two satisfy the added Smithy macro dependency; md-5 belongs to the SDK -checksum implementation replacing the removed storage backend's version. - -For core with no defaults and `s3,hf-client`, the normal/build closure changes -239 to 276 package versions: 53 added, 16 removed, 43 new names (net +37). -This is the actual production closure rather than the standalone spike's gross -count. The old reader's Rustls/native-certificate transport closure drops out; -reqwest continues its ordinary default TLS peer verification. There is no -`aws-config`, default AWS HTTP client, alternative production cloud/backend -owner, new XML DOM dependency or SDK SigV4a feature. - -Direct optional dependencies are pinned `aws-sdk-s3` 1.137.0 (`rt-tokio`, -`http-1x`, defaults disabled), `aws-credential-types` 1.2.14, -`aws-smithy-runtime-api` 1.12.3 (`client`, `http-1x`), `aws-smithy-types` 1.5.0 -(`http-body-1-x`), and the already locked HTTP bridge crates `http` 1.4.0, -`http-body` 1.0.1, `http-body-util` 0.1.3. The already locked tracing subscriber -is a test-only direct dependency for isolated global-TRACE regression evidence. - -Internal evidence lives in `/workspace/scratch/s3-sdk-reader/`, including -`dependency-tree.log`, `base-dependency-tree.log` and `sdk-features.log`. - -### Lock additions - -- `allocator-api2` 0.2.21 -- `arc-swap` 1.9.2 -- `aws-credential-types` 1.2.14 -- `aws-runtime` 1.7.5 -- `aws-sdk-s3` 1.137.0 -- `aws-sigv4` 1.4.5 -- `aws-smithy-async` 1.2.14 -- `aws-smithy-checksums` 0.64.8 -- `aws-smithy-eventstream` 0.60.21 -- `aws-smithy-http` 0.63.6 -- `aws-smithy-json` 0.62.7 -- `aws-smithy-observability` 0.2.6 -- `aws-smithy-runtime` 1.11.3 -- `aws-smithy-runtime-api` 1.12.3 -- `aws-smithy-runtime-api-macros` 1.0.0 -- `aws-smithy-schema` 0.1.0 -- `aws-smithy-types` 1.5.0 -- `aws-smithy-xml` 0.60.15 -- `aws-types` 1.3.16 -- `base64-simd` 0.8.0 -- `block-buffer` 0.12.1 -- `bytes-utils` 0.1.4 -- `cmov` 0.5.4 -- `const-oid` 0.10.2 -- `crc-fast` 1.10.0 -- `crypto-common` 0.2.2 -- `ctutils` 0.4.2 -- `deranged` 0.5.8 -- `digest` 0.11.3 -- `foldhash` 0.2.0 -- `hmac` 0.13.0 -- `http` 0.2.12 -- `http-body` 0.4.6 -- `hybrid-array` 0.4.10 -- `lru` 0.16.4 -- `md-5` 0.11.0 -- `num-conv` 0.2.2 -- `outref` 0.5.2 -- `powerfmt` 0.2.1 -- `proc-macro2` 1.0.107 -- `quote` 1.0.47 -- `regex-lite` 0.1.9 -- `rustc_version` 0.4.1 -- `sha1` 0.11.0 -- `sha2` 0.11.0 -- `spin` 0.10.1 -- `time` 0.3.55 -- `time-core` 0.1.9 -- `time-macros` 0.2.32 -- `vsimd` 0.8.0 -- `xmlparser` 0.13.6 - -### Lock removals - -- `chacha20` 0.10.2 -- `core-foundation` 0.10.1 -- `getrandom` 0.4.3 -- `humantime` 2.4.0 -- `lru-slab` 0.1.3 -- `md-5` 0.10.6 -- `object_store` 0.12.4 -- `openssl-probe` 0.2.1 -- `proc-macro2` 1.0.105 -- `quick-xml` 0.38.4 -- `quinn` 0.11.12 -- `quinn-proto` 0.11.19 -- `quinn-udp` 0.5.16 -- `quote` 1.0.43 -- `r-efi` 6.0.0 -- `rand` 0.10.3 -- `rand_core` 0.10.1 -- `rand_pcg` 0.10.2 -- `rustc-hash` 2.1.3 -- `rustls-native-certs` 0.8.4 -- `security-framework` 3.5.1 -- `web-time` 1.1.0 - -## Qualification - -Rust/Cargo 1.92, locked/offline, one worker, debug level zero and incremental -compilation disabled qualified the source with `s3,hf-client,test-support` and -no default inference features. Actual successful executions: - -| Check | Result | -| --- | --- | -| Focused production S3 unit cases | 13 passed; isolated global-TRACE child executed by its passing parent (one separately ignored entry) | -| Broader acquisition unit filter | 156 passed; same child executed by its parent | -| S3 acquisition integrations | 44 passed | -| Native S3 model workflow | 7 passed; an additional cold-process child execution appears in the log | -| Anonymous/public reader integration | 14 passed, including a six-second body stall within the caller's 12-second budget | -| Inference-disabled S3 RPC | 202 passed; cold-process child executed | -| Strict core Clippy | All targets passed with SDK/consumer fixtures enabled | -| Strict RPC Clippy | Production binary passed with S3 enabled and inference disabled | -| Feature-off core | Locked/offline compilation passed | -| Formatting/diff | Passed | - -The independent RFC-anchored signature oracle verifies HEAD/GET in both -addressing styles, no token/optional token, and tampered secret/key/version/ -range/If-Match/token controls. Anonymous requests remain unsigned. Credential -validation/debug, mandatory production HTTPS despite HTTP opt-in, literal-loopback -unit-only credential fixtures, endpoint/proxy/redirect/retry constraints, -manifest/acquisition/receipt identity and persisted secret exclusion all pass. -The new fresh-process global-TRACE case checks construction, selection, range -body polls, acquisition body capability and reflected SDK errors while observing -outer safe selecting/verified statuses. The new GET error probe exceeds 1 MiB, -leaves its response unfinished and observes refusal plus connection closure -before the caller's five-second deadline, without destination writes. A different -SDK bucket is refused before source I/O. - -Logs are under `/workspace/scratch/s3-sdk-reader/`: `unit-final.log`, -`acquisition-final.log`, `integration-final.log`, `rpc-final.log`, -`clippy-core-final.log`, `clippy-rpc-production-final.log`, -`feature-off-final.log` and `fmt-final.log`. Behavior tests preceded a final -field-shorthand-only Clippy cleanup; final all-target compilation/lint checks -use the delivered source. Intermediates are retained: the full-lock regeneration -and initial compile errors; two signature-oracle failures before encoded query -sorting; the body-bound probe's incorrect HEAD fixture before moving it to GET; -and consumer setup failures before the standard task-local XDG configuration -path replaced the read-only home registry location. No product registry or -sandbox exception was added. - -An additional broader strict RPC test-target pass fails on 11 inference-disabled -Torch DTO dead-code warnings in unchanged `contract.rs`. The same warnings appear -in the otherwise passing 202-case run. Their source is byte-identical to the -base; no lint suppression or frozen RPC-contract edit is included. This broader -lint scope remains an integration limitation, recorded in -`clippy-rpc-test-target-limit.log`. - -## Dependency and attribution evidence - -The existing repository feature checker passes all 12 default/headless/fixture -contracts; workspace dependency ownership passes. Explicit S3 normal/build -graphs additionally pass for Linux (276 package versions), macOS (275) and -Windows (282), with no object_store, aws-config, default AWS HTTP client or -inference dependencies. These are dependency graphs, not cross-platform builds. -Logs: `feature-contracts.log`, `dependency-ownership.log`, -`sdk-target-closure.log`, `sdk-features.log` and the two dependency-tree logs. - -The unchanged canonical notice generator produced and validated an isolated -374-entry default-release candidate at `attribution-candidate/`; its input hashes -match this branch. Cached frontend/Electron dependencies were linked only after -manifest/lock byte comparison with the base workspace, then those exact links -were retired. Shared canonical release outputs and generator remain untouched; -parent integration must regenerate attribution for the final merged release -profile. - -Authoritative license texts cover all 51 added lock versions and all 311 external -versions in the three-platform optional S3 union. Internal inventories are -`sdk-added-license-inventory.json`, `sdk-full-closure-license-inventory.json` and -`sdk-added-third-party-notices.txt`. `base64-simd`/`vsimd` 0.8.0 omit license text -from their cached crates. Both declare MIT and identify upstream commit -`d74c030d9dc4f3cae02146d1f497ff62726ef09a`; its -[repository LICENSE](https://raw.githubusercontent.com/Nugine/simd/d74c030d9dc4f3cae02146d1f497ff62726ef09a/LICENSE) -was fetched anonymously over normal verified HTTPS, with SHA-256 -`71674605ec4c087fe9eb534e3e4f9e26eb2e4aabcd76a29fd156c6a844d44b3d`. -No missing terms were invented. The older checked-in optional-reader inventory -belongs to its original object_store milestone; the new internal inventory is -review evidence for the parent's optional-S3 distribution attribution update. - -## Remaining scope - -No real credentials, account provisioning, paid services, external reviewers, -ONNX build downloads or browser access workarounds were used. Actual-provider, -installed/platform, inference, full desktop/assistive-technology and acquisition -gate acceptance remain separate. The next existing-plan feature is bounded -explicit S3 prefix enumeration with the accepted ListObjectsV2 XML/cardinality/ -exact-value guard, after parent review/integration of this reader replacement. diff --git a/docs/plans/artifact-acquisition/reports/s3-staging-discovery-qualification.md b/docs/plans/artifact-acquisition/reports/s3-staging-discovery-qualification.md deleted file mode 100644 index c369d5627..000000000 --- a/docs/plans/artifact-acquisition/reports/s3-staging-discovery-qualification.md +++ /dev/null @@ -1,127 +0,0 @@ -# S3 staging discovery qualification - -## Source and checked boundaries - -The non-force push of `fix/import-discovery-s3-version` was verified by fetching -the remote branch: tip `a606c80b0be41580c7af0583703d9f9af5f2cb44`, parent -`cab3891232942d9e13d8cb8b74184f13cd2aa747`, over merged PR39 -`05717338c2aea737483fb4b28c3ed4053a65de96`. - -Those fixes passed 32 reconciliation tests, 40 S3 acquisition tests, 11 S3 reader -tests, strict enabled-S3 all-target core Clippy, formatting and diff checks. -The discovery regressions failed before staging-event exclusion. The distinct -VersionId regression failed with `Manifest(ConflictingSourceEvidence)` before -version-qualified manifest keys. Same-key/same-version digest and size conflicts -remain refused; consistent evidence may serve two distinct logical paths. - -The `5fb3f1ea` successor changed only tests and qualification documentation. Its -production source retained the two fixes above. The added test is -`manifest::staging_acceptance::large_s3_bundle_with_live_watcher_publishes_and_cold_recovers`; -its source blob is `65c0f54ada03ac23d18145c661db78aa1e3af02e`. - -## Payload-name review correction - -The original watcher filter also hid accepted final payload basenames such as -`llm/family/model/.tmp_import_weights.gguf`. Staging exclusion now applies to -directory positions and ancestors, plus existing nested directories, rather than -every prefixed leaf. Deleted stage descendants and root-level staging-directory -events remain excluded. A missing prefixed leaf below the model root is -conservatively visible because the path-only callback cannot prove it was a -directory. Import admission and version-qualified S3 manifest keys are unchanged. - -New regressions cover raw Modify/Remove event forwarding and mixed staging and -published-payload batches retaining the model's dirty mark. These Rust regressions -require exact-head hosted qualification; the historical results below do not -claim to execute this correction. - -## Hosted publication/discovery race correction - -Exact-head hosted execution at `63123fd8f9f866064a8315096ab3fb1fc81e8f0f` -reported 39 passing and two failing S3 acquisition cases in -[the headless integration job](https://github.com/MrScripty/Pumas-Library/actions/runs/37326608913/job/111819229166). -The live-watcher case reached owner shutdown with a background reconciliation -failure: discovery attempted to reclassify an unacknowledged copied publication. -Source inspection also found discovery could rewrite its Pending index snapshot -before the producer's conditional Ready commit. A two-second notification -suppression does not provide publication ownership. - -Unacknowledged copied-publication observations now acquire the existing native -root grant, reread their evidence, and retain exclusion through conditional -index projection. Busy observations defer through the existing reconciliation -path. Terminal unavailable publications retain diagnostic projection, but are -not reclassified. Legacy and acknowledged Ready projections keep their existing -paths. No new publication owner or recovery API is added. - -The second failure, `missing_index_publication_identity_cannot_settle_changed_output`, -reported only `RecvError`: its fixture awaited a dropped callback before checking -the acquisition/import result. The fixture now reports that underlying result -first; this log cannot establish that it shares the first failure's cause. -Deterministic regressions cover live Pending/Ready-metadata observation, deferred -owner shutdown, cold admission exclusion, and preserved terminal diagnostics. -These changes require fresh exact-head hosted Rust qualification; the historical -passing runs below do not qualify this correction. - -## Normal workflow evidence - -On Linux x86_64 with pinned Rust 1.92.0, the real anonymous loopback S3 reader -resolves two exact versions, verifies one GGUF and a JSON auxiliary just over -3 MiB, and carries a valid import-spec callback just over 3 MiB (below the -existing 4 MiB admission bound). Pumas' normal metadata notifier and watcher -remain intact. A separate read-only OS watcher must observe the nested config -file event under the actual temporary-import directory; absence of that event -fails the test rather than being reported as coverage. - -The importer must publish successfully. The public `get_model` operation must -return the published ID, with one discovered model directory and exact auxiliary -bytes. Consumer use must be Adopted. Consumer and API shutdown must succeed. -After closing the first owner, a new owner proves the complete output through -the existing bundle reconciliation operation. Publication receipt bytes, -auxiliary bytes and the adopted acquisition record stay unchanged. The source -observes exactly four requests across transfer and cold proof, proving recovery -does not replay source access. Acquisition/import, staging-event observation, -public `get_model`, and both API close calls have explicit 30-second deadlines. -Cold reconciliation and consumer shutdown are not individually timeout-wrapped; -the enclosing test command supplies the overall timeout. - -The new test passed alone and in the focused aggregate. Final results: 41 S3 -acquisition tests, 11 reader tests and five HTTP acquisition tests passed, with -zero failed or ignored tests. Strict core Clippy with warnings denied passed for -all targets with S3/test-support enabled. Formatting and diff checks passed. - -From the repository root, after activating the retained Rust toolchain: - -```bash -export PUMAS_REGISTRY_DB_PATH=/workspace/.pumas-tools/s3-test-registry.db -export CARGO_PROFILE_TEST_DEBUG=0 -timeout 1200 cargo test --locked --manifest-path rust/Cargo.toml \ - -p pumas-library --no-default-features --features s3,test-support \ - --test s3_acquisition --test s3_reader --test artifact_acquisition -j 4 -CARGO_PROFILE_DEV_DEBUG=0 timeout 1200 cargo clippy --locked \ - --manifest-path rust/Cargo.toml -p pumas-library --no-default-features \ - --features s3,test-support --all-targets -j 4 -- -D warnings -./scripts/rust/check.sh fmt -git diff --check -``` - -Registry state is disposable local test configuration, not a credential. -Logs are retained in `/workspace/.pumas-tools/s3-acceptance-suite.log` and -`/workspace/.pumas-tools/s3-acceptance-clippy.log`. - -## Failed experiment and limits - -The first fixture replaced the public metadata notifier with a blocking staging -barrier. That replacement also removed the builder's normal watcher suppression; -the run failed with a post-publication optimistic index conflict. Its source and -log remain in `/workspace/.pumas-tools/s3-staging-notifier-experiment.rs` and -`/workspace/.pumas-tools/s3-staging-notifier-experiment.log`. It is not passing -acceptance evidence. The final fixture leaves the normal notifier intact and -observes the real workflow instead. Custom-notifier composition remains -unqualified. The separately committed reconciliation tests own deterministic -stage exclusion and visibility of final publication events. - -This adds local AC13/AC14 supporting evidence only. It does not establish measured -resource ceilings, every interruption boundary, hard kill/power loss, sharded -weights, live AWS/non-AWS/MinIO, authenticated or refreshing credentials, -source-facing desktop configuration, hosted review/CI, or native/GPU inference. -No credentials, permissions, network policy, speed, credits or privacy settings -were changed. AQ-S3 and the full acceptance criteria remain not ready. diff --git a/docs/plans/artifact-acquisition/reports/write-sets.md b/docs/plans/artifact-acquisition/reports/write-sets.md index fc9a7a013..21103dd23 100644 --- a/docs/plans/artifact-acquisition/reports/write-sets.md +++ b/docs/plans/artifact-acquisition/reports/write-sets.md @@ -7,7 +7,7 @@ These are the admitted exact paths/closed path families. The actual source files Parent admits exactly one pre-FilesReady Linux process-loss milestone from frozen ed31639 on `feat/s3-installed-process-loss-ed31639`. Only the existing installed harness, its focused provenance/harness tests, owning plan/ledger/write-set and -the [process-loss report](s3-installed-process-loss-2026-10-06.md) with matching +the process-loss report (`s3-installed-process-loss-2026-10-06.md`, removed; see Git history) with matching JSON evidence may change. Preserve the actual qualified production binary and all frozen Rust/native/dependency/ONNX/network settings. Tests and precise boundary/cold-custody claims are recorded in that admission. No further fault @@ -644,7 +644,7 @@ Any source/test path or byte change invalidates the frozen fingerprint and requi ### AC09 independent native bootstrap and repeated shutdown — admitted 2026-10-02 -An independent GPT-6.1 Sol High gap review selected `native_independent_acquisition_installs_and_repeated_shutdown_preserves_receipt` to prove successful native bootstrap with an independently constructed acquisition service and repeatable owner drainage. Exact source/test write set: one `#[cfg(all(target_os = "linux", target_arch = "x86_64"))` regression in `rust/crates/pumas-app-manager/src/version_manager/mod.rs`, reusing `native_archive_fixture_with_request_monitor`, `AcquisitionStore`, `AcquisitionService`, `VersionManager::new_with_acquisition`, and the public `install_version("b1234+cpu")` path. Construct the service directly without `PumasApi`; keep the request monitor and fixture server alive through the full test. Observe the controlled metadata and archive requests, positive extraction/output and metadata publication, exact `Adopted` acquisition/completion receipt and queue release, unrelated sentinel preservation, and absence of both the model database and its download-state partition. Await manager shutdown twice and acquisition-service shutdown twice under bounded waits; require both sequences to succeed, then check unchanged installed output/receipt/store state, closed installation admission for a different tag before any source request or filesystem change, and `open_consumer` returning `DownloadLifecycleClosed`. Compare monitored source requests before and after shutdown to prove none occur after settlement. Initial evidence commands are the exact-test filters in default and `--no-default-features` app-manager configurations through `/tmp/pumas-cargo-admission/run-cargo-serialized`; format the touched file and run `git diff --check`. +An independent GPT-6.1 Sol High gap review selected `native_independent_acquisition_installs_and_repeated_shutdown_preserves_receipt` to prove successful native bootstrap with an independently constructed acquisition service and repeatable owner drainage. Exact source/test write set: one `#cfg(all(target_os = "linux", target_arch = "x86_64"))` regression in `rust/crates/pumas-app-manager/src/version_manager/mod.rs`, reusing `native_archive_fixture_with_request_monitor`, `AcquisitionStore`, `AcquisitionService`, `VersionManager::new_with_acquisition`, and the public `install_version("b1234+cpu")` path. Construct the service directly without `PumasApi`; keep the request monitor and fixture server alive through the full test. Observe the controlled metadata and archive requests, positive extraction/output and metadata publication, exact `Adopted` acquisition/completion receipt and queue release, unrelated sentinel preservation, and absence of both the model database and its download-state partition. Await manager shutdown twice and acquisition-service shutdown twice under bounded waits; require both sequences to succeed, then check unchanged installed output/receipt/store state, closed installation admission for a different tag before any source request or filesystem change, and `open_consumer` returning `DownloadLifecycleClosed`. Compare monitored source requests before and after shutdown to prove none occur after settlement. Initial evidence commands are the exact-test filters in default and `--no-default-features` app-manager configurations through `/tmp/pumas-cargo-admission/run-cargo-serialized`; format the touched file and run `git diff --check`. Canonical evidence write set: this `reports/write-sets.md`, `plan.md`, `execution-ledger.md`, `reports/acceptance-matrix.md`, and `reports/dependency-gates.md`. No production logic, public API, generated contract, schema, lockfile, package install, live root, or Runtime R1–R5 write is admitted. This is one Linux x86_64 controlled-source bootstrap/shutdown composition; it does not prove native target platforms, packaged runtime, power-loss durability, resource bounds, process crash, real-source availability or full AC09/AQ-HTTP. Keep AC09 and AQ-HTTP pending unless all matrix requirements pass. @@ -780,7 +780,7 @@ Parent owns PR/review/merge/hosted/Library coordination. ## Q3 authenticated desktop/RPC successor — 2026-10-05 Scope was traced and reported before implementation in -[s3-credential-boundaries-2026-10-05.md](s3-credential-boundaries-2026-10-05.md). +[s3-credential-boundaries-2026-10-05.md (`s3-credential-boundaries-2026-10-05.md`, removed; see Git history). Independent review fixes are frozen on `fix/s3-desktop-review-106a6ca4` at `887308dc`; authenticated successor descends from that tested commit and frozen anonymous `106a6ca4`. Prerequisite `0023bcf9` edits Electron `python-bridge.ts`, @@ -822,7 +822,7 @@ reconciliation/HF/library/publication-observation/test/report changes solely by normal merge, with frozen milestones and refs preserved. Follow-up 5104a21e adds only empty-object refusal fixture and help/docs text. Affected composed lifecycle and full RPC checks were rerun. Qualification/plan/ledger records are the final -docs set. See [report](s3-desktop-bundle-qualification-2026-10-05.md) for public +docs set. See report (`s3-desktop-bundle-qualification-2026-10-05.md`, removed; see Git history) for public surfaces, raw evidence, exact composition and pending browser/default/provider limits. Parent owns PRs/reviews/merges/hosted/Library coordination. @@ -891,7 +891,7 @@ network, lease-through-child cleanup and bootstrap traffic accounting are absent Tested source `8a147160c2b3743c549e00a89b1e48f54d7a2390` (tree `9544e16dde7802baa2033bf7ceea7d44c2ba3767`) changes only the one Linux ignored test/local helpers in `api/hf.rs`. The owning plan, ledger, matrix, gates and -[measurement report](ac10-public-hf-measurement-2026-10-06.md) record two fresh +measurement report (`ac10-public-hf-measurement-2026-10-06.md`, removed; see Git history) record two fresh 512 MiB runs, exact raw-log archive/JSON, independent source review, failed timing attempt and cache/resource manifests. No production hooks, dependencies, public API, S3/native frozen writes or Q2 source changes. All gates remain pending. @@ -928,6 +928,6 @@ Tested source `0950c4d5839608c8dd5f52afcb3fd2424a9a1656` (tree `55c7dea28bae397e admitted shared service owner and co-located tests, plus core README, contract and admission notes. Final source blob `83478facd105a08f8a52e36e6ce9780d09e76d2a` is independently reviewed. Owning plan/ledger/matrix/gates and -[qualification](http-elapsed-budget-qualification-2026-10-06.md) record affected +qualification (`http-elapsed-budget-qualification-2026-10-06.md`, removed; see Git history) record affected checks, historical failures, cache restoration and pending broader gate scope. Evidence-only successor preserves source, dependencies and frozen refs. diff --git a/docs/plans/current-standards-remediation-2026-09-03/desktop-release-bindings-and-torch/execution-ledger.md b/docs/plans/current-standards-remediation-2026-09-03/desktop-release-bindings-and-torch/execution-ledger.md index 56b494729..ce566f0ca 100644 --- a/docs/plans/current-standards-remediation-2026-09-03/desktop-release-bindings-and-torch/execution-ledger.md +++ b/docs/plans/current-standards-remediation-2026-09-03/desktop-release-bindings-and-torch/execution-ledger.md @@ -34,7 +34,7 @@ - Planning-only reconciliation delegated the image lifetime, live compatibility, private result evolution, and gateway projection subset to the focused - [Torch Image Provider Contract Correction](../../torch-image-provider-contract/plan.md). + Torch Image Provider Contract Correction (removed; `git show 78c52fcf:docs/plans/torch-image-provider-contract/plan.md`). - Milestone 3 retains broader text semantics, usage accounting, health/control responsiveness, overload, and shutdown. TIPC evidence is necessary for the image subset but cannot satisfy whole DRBT-A5. diff --git a/docs/plans/current-standards-remediation-2026-09-03/desktop-release-bindings-and-torch/issues.md b/docs/plans/current-standards-remediation-2026-09-03/desktop-release-bindings-and-torch/issues.md index dd8773016..fe7aa25f9 100644 --- a/docs/plans/current-standards-remediation-2026-09-03/desktop-release-bindings-and-torch/issues.md +++ b/docs/plans/current-standards-remediation-2026-09-03/desktop-release-bindings-and-torch/issues.md @@ -112,7 +112,7 @@ **2026-09-20 current disposition:** The evidence above remains a dated finding, not a description of the current image stack. Later image-serving work established real Linux/GPU/runtime evidence within its recorded scope. The -[Torch Image Provider Contract Correction](../../torch-image-provider-contract/plan.md) +Torch Image Provider Contract Correction (removed; `git show 78c52fcf:docs/plans/torch-image-provider-contract/plan.md`) now owns the reusable generation lifetime plus image-specific compatibility, result, and projection work and its exact-candidate handoff. Milestone 3 still owns text shapes/semantics, usage, responsiveness, and shutdown; TIPC acceptance diff --git a/docs/plans/current-standards-remediation-2026-09-03/desktop-release-bindings-and-torch/plan.md b/docs/plans/current-standards-remediation-2026-09-03/desktop-release-bindings-and-torch/plan.md index 6bd66295b..a4b79a477 100644 --- a/docs/plans/current-standards-remediation-2026-09-03/desktop-release-bindings-and-torch/plan.md +++ b/docs/plans/current-standards-remediation-2026-09-03/desktop-release-bindings-and-torch/plan.md @@ -184,7 +184,7 @@ artifact, dependency, license, version, and target promises. | Each accepted release uses `scripts/release/artifact-plan.json` as the exact artifact-plan authority consumed through the `scripts/release/artifacts.mjs` Interface by validation, assembly, SBOM/checksum production, and release review. | Milestones 0 and 6 | P-03, current Node toolchain, multiple real release consumers, and release artifact-plan rule | Narrative/workflow disagreement | | A binding package contains generated host material and native binaries only from one recorded build cohort, and every advertised tuple requires real-host load/call evidence. | Milestone 5 | P-04 and Rust Language Binding profile | Source-generation or native-only evidence as host support | | Torch exposes an explicitly selected subset rather than accepting and ignoring fields. Its work owner must keep ASGI control traffic schedulable and observe admission, completion, cancellation, failure, and shutdown. | Milestone 3 | P-06 and Concurrency/Resilience standards | Silent field dropping and synchronous event-loop inference | -| The [Torch Image Provider Contract Correction](../../torch-image-provider-contract/plan.md) solely owns the reusable no-elapsed-deadline generation lifetime plus image live compatibility, private result evolution, and gateway projection. This plan retains text shapes/semantics, usage, control responsiveness, and shutdown; focused TIPC evidence is necessary but not sufficient for DRBT-A5. | Focused TIPC plan, then Milestone 3 consumption | Explicit 2026-09-20 ownership reconciliation and user clarification | Duplicate generation-lifetime implementation or whole-DRBT-A5 acceptance from a subset | +| The Torch Image Provider Contract Correction (removed; `git show 78c52fcf:docs/plans/torch-image-provider-contract/plan.md`) solely owns the reusable no-elapsed-deadline generation lifetime plus image live compatibility, private result evolution, and gateway projection. This plan retains text shapes/semantics, usage, control responsiveness, and shutdown; focused TIPC evidence is necessary but not sufficient for DRBT-A5. | Focused TIPC plan, then Milestone 3 consumption | Explicit 2026-09-20 ownership reconciliation and user clarification | Duplicate generation-lifetime implementation or whole-DRBT-A5 acceptance from a subset | | Torch's synchronous text handlers are not registered public chat/completion providers. Their worker lifecycle and responsiveness remain Milestone 3 work and are not a prerequisite for TIPC-M1's shared Ollama/llama.cpp gateway proof. | Milestone 3 | Current provider registry and handler inspection | Implicitly expanding TIPC-M1 into Torch text remediation | | Launcher-root states distinguish absent, valid, invalid, and unavailable authority; environment override precedes argument override, and either explicit source must name only an exact root, `shared-resources`, or `shared-resources/models`; only the accepted recovery path may replace a bad persisted owner. | Milestone 2 | P-08, current invocation precedence, and persistence/resilience rules | Corrupt/unreadable state mapped to absence or arbitrary descendant discovery | | Launcher wrappers delegate the same validated actions to one process-execution Module; target and termination behavior remain explicit per accepted OS. | Milestone 4 | P-09 and Launcher/Cross-Platform standards | Unknown-to-Linux fallback and wrapper-specific release path | @@ -725,7 +725,7 @@ admitted by this plan. | Governance and verification plan | Current CI/gate ownership and schedules | `.github/workflows/build.yml`, package scripts, `docs/DEVELOPMENT.md` | Integrate its relevant CI cleanup before this plan edits shared workflow registrations | | Rust library and RPC plan | Canonical DTO/error declaration, Rust-side lifecycle/error semantics, core/Adapter placement | This plan must not edit `pumas-core` or re-own semantic code in `pumas-uniffi/src/bindings.rs` | Accept canonical contract before Milestone 1; accept binding semantics before Milestone 5 | | Frontend and UI plan | Renderer use of decoded/recovery outcomes and library-only UI behavior | This plan stops at preload/main decoded Interfaces | Integrate generated outcome Interface before renderer adoption; include the adopted path in final system review | -| [Torch Image Provider Contract Correction](../../torch-image-provider-contract/plan.md) | Accepted shared generation lifetime, image live compatibility, result/projection, and exact-candidate handoff evidence | It solely owns generation duration policy and the image correction; this plan must not duplicate either implementation | Consume TIPC evidence when evaluating generation/image portions of DRBT-A5; text shape/usage work may proceed independently | +| Torch Image Provider Contract Correction (removed; `git show 78c52fcf:docs/plans/torch-image-provider-contract/plan.md`) | Accepted shared generation lifetime, image live compatibility, result/projection, and exact-candidate handoff evidence | It solely owns generation duration policy and the image correction; this plan must not duplicate either implementation | Consume TIPC evidence when evaluating generation/image portions of DRBT-A5; text shape/usage work may proceed independently | | This plan | Desktop projection/decoding, launcher/Torch lifecycle, host cohorts, release artifact proof | Owns the write sets above after prerequisites | Integrates last at shared release/CI surfaces | ## Final Acceptance diff --git a/docs/plans/current-standards-remediation-2026-09-03/execution-ledger.md b/docs/plans/current-standards-remediation-2026-09-03/execution-ledger.md index b77e21fa7..9120c0683 100644 --- a/docs/plans/current-standards-remediation-2026-09-03/execution-ledger.md +++ b/docs/plans/current-standards-remediation-2026-09-03/execution-ledger.md @@ -3,7 +3,7 @@ ## 2026-09-20 — Register Torch Image Provider Contract Correction Planning-only reconciliation registered the focused -[Torch Image Provider Contract Correction](../torch-image-provider-contract/plan.md) +Torch Image Provider Contract Correction (removed; `git show 78c52fcf:docs/plans/torch-image-provider-contract/plan.md`) as the sole owner of the image-specific lifetime, compatibility, private result, and gateway projection subset of PRG-A4/DRBT-A5. The program retains objective- level integration; the desktop/Torch remediation retains its broader work; and diff --git a/docs/plans/current-standards-remediation-2026-09-03/issues.md b/docs/plans/current-standards-remediation-2026-09-03/issues.md index b4ff07428..b210d1df5 100644 --- a/docs/plans/current-standards-remediation-2026-09-03/issues.md +++ b/docs/plans/current-standards-remediation-2026-09-03/issues.md @@ -34,7 +34,7 @@ acceptance. Current program-level coordination findings follow. | `PRG-I14` | High | Rust M2F's producer-owned `ConversionProgressOutcome` preserves the core contract's camelCase inner fields, while the handwritten frontend `api-conversion.ts` claims snake_case progress fields. | Cross-process contract drift; does not invalidate the closed Rust producer slice but blocks PRG-A2 consumer acceptance. | Preserve Rust as semantic owner. Platform M1 must generate/decode its exact shape after zero-Legacy, and frontend M4 must delete/migrate the handwritten mismatch rather than making another local schema copy. | Malformed/mismatched conversion payload corpus fails explicitly through the generated Electron/preload Adapter and renderer consumer tests. | | `PRG-I15` | High | Rust M2H review found the core interrupted-download scan mapped a `spawn_blocking` join failure to an empty list, while an intentionally disabled or failed-to-initialize HF client mapped status/mutation/list calls to not-found, false-without-reason, or successful empty data. | Producer truth and lifecycle composition; invalidated the affected M2H closed-outcome claim and would have made platform M1 generate unavailable/failure states as valid missing/empty results. | Resolved: the canonical core/public/desktop seams return disabled HF as `Err`, preserve task-join failure, and keep legitimate missing/false/empty results distinct. The transitional UniFFI caller only projects `Result` pending its accepted removal; no manifest/shared expansion occurred. | Passed: direct disabled-HF and deterministic join-failure tests, real desktop valid-missing/empty cases, real local-IPC method rejection, full core/RPC/adapter suites, default/no-default Clippy/check, format, and diff checks. This seam remains valid, but PRG-I19 separately reopens the recovery mutation commands, so aggregate M2H/count acceptance is suspended. | | `PRG-I16` | Medium | The post-M3 full frontend suite initially passed 470/471: unchanged `ModelMetadataModal.test.tsx` still queried deleted accessible backdrop label `Close metadata modal` and emitted `act` warnings from unawaited initial loads. | Focused evidence reconciliation; frontend owns the stale caller test, and the failure blocked M3-S3b/full-tranche acceptance without invalidating accepted ModalDialog behavior. | Resolved test-only: the caller awaits initial metadata, drives the aria-hidden backdrop's actual `mousedown` Interface, and sends Escape to `document`; no product source or obsolete accessible backdrop was restored. | Passed: focused modal/Popover tests, full lint/types/builds, and the expanded full frontend suite at 109 files/473 tests without the prior warnings. | -| `PRG-I17` | High | Platform M3 found that the reachable GUI-managed Torch path installed upstream source while its launcher expected Pumas `serve.py`; the manifest also advertised Python 3.10 despite the repository pinning 3.12.3. The embedded sidecar, upstream wheel resolver, and managed runtime path have since been implemented and exercised through RPC, including real 2.10 CUDA/Tuldok inference. | Cross-plan deployment authority; Torch runtime installation/process ownership stays in `pumas-app-manager`, sidecar execution stays in `torch-server`, and desktop/API projection consumes the RPC contract. | **Resolved for the accepted Linux runtime-management path:** discover stable upstream `vMAJOR.MINOR.PATCH` tags independently of Pumas qualification under a 20-page / 120-second complete-listing budget; resolve exact official CPU/CUDA/ROCm wheels and complete hash-locked dependencies against Pumas-managed stable CPython 3.10+ candidates, choosing the newest full resolution. Do not compile Torch from source or claim XPU. Windows x64 and macOS arm64 paths are implemented, with native acceptance still pending. Keep install, selection, default, start, and stop explicit. | Passed U1–U4 on Linux: discovery returned 63 stable tags; dynamic `v2.9.0+cpu` / CPython 3.12 preview resolved 25 hashed wheels, installed, passed identity/core probe, was selected, passed managed sidecar health/protocol 3, and stopped by owned generation. The v2.14.0 CPU/Core tuple then resolved 25 artifacts on managed CPython 3.14.7, installed and passed identity/CPU and sidecar dependency probes, was selected, and passed managed sidecar startup, health/protocol 3, and generation-owned stop. Its CUDA 13.2/Core preview resolved 44 artifacts but was not installed; CUDA/device and v2.14 image generation remain unverified. U6 discovers release-specific official wheels, filters GPU channels against detected display devices, and recommends only when scan and driver checks support it. Cancellation/state-preservation and typed-preview rejection tests passed; the composed desktop projection test passed. See the [accepted plan](../torch-upstream-version-management/plan.md), [current runtime inventory](../torch-diffusion-serving/reports/upstream-version-manager-progress.md), [v2.9.0 evidence](../torch-upstream-version-management/reports/v2.9.0-cpu-rpc-acceptance.json), and [v2.14.0 evidence](../torch-cross-platform-runtime-management/reports/v2.14.0-linux-cpu-rpc-acceptance/acceptance.json). This is runtime-manager acceptance via RPC plus composed desktop controls, not a real interactive desktop run or an all-release image claim. The actual Tuldok image result remains the exact Torch 2.10 / CUDA 13.0 / Python 3.12 / FLUX.2 tuple. | +| `PRG-I17` | High | Platform M3 found that the reachable GUI-managed Torch path installed upstream source while its launcher expected Pumas `serve.py`; the manifest also advertised Python 3.10 despite the repository pinning 3.12.3. The embedded sidecar, upstream wheel resolver, and managed runtime path have since been implemented and exercised through RPC, including real 2.10 CUDA/Tuldok inference. | Cross-plan deployment authority; Torch runtime installation/process ownership stays in `pumas-app-manager`, sidecar execution stays in `torch-server`, and desktop/API projection consumes the RPC contract. | **Resolved for the accepted Linux runtime-management path:** discover stable upstream `vMAJOR.MINOR.PATCH` tags independently of Pumas qualification under a 20-page / 120-second complete-listing budget; resolve exact official CPU/CUDA/ROCm wheels and complete hash-locked dependencies against Pumas-managed stable CPython 3.10+ candidates, choosing the newest full resolution. Do not compile Torch from source or claim XPU. Windows x64 and macOS arm64 paths are implemented, with native acceptance still pending. Keep install, selection, default, start, and stop explicit. | Passed U1–U4 on Linux: discovery returned 63 stable tags; dynamic `v2.9.0+cpu` / CPython 3.12 preview resolved 25 hashed wheels, installed, passed identity/core probe, was selected, passed managed sidecar health/protocol 3, and stopped by owned generation. The v2.14.0 CPU/Core tuple then resolved 25 artifacts on managed CPython 3.14.7, installed and passed identity/CPU and sidecar dependency probes, was selected, and passed managed sidecar startup, health/protocol 3, and generation-owned stop. Its CUDA 13.2/Core preview resolved 44 artifacts but was not installed; CUDA/device and v2.14 image generation remain unverified. U6 discovers release-specific official wheels, filters GPU channels against detected display devices, and recommends only when scan and driver checks support it. Cancellation/state-preservation and typed-preview rejection tests passed; the composed desktop projection test passed. See the accepted plan (removed; `git show 78c52fcf:docs/plans/torch-upstream-version-management/plan.md`), current runtime inventory (removed; `git show 78c52fcf:docs/plans/torch-diffusion-serving/reports/upstream-version-manager-progress.md`), v2.9.0 evidence (removed; `git show 78c52fcf:docs/plans/torch-upstream-version-management/reports/v2.9.0-cpu-rpc-acceptance.json`), and v2.14.0 evidence (removed; `git show 78c52fcf:docs/plans/torch-cross-platform-runtime-management/reports/v2.14.0-linux-cpu-rpc-acceptance/acceptance.json`). This is runtime-manager acceptance via RPC plus composed desktop controls, not a real interactive desktop run or an all-release image claim. The actual Tuldok image result remains the exact Torch 2.10 / CUDA 13.0 / Python 3.12 / FLUX.2 tuple. | | `PRG-I18` | High | Rust M2I review found four corrected producer counterexample families, then downstream consumer review found a fifth: a complete Q5 row still carried subordinate selected-Q4 recovery identity, and the current renderer prioritizes that identity when matching activity, falsely attaching Q4 state to the ready Q5 row. The earlier families were whole-catalog rejection of valid mixed state, bidirectional hierarchy dirtiness, host-dependent recovery grammar, and bounded run-ID collision. | Rust core/RPC catalog contract and program sequence; the consumer contradiction reopens M2I and blocks its count increase, M2J, RUST-A2, platform M1 generation, and frontend M4 consumption even though the corrected hierarchy/list/grammar/bounds subclaims remain valid. | Active corrective gate: `Complete` cannot carry subordinate recovery identity; only a truly partial row may expose a recovery action. Preserve authoritative ready classification without a renderer-unneeded mixed state, and keep the earlier corrected producer evidence as partial subclaims. | Cross-owner Q5-complete/Q4-part projection must serialize complete with no recovery identity, then the actual renderer matching/row-state corpus must keep Q5 ready and must not attach Q4 activity. Re-run both feature modes and independent review before M2I counts advance or M2J starts. | | `PRG-I19` | Critical | The original M2H recovery request accepted caller-owned repository/path authority. Corrected Slice A closes the durable publication/store prerequisite, and fourth-freeze Slice B now closes the deep task/blocking owner after three rejected boundaries exposed reservation, drain, projection, cancellation, callback, and filesystem-custody defects. C1 and C2 are internally verified, and C3's narrow ordinary admission/resume/restore checkpoint passed review and targeted evidence. The interrupted-response/fresh-owner-reopen path is verified; full C3 is active after PRG-I24's migration scope approval; hard process-crash recovery, stable runtime queue identity, comprehensive owned restore, stalled pause, relocation, and guard-free effects remain incomplete. Builder callback wrappers still spawn the real importer mutation and return before lifecycle observation; C4 owns that repair. Live desktop consumers still send the removed ambient shape. | Rust M2H mutation/filesystem/lifecycle authority plus the M2I/frontend handoff. The unresolved ordinary lifecycle can publish false active state, strand Pausing, signal or call user code under a guard, surrender shared marker/part authority while a state remains resumable, lose FIFO/crash truth, let importer metadata mutate after cancel/release, or regain ambient/path-string authority. M2I recovery/count acceptance stays reopened and M2J, RUST-A2, downstream generation/consumption, and incompatible standalone producer integration remain blocked. | The aggregate boundary remains decomposed into five serialized slices. Slices A/B and C1/C2 are internally accepted; C3 has only its narrow admission checkpoint verified. The focused Rust plan owns current evidence and remaining integration limits. Slice C uses the focused Rust plan's exact source write set, including its bounded shared finalization seam. It makes admission durably ordered before public success/effects; derives destination identity and effects from one held configured root plus validated relative target; exclusively persists ordinary, queue, and Pending/Verified quarantine truth with independent sticky provenance; retains Paused/recoverable Error or Pending authority; releases only verified published terminal state by exact generation with panic rescue; binds pause/resume/relocation to the owner; linearizes guard-free snapshots; owns the actual Aux/Completion importer futures under destination custody; and keeps public synchronous callbacks notification-only. No new public constructor/wire outcome is admitted. Preserve all A/B publication, custody, cleanup, failure-provenance, and projection guarantees. One active Pumas runtime per root remains the task-admission precondition. General client Drop remains M4/RUST-A6; public core/UniFFI ambient routes are transitional only. | Slice A passed both reviews after 18 atomic and 22 store tests per mode. Slice B passed both reviews and root reproduction at exact fourth-freeze hashes with lifecycle 18/18 and download 85/85 per mode, both Clippy modes, format/diff, and current plan gates. Slice C requires deterministic durable-admission/FIFO crash restore and malformed-v3 graph validation, quarantine begin/verify/remove ambiguity, alias/missing/replacement identity, atomic-marker ambiguity, production importer mutation/cancel/successor ordering, exact/partial/auxiliary/recovery-domain contention, pause/final-cleanup winners, dormant resume/cancel/relocation, terminal panic rescue, and reentrant guard/signal oracles; all A/B regressions and focused dual-mode gates must pass before its exact-hash freeze and reviews. Slices D/E then prove domain and closed/full claims. Coherent verified incremental commits follow the root commit decision; compatible reachable contracts are required, and full C3/consumer/release acceptance remains open. | | `PRG-I20` | High | Cross-owner review of the frozen Electron launcher-root recovery producer found that every resolved authority projected to generic `ready`, so a valid environment/argument authority incorrectly enabled a persisted selection that the same explicit authority would outrank on restart. The native chooser also had no single attempt owner: dialog rejection was not projected through the closed result, concurrent invocations could race, and attempts remained available after `restarting`, `replacement-visibility-unknown`, or `published-durability-unavailable`. | Platform M2 startup/selection lifecycle and the serialized frontend recovery handoff. The producer could not define an honest user decision or integrate with its renderer consumer while selection policy and attempt ownership were ambiguous. | Resolved at the corrected producer source boundary: path-free ready state carries `select-library|correct-launch-input`; only supersedable authority offers the chooser. One main-process handler owns dialog, validation, persistence, and synchronous relaunch request; concurrent callers share its Promise; unchanged outcomes explicitly retry; ambiguous, published, and restarting outcomes lock/replay; dialog and relaunch rejection have closed typed outcomes. | Passed locally: 18 focused recovery/preload checks, full Electron build and seven test files, lint, TypeScript validation, plan structure, and diff checks. Program independently reran the full Electron tests/lint/validation. These lifecycle subclaims remain valid, but PRG-I21 separately reopens the uncommitted producer/consumer tranche because the compiled sandboxed preload cannot load its decoder module. | diff --git a/docs/plans/current-standards-remediation-2026-09-03/plan.md b/docs/plans/current-standards-remediation-2026-09-03/plan.md index d5099bf99..e61be8618 100644 --- a/docs/plans/current-standards-remediation-2026-09-03/plan.md +++ b/docs/plans/current-standards-remediation-2026-09-03/plan.md @@ -2,6 +2,13 @@ **Plan status:** `Active` +**Status as of v0.8.0 (2026-11-03):** this program was last updated on +2026-09-25. v0.8.0 shipped without completing it; the governance sub-plan is +accepted, and the Rust/RPC, frontend and desktop/release/Torch sub-plans remain +open with their recorded issues. Those issues have not been re-verified +against v0.8.0 source. Before the next slice, re-check each open issue against +current `main` and close, re-scope or retire the program. + **Post-release deferral:** Further unified inference gateway development is deferred until after the next release (user decision, 2026-09-12). The [architecture brief](../../breif/unified-inference-gateway.md) records the proposed direction; @@ -943,7 +950,7 @@ owned by the focused plans. | [Governance and verification](governance-and-verification/plan.md) | Standards routing, count/error gate disposition, permanent-gate claims and schedules | G-01–G-06; CS-10, CS-13, CS-14 and G-06 evidence routing | | [Rust library and RPC](rust-library-and-rpc/plan.md) | Rust/server RPC and local IPC contracts, public errors/redaction, SQLite state/events/migrations, Rust lifecycle/features, Rust binding placement, plugin startup | R-01–R-09; CS-01–CS-03, Rust portions of CS-04/CS-07/CS-08, CS-11 | | [Desktop, release, bindings, and Torch](desktop-release-bindings-and-torch/plan.md) | Generated Electron projections/decoding, desktop authority/lifecycle, Torch, launcher, host cohorts, release artifact/dependency evidence | P-01–P-10; desktop portions of CS-02/CS-04/CS-06/CS-07, CS-12, CS-15 | -| [Torch Image Provider Contract Correction](../torch-image-provider-contract/plan.md) | Reusable Pumas generation transport, focused image live compatibility/private result/gateway projection, and exact candidate/user-workflow handoffs | Delegated Pumas transport and image subset of PRG-A4/DRBT-A5; does not claim external Ollama/llama.cpp worker cleanup or own text semantics/usage, broader Torch remediation, or distribution | +| Torch Image Provider Contract Correction (removed; `git show 78c52fcf:docs/plans/torch-image-provider-contract/plan.md`) | Reusable Pumas generation transport, focused image live compatibility/private result/gateway projection, and exact candidate/user-workflow handoffs | Delegated Pumas transport and image subset of PRG-A4/DRBT-A5; does not claim external Ollama/llama.cpp worker cleanup or own text semantics/usage, broader Torch remediation, or distribution | | [Frontend and UI](frontend-and-ui/plan.md) | Renderer consumption, cached model provenance, installation lifecycle, interaction Modules, status/motion, renderer variants | F-01–F-08; CS-05, CS-09, renderer portions of CS-02/CS-04/CS-08 | Shared findings close only when every named producer and consumer claim passes; diff --git a/docs/plans/download-location-reconciliation/execution-ledger.md b/docs/plans/download-location-reconciliation/execution-ledger.md index 91de0de67..07dcb6875 100644 --- a/docs/plans/download-location-reconciliation/execution-ledger.md +++ b/docs/plans/download-location-reconciliation/execution-ledger.md @@ -10,21 +10,21 @@ Canonical authority: [plan](plan.md). | 2026-10-10 | Plan, owner design, write sets, acceptance procedures and issue dispositions created. | Lifecycle Planned; C1–C10 pending; exactly one next slice M1. No source edits or tests claimed. | | 2026-10-10 | Planning artifact verification passed. | Links in all eight documents resolve, required C1–C10 inventory/statuses checked; original tracked diff remains byte-identical to the preserved baseline, and the latest-main worktree remains clean. This verifies planning artifacts and preservation, not production behavior. | | 2026-10-10 | Independent review amended required outcomes before implementation. | C5/C7 require explicit older-direct-client warning and separate exact pinned direct/RPC consumer tests before UI expansion. C2/C4/C6 require exact live dormant claim settlement after durable release, immediate same-destination transfer, stale-state fencing and unchanged paused claims. M1 remains Planned; C1–C10 pending. | -| 2026-10-10 | Reviewed documents selectively reconstructed on the current PR branch. | Sources: investigation `1568e90c` and plan `0b97dcb2` from `work/acquisition-q1-http`; accepted replacement `a36b91e8236a65b05bc4f6e3e2fc9fe7e79d511b`. Only those nine documents were transferred and the plan amended; no branch merge or acquisition-source transfer. [Review follow-up](../../investigations/pr69-review-followup-2026-10-10.md) records source-to-replacement lineage and preservation evidence. | +| 2026-10-10 | Reviewed documents selectively reconstructed on the current PR branch. | Sources: investigation `1568e90c` and plan `0b97dcb2` from `work/acquisition-q1-http`; accepted replacement `a36b91e8236a65b05bc4f6e3e2fc9fe7e79d511b`. Only those nine documents were transferred and the plan amended; no branch merge or acquisition-source transfer. Review follow-up (`../../investigations/pr69-review-followup-2026-10-10.md`, removed; see Git history) records source-to-replacement lineage and preservation evidence. | | 2026-10-10 | PR #69 regressions repaired separately from reconciliation. | `f6fb33fc` makes the test readiness constant portable; `58fa0382` aligns legacy-schema preflight with runtime HF initialization. Windows cross-target test compilation, Linux cancellation and focused headless startup/HF-disabled checks passed; full HF-enabled core suite: 2,070 passed, 13 existing ignored. These do not satisfy reconciliation claims. | -| 2026-10-10 | Review follow-up verification and audio diagnosis completed within stated limits. | Full headless core suite also passed: 2,070 passed, 13 existing ignored. Source-constraint resolution differs from the audio recipe at NumPy/narwhals; exact failed CI selection is unavailable and local installer replay stopped at archive transport. CI now retains installed selection on failure; audio qualification and native-platform reruns remain required. [Evidence](../../investigations/pr69-review-followup-2026-10-10.md). | +| 2026-10-10 | Review follow-up verification and audio diagnosis completed within stated limits. | Full headless core suite also passed: 2,070 passed, 13 existing ignored. Source-constraint resolution differs from the audio recipe at NumPy/narwhals; exact failed CI selection is unavailable and local installer replay stopped at archive transport. CI now retains installed selection on failure; audio qualification and native-platform reruns remain required. Evidence (`../../investigations/pr69-review-followup-2026-10-10.md`, removed; see Git history). | | 2026-10-11 | Live-download recovery warning corrected separately from reconciliation. | User confirmed progress was still increasing. The real activity-to-catalog merge and row-render regression reproduced the exact warning in all six tracked states. The row was projecting a missing inactive recovery ticket even when it already had live download ownership. Warning projection now follows the existing `isDownloading` ownership state; pause/resume retains exact download identity, and inactive partial models still require a current recovery ticket. Full frontend suite: 929 passed, one existing skip; typecheck and lint passed. Coding standards MCP snapshot `snapshot:v1:b24ca5dd-da8e-4746-9bf9-c47a3fbe4d6e`: 24 selected policies, no unresolved fact categories. No backend, library data, RPC or reconciliation-plan behavior changed; C1–C10 remain pending. | | 2026-10-11 | Retained PR checkout restored inside the original repository after its temporary directory was removed. | Reconstructed only the clean task-owned index at protected head `3c43c7c8faa608202dddbd178657f635fe40ae10`, verified equality with `fix/main-test-validation`, and repaired its existing registration to the repository-local path below. Branch history and the original tracked dirty diff remain unchanged. Old logs and private recovery backups were preserved in the original repository's ignored `tmp/pumas-tmp-cleanup-20261011-bg7qr7w3/`; no model files were copied. | | 2026-10-11 | Linux candidate rebuilt for the live-download warning fix. | Candidate source `f92d35f0b76bc8c5bf481e62501d03156eb227a7`; frontend and Electron production builds passed. Reused the validated release RPC from `ada3258e44edf9eb3108638917f28291414328ee`: the intervening diff contains only frontend and documentation changes, with no Rust/native producer input changes. Debian and AppImage bundle/resource checks, extracted RPC health/shutdown, and isolated Debian install/alternatives/Electron identity/removal passed. Outputs are in the original repository's ignored `electron/release/download-resume-20261011/`, with `local-build-record.json` and acquisition/manual-verification `SHA256SUMS`. Debian `pumas-library-electron_0.8.0-rc.1_amd64.deb`: SHA-256 `417fa9b23b567f625a11dd3f4fa6268af69e738982ce3cb3e6861f032aa94b39`; AppImage `Pumas.Library-0.8.0-rc.1.AppImage`: SHA-256 `a6cf7cbff647d24fb4fe806bda7c77573142db07ee7a79f32520c2321e87e3b1`. Build/test logs remain in the original repository's ignored `tmp/pr69-download-controls-*.log`. The running user application/download was untouched; live transfer operations, inference and foreign native platforms were not tested. No signing, publication or push; C1–C10 remain pending. | -| 2026-10-11 | Silent deletion refusal diagnosed and outcome reporting repaired. | [Investigation](../../investigations/model-deletion-feedback-2026-10-11.md): exact CLM artifact identities, read-only custody/native-lock observations, rendered hold-to-delete failure, and actual release RPC refusal/retry on disposable fixtures. The 8.11 GB catalog entry was metadata-only at observation; the other selected weight had current transfer custody. Frontend deletion state now reports failures independently of recovery warnings, disables pending controls, fences duplicate requests by exact model ID and permits explicit retry. Busy-library RPC errors retain code/class/shape and expose bounded actionable guidance; whole-library exclusion is unchanged. Full frontend suite: 935 passed, one existing skip; all 410 default-feature RPC binary tests passed. Typecheck, lint, Rust formatting and production frontend/Electron builds passed. Standards snapshot `snapshot:v1:1106bd39-e9a8-48d9-897e-8a186918dd48`: 33 policies, no unresolved routing categories. New release RPC/package verification remains pending here; real model files were untouched and C1–C10 remain pending. | +| 2026-10-11 | Silent deletion refusal diagnosed and outcome reporting repaired. | Investigation (`../../investigations/model-deletion-feedback-2026-10-11.md`, removed; see Git history): exact CLM artifact identities, read-only custody/native-lock observations, rendered hold-to-delete failure, and actual release RPC refusal/retry on disposable fixtures. The 8.11 GB catalog entry was metadata-only at observation; the other selected weight had current transfer custody. Frontend deletion state now reports failures independently of recovery warnings, disables pending controls, fences duplicate requests by exact model ID and permits explicit retry. Busy-library RPC errors retain code/class/shape and expose bounded actionable guidance; whole-library exclusion is unchanged. Full frontend suite: 935 passed, one existing skip; all 410 default-feature RPC binary tests passed. Typecheck, lint, Rust formatting and production frontend/Electron builds passed. Standards snapshot `snapshot:v1:1106bd39-e9a8-48d9-897e-8a186918dd48`: 33 policies, no unresolved routing categories. New release RPC/package verification remains pending here; real model files were untouched and C1–C10 remain pending. | | 2026-10-11 | Deletion-feedback Linux candidate completed. | Source/backend `277fff047409b145b4b668289f28c6cbdfa943a7`; normal default-feature release RPC rebuilt with locked offline Cargo inputs. The actual rebuilt RPC returned the actionable `-32011` conflict while a disposable fixture's root grant was held, preserved both entries, and deleted only the selected entry immediately after release. Frontend/Electron/RPC release builds, Debian/AppImage bundle checks and extracted backend health/shutdown, and isolated Debian install/alternatives/Electron identity/removal passed. Original repository outputs: ignored `electron/release/model-deletion-20261011/`, alongside `local-build-record.json` and acquisition/manual-verification `SHA256SUMS`. Debian `pumas-library-electron_0.8.0-rc.1_amd64.deb`: SHA-256 `263c4ad4fd73afbfffb006ad28d8f220f1d8a273b31b6589e8029ad3be58501f`; AppImage `Pumas.Library-0.8.0-rc.1.AppImage`: SHA-256 `ea09848dfca899393a7b6e9f77ea59240089b232f79b9158c9b3741945b2261d`. Logs and the clearly marked diagnostic harness remain in original ignored `tmp/pr69-delete-*`; disposable model/RPC fixtures were removed, and the installer-verification namespace is retained there. No real model mutation, installed-app restart, inference qualification, foreign native execution, signing, publication or push. The locked PR worktree remains retained-protected for user review/push; C1–C10 remain pending. | -| 2026-10-11 | Failed-download library feedback diagnosed and repaired independently of reconciliation. | [Investigation](../../investigations/model-download-outcome-2026-10-11.md): user-confirmed 7.69 GB CLM weight has a live error at 98.75%, rather than successful completion. The subscription-to-library regression failed because exact download-key errors never reached catalog or unassociated activity rows; rows now expose an accessible error with the existing exact-ID retry action. The genuine-completion regression passes through fresh catalog projection and an enabled selected-model play action; 100% transfer progress or a partial refreshed catalog cannot authorize play. Full frontend suite: 939 passed, one existing skip, 138 files; typecheck and lint passed. MCP snapshot `snapshot:v1:cb98848b-5ab6-414b-8087-f1cf62578483`: 33 selected policies, no unresolved routing categories, selected content unchanged. No backend, persisted/RPC contract, HTTP validation, live download, root-lock policy, or C1–C10 implementation changed. Linux candidate build/installer verification remains pending at this source boundary. | +| 2026-10-11 | Failed-download library feedback diagnosed and repaired independently of reconciliation. | Investigation (`../../investigations/model-download-outcome-2026-10-11.md`, removed; see Git history): user-confirmed 7.69 GB CLM weight has a live error at 98.75%, rather than successful completion. The subscription-to-library regression failed because exact download-key errors never reached catalog or unassociated activity rows; rows now expose an accessible error with the existing exact-ID retry action. The genuine-completion regression passes through fresh catalog projection and an enabled selected-model play action; 100% transfer progress or a partial refreshed catalog cannot authorize play. Full frontend suite: 939 passed, one existing skip, 138 files; typecheck and lint passed. MCP snapshot `snapshot:v1:cb98848b-5ab6-414b-8087-f1cf62578483`: 33 selected policies, no unresolved routing categories, selected content unchanged. No backend, persisted/RPC contract, HTTP validation, live download, root-lock policy, or C1–C10 implementation changed. Linux candidate build/installer verification remains pending at this source boundary. | | 2026-10-11 | Download-outcome Linux candidate completed. | Source `963fe94eddba356cb9766894a776807dad8ded68`; frontend and Electron production builds passed. Reused the validated normal default-feature release RPC from `277fff047409b145b4b668289f28c6cbdfa943a7`: intervening source changes are only frontend and documentation, with no Rust/native producer input changes. Exact Debian/AppImage resource checks and extracted backend health/shutdown passed; isolated Debian installation, alternatives, Electron 43.7.0 identity and removal passed without changing the host installation. Original repository outputs: ignored `electron/release/download-outcome-20261011/`, with `local-build-record.json` and acquisition/manual-verification `SHA256SUMS`. Debian `pumas-library-electron_0.8.0-rc.1_amd64.deb`: SHA-256 `1420cdd8a36859199fdd67a269a3ccc3e94dc97fd0a8efd0c2d3989f472cf72f`; AppImage `Pumas.Library-0.8.0-rc.1.AppImage`: SHA-256 `2ca93b6ed4fbfecd9b70edfcb400ff25379d3cbc72fcf3c5f95c9b371b64b4aa`. Logs remain in ignored `tmp/pr69-download-outcome-*`; installer namespace is retained there and disposable smoke fixtures were removed. The HTTP continuation error remains unresolved; no live retry, model mutation, installed-app restart, inference qualification, foreign native execution, signing, publication or push occurred. Original tracked edits remain byte-identical to the preserved baseline. Locked PR worktree remains retained-protected for Jeremy review/push; C1–C10 remain pending. | -| 2026-10-11 | Destructive resume fallback replaced under explicit user policy. | [Follow-up](../../investigations/model-download-outcome-2026-10-11.md#resume-policy-follow-up): missing/rejected workspace checkpoints and full responses to range requests no longer authorize discarding partial files. HTTP/S3 continue from actual retained offsets under the selected supplied SHA, verify the assembled acquisition before publication, and preserve files on refusal. Fresh remote descriptors cannot truncate existing or late-arriving partials. No store/receipt schema, HTTP checkpoint sidecar, retained execution lease, model backup, or automatic post-acquisition SHA check was added. Actual HF immediate-resume regression was red before implementation; pause/error/restart, corrupt-assembly, ignored/wrong-range, public RPC durable import and S3 recovery evidence pass. Default core package 2,331 passed; headless core unit 2,074; S3 acquisition unit 215 and integration 58; default RPC package 438, including 410 binary tests; default/headless S3 RPC selections 17 each. Existing opt-in skips and the unrelated headless RPC lint experiment are documented separately; selected strict default and S3 lints pass. Formatting and frontend/Electron release builds pass. Standards snapshot `snapshot:v1:8232afb5-be9d-4ee8-8099-ce42f109e2ea`: 33 policies, zero unresolved routing categories. Real library/app remain untouched; overwritten bytes are not recovered; optimized backend/package checks remain pending at this source boundary. C1–C10 remain pending. | -| 2026-10-11 | Resume-policy Linux candidates built and verified. | Producer source/RPC `bf19765a23d1cbe6fc0c3db429f2cac413cb4ce9`; new normal default-feature optimized backend build passed with locked/offline Cargo inputs. Frontend/Electron production builds passed. Exact extracted Debian/AppImage resource and RPC health/shutdown checks passed; isolated Debian installation, alternatives, Electron 43.7.0 identity and removal passed. Artifacts are in original-repository `electron/release/resume-policy-20261011/` with `SHA256SUMS` and `local-build-record.json`; exact hashes, warnings, test evidence reuse and limits are in the [investigation](../../investigations/model-download-outcome-2026-10-11.md#verified-resume-policy-installers). Sandbox DNS initially blocked packaging; network-enabled retry passed. Host installation, running app and real model library remain untouched. Maintainer must install/reopen to apply the policy; overwritten bytes are not recovered. No inference, foreign native execution, signing, publication or build reproducibility claim. C1–C10 remain pending. | -| 2026-10-11 | Primary deletion shares the live HF owner grant with exact destination exclusion. | [Follow-up](../../investigations/model-deletion-feedback-2026-10-11.md#deletion-scope-follow-up): the installed frontend still contained the older silent-delete handler; the earlier resume candidate included feedback but retained root-wide deletion contention. New primary API/local IPC deletion retains transfer-effect and admission exclusion for the exact destination, checks physical root and durable custody, and obtains the existing intent claim. Separate shared admission reads preserve concurrent queueing; pre-write refusal cannot poison shutdown. Direct standalone/foreign native exclusion and other mutation rules remain. Default core package 2,333 passed/30 skipped; RPC package 438/12, including all 410 binary tests and real active-download HTTP deletion refusal/success/completion; six headless deletion regressions pass; strict default core/RPC all-targets Clippy and formatting pass. Earlier unexplained vision request-count failure is documented separately, with unchanged strict assertions and added provenance; final runs pass without a causal-resolution claim. Standards snapshot `snapshot:v1:28e650df-0dc6-4f90-9b6d-75377680eebb`: 33 policies, zero unresolved routing categories. Distinct local installer and newer Debian revision selected; optimized producer/package qualification pending at this source boundary. Host app/library/install remain untouched; C1–C10 remain pending. | -| 2026-10-11 | Link-registry cache/snapshot/publication serialized for overlapping deletions. | [Follow-up](../../investigations/model-deletion-feedback-2026-10-11.md#link-registry-publication-follow-up): review found snapshot capture before asynchronous atomic writes could allow old snapshots to publish late. A 0.02-second regression was red before serialization. Clones now share one mutation turn across load, cache changes and publication; the actual worker retains it if its waiter disappears. Transfers do not take this registry turn; no format, receipt or checksum policy changed. Seven registry tests pass, including overlapping removals and abandoned save waiters with canonical reload. Final default core package 2,335/30 skips (2,107/14 unit); default RPC 438/12 (410 binary); seven headless registry tests pass; strict default core/RPC all-targets Clippy and formatting pass. Earlier vision event remains separately documented without a causal-resolution claim. The first `896a7e67` optimized attempt was interrupted and is invalid installer evidence; replacement producer/package checks pending at this source boundary. User library/install and original tracked edits remain untouched; C1–C10 remain pending. | -| 2026-10-11 | Deletion-scope Linux installers qualified and distinctly identified. | Producer/RPC `0ba3b6cb91cbb9bda84c0627172efb1e3cd6a272`: new normal optimized backend and current frontend/Electron builds pass. Exact Debian/AppImage resources and extracted RPC health/shutdown pass; isolated Debian installation, alternatives, Electron 43.7.0 and removal pass. Metadata `0.8.0~rc.1-2026101101` is verified newer than installed `0.8.0~rc.1`. Candidates, `SHA256SUMS` and `local-build-record.json` are in original-repository `electron/release/deletion-scope-20261011/`; exact-verified installer copy is `electron/release/Pumas-Library-delete-fix-20261011-0ba3b6cb-amd64.deb`. [Evidence](../../investigations/model-deletion-feedback-2026-10-11.md#verified-deletion-installers) records hashes, optimized exact-target deletion probe, warnings, suite reuse and limits. Installer contains the deletion alert missing from the observed installed frontend. Actual user library/install and original tracked edits are preserved. No inference, foreign native execution, signing, publication or reproducibility claim; prior unexplained vision request count remains documented. Locked review/push worktree remains retained-protected; C1–C10 remain pending. | +| 2026-10-11 | Destructive resume fallback replaced under explicit user policy. | Follow-up (`../../investigations/model-download-outcome-2026-10-11.md`, removed; see Git history): missing/rejected workspace checkpoints and full responses to range requests no longer authorize discarding partial files. HTTP/S3 continue from actual retained offsets under the selected supplied SHA, verify the assembled acquisition before publication, and preserve files on refusal. Fresh remote descriptors cannot truncate existing or late-arriving partials. No store/receipt schema, HTTP checkpoint sidecar, retained execution lease, model backup, or automatic post-acquisition SHA check was added. Actual HF immediate-resume regression was red before implementation; pause/error/restart, corrupt-assembly, ignored/wrong-range, public RPC durable import and S3 recovery evidence pass. Default core package 2,331 passed; headless core unit 2,074; S3 acquisition unit 215 and integration 58; default RPC package 438, including 410 binary tests; default/headless S3 RPC selections 17 each. Existing opt-in skips and the unrelated headless RPC lint experiment are documented separately; selected strict default and S3 lints pass. Formatting and frontend/Electron release builds pass. Standards snapshot `snapshot:v1:8232afb5-be9d-4ee8-8099-ce42f109e2ea`: 33 policies, zero unresolved routing categories. Real library/app remain untouched; overwritten bytes are not recovered; optimized backend/package checks remain pending at this source boundary. C1–C10 remain pending. | +| 2026-10-11 | Resume-policy Linux candidates built and verified. | Producer source/RPC `bf19765a23d1cbe6fc0c3db429f2cac413cb4ce9`; new normal default-feature optimized backend build passed with locked/offline Cargo inputs. Frontend/Electron production builds passed. Exact extracted Debian/AppImage resource and RPC health/shutdown checks passed; isolated Debian installation, alternatives, Electron 43.7.0 identity and removal passed. Artifacts are in original-repository `electron/release/resume-policy-20261011/` with `SHA256SUMS` and `local-build-record.json`; exact hashes, warnings, test evidence reuse and limits are in the investigation (`../../investigations/model-download-outcome-2026-10-11.md`, removed; see Git history). Sandbox DNS initially blocked packaging; network-enabled retry passed. Host installation, running app and real model library remain untouched. Maintainer must install/reopen to apply the policy; overwritten bytes are not recovered. No inference, foreign native execution, signing, publication or build reproducibility claim. C1–C10 remain pending. | +| 2026-10-11 | Primary deletion shares the live HF owner grant with exact destination exclusion. | Follow-up (`../../investigations/model-deletion-feedback-2026-10-11.md`, removed; see Git history): the installed frontend still contained the older silent-delete handler; the earlier resume candidate included feedback but retained root-wide deletion contention. New primary API/local IPC deletion retains transfer-effect and admission exclusion for the exact destination, checks physical root and durable custody, and obtains the existing intent claim. Separate shared admission reads preserve concurrent queueing; pre-write refusal cannot poison shutdown. Direct standalone/foreign native exclusion and other mutation rules remain. Default core package 2,333 passed/30 skipped; RPC package 438/12, including all 410 binary tests and real active-download HTTP deletion refusal/success/completion; six headless deletion regressions pass; strict default core/RPC all-targets Clippy and formatting pass. Earlier unexplained vision request-count failure is documented separately, with unchanged strict assertions and added provenance; final runs pass without a causal-resolution claim. Standards snapshot `snapshot:v1:28e650df-0dc6-4f90-9b6d-75377680eebb`: 33 policies, zero unresolved routing categories. Distinct local installer and newer Debian revision selected; optimized producer/package qualification pending at this source boundary. Host app/library/install remain untouched; C1–C10 remain pending. | +| 2026-10-11 | Link-registry cache/snapshot/publication serialized for overlapping deletions. | Follow-up (`../../investigations/model-deletion-feedback-2026-10-11.md`, removed; see Git history): review found snapshot capture before asynchronous atomic writes could allow old snapshots to publish late. A 0.02-second regression was red before serialization. Clones now share one mutation turn across load, cache changes and publication; the actual worker retains it if its waiter disappears. Transfers do not take this registry turn; no format, receipt or checksum policy changed. Seven registry tests pass, including overlapping removals and abandoned save waiters with canonical reload. Final default core package 2,335/30 skips (2,107/14 unit); default RPC 438/12 (410 binary); seven headless registry tests pass; strict default core/RPC all-targets Clippy and formatting pass. Earlier vision event remains separately documented without a causal-resolution claim. The first `896a7e67` optimized attempt was interrupted and is invalid installer evidence; replacement producer/package checks pending at this source boundary. User library/install and original tracked edits remain untouched; C1–C10 remain pending. | +| 2026-10-11 | Deletion-scope Linux installers qualified and distinctly identified. | Producer/RPC `0ba3b6cb91cbb9bda84c0627172efb1e3cd6a272`: new normal optimized backend and current frontend/Electron builds pass. Exact Debian/AppImage resources and extracted RPC health/shutdown pass; isolated Debian installation, alternatives, Electron 43.7.0 and removal pass. Metadata `0.8.0~rc.1-2026101101` is verified newer than installed `0.8.0~rc.1`. Candidates, `SHA256SUMS` and `local-build-record.json` are in original-repository `electron/release/deletion-scope-20261011/`; exact-verified installer copy is `electron/release/Pumas-Library-delete-fix-20261011-0ba3b6cb-amd64.deb`. Evidence (`../../investigations/model-deletion-feedback-2026-10-11.md`, removed; see Git history) records hashes, optimized exact-target deletion probe, warnings, suite reuse and limits. Installer contains the deletion alert missing from the observed installed frontend. Actual user library/install and original tracked edits are preserved. No inference, foreign native execution, signing, publication or reproducibility claim; prior unexplained vision request count remains documented. Locked review/push worktree remains retained-protected; C1–C10 remain pending. | The maintainer retains `fix/main-test-validation` and its locked worktree `/media/jeremy/OrangeCream/Linux Software/repos/owned/ai-systems/Pumas-Library/tmp/pr69-download-controls-20261011` @@ -110,3 +110,12 @@ Full optimized workspace execution passed: 3,143 tests, 46 existing ignored, 54 suite summaries, exit zero. Headless RPC also passed 259 tests (13 existing ignored). All local affected source/static/package checks are green; required native/composed claims remain open, with no full objective-acceptance claim. + +## 2026-11-04 — v0.8.0 documentation review + +Implementation merged to `main` in `619c55cc` (2026-11-02) and ships in 0.8.0. +Main Build 41702863505 passed the `torch-quality` jobs on Linux, macOS and +Windows, which run the `retained_location` cases with default and no-default +features. C1 composed watcher/classification and C6 process-termination +evidence remain pending; status stays Verifying. Links to removed +`docs/investigations/` notes are rewritten as plain paths (Git history). diff --git a/docs/plans/download-location-reconciliation/plan.md b/docs/plans/download-location-reconciliation/plan.md index c46b83551..cd46e43e4 100644 --- a/docs/plans/download-location-reconciliation/plan.md +++ b/docs/plans/download-location-reconciliation/plan.md @@ -1,10 +1,16 @@ # Download location and failed-attempt reconciliation -- Status: **Verifying**; the recovery implementation and Linux desktop path are complete; required composed/native evidence remains open. +- Status: **Verifying**; the recovery implementation and Linux desktop path are complete and merged to `main` + (`619c55cc`, 2026-11-02), so they ship in 0.8.0. Required composed evidence remains open. +- Status review (2026-11-04, v0.8.0): the native `retained_location` cases (default and + `--no-default-features`) now run in the `torch-quality` matrix and passed on Linux, macOS and + Windows in main Build 41702863505. The C10 Debian evidence in [M3](reports/m3-evidence.md) is for + the 0.8.0-rc.1 review candidate, not the final 0.8.0 package. The C1 watcher/classification + composed flow and C6 process-termination probes in [M2](reports/m2-evidence.md) are still pending. - Created: 2026-10-10. - Canonical identity: `docs/plans/download-location-reconciliation/plan.md`. - Admission operation for a subsequent implementation request: `start`. -- Current phase: verification and Linux review-candidate delivery. +- Current phase: verification of the remaining composed custody and interruption claims. - Exactly one next slice: **M2 — remaining composed custody and interruption evidence**. - Objective acceptance: **pending**. Existing guard tests support the design; they do not satisfy this plan's new acceptance claims. diff --git a/docs/plans/download-location-reconciliation/reports/m2-evidence.md b/docs/plans/download-location-reconciliation/reports/m2-evidence.md index 5f04730ea..4ffcd93b1 100644 --- a/docs/plans/download-location-reconciliation/reports/m2-evidence.md +++ b/docs/plans/download-location-reconciliation/reports/m2-evidence.md @@ -30,6 +30,7 @@ flow required by C1 is not established by the focused guards or the same-destina transfer. C6's controlled process termination at publication/live-settlement boundaries is also not replaced by fault injection and normal reopen. These exact composed probes remain pending; no assertion or accepted claim hides that gap. -The existing native CI matrix now runs retained-location tests with default and -no-default features on Linux/macOS/Windows. New non-Linux results are unavailable -until this source is pushed and those jobs run. The plan remains Verifying. +The existing native CI matrix runs retained-location tests with default and +no-default features on Linux/macOS/Windows; after the 2026-11-02 merge they passed on +all three in main Build 41702863505 (`torch-quality` jobs). The composed probes above +remain pending, so the plan remains Verifying. diff --git a/docs/plans/headless-inference-distribution-v0.8.md b/docs/plans/headless-inference-distribution-v0.8.md deleted file mode 100644 index 3bcede070..000000000 --- a/docs/plans/headless-inference-distribution-v0.8.md +++ /dev/null @@ -1,402 +0,0 @@ -> Current packaging engineering: the release workflow now requires three additional -> inference headless candidates and uses checked official CPU ORT member pins. -> See [Releasing](../../RELEASING.md#inference-headless-candidates) for the current -> workflow and acceptance boundaries. The historical local-only scope below -> predates this wiring. The integrated source candidate is `0.8.0-rc.1` with -> matching default/S3 attribution; native pretrained inference and signing remain -> unqualified. Version preparation does not authorize or publish a tag/release. -> References below to a 0.7 source or older missing implementation describe the -> historical PR59 review scope, not the current integrated candidate. - -# Draft v0.8 inference headless distribution - -The stable integrated review base is PR59 source -`c1208926afea88c382dd25036735f900c074e9a0`, tree -`e2b9826426df4079e62f0d76ee07c5e6aa3fc640`. It includes the public discovery, -physical-store, S3, modality and packaging candidates. This distribution slice -adds an opt-in local producer on a separate branch; it does not edit PR59, -authorize release/tag publication, or change the thirteen-asset release inventory. -Actual inference-enabled archives and consumer acceptance remain unqualified. -The package version is still 0.7.0, so the strict v0.8 candidate gate currently -refuses production before Cargo. An authorized integrated version change is a -separate prerequisite; this slice neither bumps nor relabels the version. - -The separately reviewed successors are preserved as bounded commits: - -| Slice | Source commit | Observed scope | -| --- | --- | --- | -| HF external-directory refusal | `8e11fb8c91335f6223ea9d0fa02387ea615ba639` | Synthetic package/cache regressions; no invented external root or content digest | -| Modality-first facade | `7f2d5478dbe3df9378e66f9f0d51dbfaed94cf27` | Controlled selected-model HTTP/owned-adapter contracts and legacy compatibility | -| Installed-audio candidate custody | `4737f0b68f75ceda9118a5bddfd418a498a6bdba` | Actual held runtime/model capabilities and controlled drift/lifetime tests; no production admission grant | -| Local inference candidate producer | `de62f8a1e05e5e71ebe4214cb43c95d458a6aa58` | Controlled build/archive contracts and actual Git-root regressions; current 0.7 source refused before Cargo | - -The final integration evidence records its own exact head/tree and included -commits. These successors do not change PR59's source or establish native model, -consumer-production-pin, archive or release acceptance. - -## Audited targets and acceptance boundary - -| Candidate | Rust target | Native runner | Format | Actual inference qualification | -| --- | --- | --- | --- | --- | -| linux-x86_64 | x86_64-unknown-linux-gnu | ubuntu-24.04 | tar.gz | unavailable | -| windows-x86_64 | x86_64-pc-windows-msvc | windows-2025 | zip | unavailable | -| macos-arm64 | aarch64-apple-darwin | macos-15 | tar.gz | unavailable | - -These are the existing headless platform candidates, not newly accepted host -binding tuples. `bindings/support-matrix.json` accepts no host-language binding -tuple. The old artifact plan says macos-14; the current workflow uses macos-15. -Record the actual native runner/toolchain rather than reuse that stale label. - -`scripts/release/artifact-plan.json` currently selects five full desktop, five -no-inference desktop, and three **no-inference** headless outputs. Those headless -outputs cannot satisfy the requested inference distribution. RPC defaults enable -`inference-plugins` but omit S3; the intended combined build must explicitly use -`--no-default-features --features s3,inference-plugins`, `--locked`, the exact -native `--target`, and the production release profile. The new opt-in local -`headless_inference_build.py` producer runs that exact command and invokes the -existing assembler. Active `build.yml` tag jobs still produce only the three -no-inference headless archives. Automatic inference release workflow wiring and -activation are separate work; this local producer adds no remote asset upload. - -In the pinned cohort, `/health` only reports status. Runtime loading is lazy, so startup does -not prove ONNX loading. `get_status` has a semver and `get_launcher_version` reads -a short launcher-root Git identity: neither binds the compiled full source tree, -protocol/schema, modalities, or shipped native closure. - -## Ownership and shared contract dependency - -Modality owns inference request/result/capability schema. Discovery owns readonly -discovery, advertisement and bootstrap. Packaging reserves only: - -- `scripts/release/headless-inference-plan.json` -- `scripts/release/headless_inference.py` -- `scripts/release/headless_discovery.py` -- `scripts/release/headless_inference_build.py` -- `scripts/release/test_headless_inference_build.py` -- `scripts/release/test_headless_inference.py` -- `scripts/release/headless-inference.test.mjs` -- `scripts/release/fixtures/headless-rpc-fixture.c` -- this document - -The shared owner contracts already exist: `PumasBuildInfo` in -`pumas-core/src/build_info.rs`, `InstanceDescription` in discovery, and -`HttpServiceDescription` at `/.well-known/pumas`. Packaging now consumes those -exact fields rather than accepting configurable GET paths or JSON pointers. -`headless_discovery.py` is the packaging decoder, not a new network protocol. - -Compatibility record version 2 pins the RPC `build_info` and `core_build_info` -objects, including package version, build ID, source revision, target, namespaced -compiled features, named protocol versions and named schema versions. Ordinary -builds may omit provenance; this distribution verifier refuses missing provenance. -The RPC and library builds must agree on their source/package/build/target context. -The existing `version`, `source_commit`, `source_tree`, `build_id`, -`schema_sha256`, `inference_enabled` and `features` fields remain package/build -provenance. Source tree and schema-byte digest are not fields of the live owner -advertisement and are not falsely projected into it. Compiled inference features -never establish model readiness or a modality capability. No live modality claim -is inferred from build metadata. - -The additive `pumas-rpc --describe-local-http --launcher-root PATH` command is a -read-only projection of the existing `LocalDiscovery::borrow_http_service`. It -requires an explicit existing root, reads the selected registry, authenticates -core context, observes the registered HTTP generation and reauthenticates the -core. Failure stays failure; it never claims a root, starts an owner, downloads a -model, stops the borrowed service or exports connection tokens. The resulting -JSON is a point-in-time observation. The command exits and retains no lifetime -lease for later client calls or inference. - -The packaging verifier executes that command from the verified extracted binary, -validates both pinned build objects and selected root/registry library ID/core -and HTTP generations, fetches only `/.well-known/pumas` on a numeric loopback -endpoint without redirects/proxies, then repeats the authenticated observation. -The selected root is bound to the advertised root using the native filesystem's -existing directory identity (`samefile`), including Windows ordinary versus -extended-length canonical spellings. Relative, missing, non-directory or -unavailable observed paths are refused. No prefix removal or case folding is -used to guess identity; this check does not retain a physical lifetime lease. -Any change fails. A matching arbitrary HTTP response without the existing -Pumas-owned authentication path is insufficient. Library IDs remain registry -context, not physical-library identities. Consumers must keep model acquisition -inside Pumas and query/reuse existing local libraries before considering a -separately authorized acquisition. These checks do not implement a competing -model cache, downloader or owner reclamation rule. - -The five-consumer cohort is **Lanternwake, Tuldok, Pantograph, Eidetic and -Chrema**. Lanternwake requires Audio→Text; Tuldok requires Image→Text captioning. -Archive and HTTP identity checks alone do not implement or qualify those -operations. The reviewed facade now accepts a selected model, typed input and -desired output without a named capability, using the existing -`POST /v1/model-operations` route. It matches declared available adapters and -requires `semantic_task` when multiple operations fit the same modalities; -option shape cannot select a task. Legacy named-capability requests keep their -strict parsing and existing admission/cancellation paths. See the -[RPC request contract](../../rust/crates/pumas-rpc/README.md). - -Text→Text, Text→Embeddings and Text→Image use existing adapters when declared -available. Audio→Text resolves only to the existing qualified owned endpoint; -the current installed runtime remains unavailable. Typed Image→Text, mixed -image/audio message parts and PCM audio output are recognized but explicitly -refused because no qualified executable adapter is declared. Image decoding, -vision transport and installed audio admission remain separate implementation -and qualification gates. This is not arbitrary modality-pair execution. - -Pantograph and Eidetic need one immutable Rust source/schema cohort. Reviewed -Pantograph source `9fae65abe41ad91434b984f95f95dee94438dda2` still pins production -Pumas `26a84e323cae566a46a8f76bef48fa1010aed48b`; the earlier controlled contract -slice is `038dacaaa98ebd007c32e13d4608726ca5ccf63a`. That older Pumas pin predates -current HF directory/observation fixes. Reviewed Eidetic main -`c4587c11911af355c2446d0befa5ac1cbde8f3e3` uses a sibling path and prepares -`a94fd92021f27fdeedb6e2de6e01c41c250ef576`. Neither consumer is source-pinned to -PR59 merely because the combined source exists. Update manifests, lockfiles, -preparation/CI pins and exact consumer tests together after the accepted final -integration. Chrema's exact transport, source/archive pin and native modality -acceptance must come from its owner; this slice does not invent that contract. -Exported source also needs explicit identity evidence rather than skipping -verification when `.git` is absent. - -PR59's controlled contracts and Pantograph's tiny committed untrained BERT CPU -forwards are useful bounded evidence. They do not qualify a pretrained model, -Lanternwake transcription, Tuldok captions, Chrema, packaged ORT, or any native -Windows/macOS distribution. Each final consumer record must identify its exact -source or archive hash, schema and actual model/runtime bytes. - -## Explicit local input and package contract - -`headless_inference.py assemble` accepts an explicit filename-to-local-file map, -caller-trusted build/runtime/compatibility records with SHA256 pins, exact schema -bytes and an output path outside the checkout. It performs no downloads, Cargo -builds, model discovery/inference or publication. Inputs must be regular, -nonempty files; no directory scan copies ambient files or credentials. - -The build-record adapter requires `version`, `target`, `host`, `profile`, -`features`, `source: {head, tree}`, `build_id`, `inference_enabled`, `binary_sha256`, -`command` and `rustc`. Target and host must match the native tuple; profile must -be release. `headless_inference_build.py` now produces that record from observed -Cargo artifacts rather than asking a caller to assert that Cargo ran. Before and -after Cargo, Git's `--show-toplevel` must identify the actual build directory by -native `samefile` directory identity. A redirected `core.worktree`, unavailable -root or changed root is refused; valid linked worktrees and symlink aliases of -the same directory remain usable. Git/compiler observations use the explicit -build environment, with Git routing/config and compiler/wrapper overrides -refused. These are unsigned before/after observations under trusted local -custody, not proof that compilation inputs were immutable during a build. -It also checks a clean source head/tree, actual native compiler host, checked release -profile, forbidden flag/config overrides, current S3 attribution, and exact -core/RPC features. It forces `ORT_SKIP_DOWNLOAD=1`, offline/locked compilation, -and one Cargo build job. An uncached official dependency or missing native tool -is an explicit prerequisite; no automatic download or fallback is attempted. - -The compiled executable's existing `--build-info` output must exactly match the -pinned shared RPC `PumasBuildInfo`. The core projection removes only RPC's -`discovery.rs` additions (component, RPC feature names, local HTTP protocol and -HTTP advertisement schema); it must also match the pinned core object. This is -an adapter of the shared struct, not a parallel identity definition. It does -not substitute for authenticating the running core/HTTP owner during native -acceptance. Full source tree and exact schema-byte digest remain separate package -bindings, as they are absent from the live shared struct. - -Compatibility/runtime records and the explicit runtime filename-to-local-path -map require caller-reviewed SHA256 pins. Runtime target/version/loader/member -hashes and sizes are checked before Cargo and again before assembly. License and -notice bytes must match the source's checked license/S3 attribution. Source and -attribution are checked again after Cargo. Failure retains Cargo JSON/stderr; -only success writes the archive, adjacent checksum, build record and evidence. -Output must be fresh and outside the checkout. The producer obtains no runtime, -model, credentials or external account, and publishes nothing. A supplied record -hash proves bytes, not authenticity or completeness of the native runtime closure. - -Opt-in native production, after an authorized v0.8 source and reviewed inputs: - -```bash -python3 scripts/release/headless_inference_build.py \ - --target linux-x86_64 \ - --contract /tmp/owner-contract.json --contract-sha256 "$OWNER_CONTRACT_SHA" \ - --runtime-record /tmp/runtime-record.json --runtime-record-sha256 "$RUNTIME_RECORD_SHA" \ - --runtime-inputs /tmp/runtime-inputs.json --runtime-inputs-sha256 "$RUNTIME_INPUTS_SHA" \ - --schema /tmp/owner-protocol-schema.json \ - --license LICENSE --notices docs/release-attribution/0.7.0-s3/THIRD-PARTY-NOTICES.txt \ - --output-dir /tmp/pumas-inference-candidate -``` - -`runtime-inputs.json` contains exactly the runtime record's native-library names -mapped to explicit local regular files. The resulting archive and evidence stay -`unverified_candidate`; the command does not start a service, load ORT or run a -model. Review/rebuild target notices for the final authorized version before -acceptance; the current path reflects the unchanged source inventory. - -Metadata admission rejects unknown fields in every generated manifest, build, -source, runtime, compatibility, build-info advertisements and file-item object before -serializing metadata. It accepts bounded ASCII build identity tokens, named protocol/schema versions, -exact digests, typed sizes, and a bounded single-line -`rustc -V` version. Additional compiler details stay in separate reviewed evidence. -Build command features are exactly `s3` and `inference-plugins`; the shared -build-info objects additionally list the actual namespaced compile features. No values are silently redacted or reinterpreted. -The assembler creates a detached projection of only those public fields and -revalidates it before staging payloads. Nested lists/maps cannot retain aliases -to caller-owned metadata, and the actual admitted command is selected from the -closed local argv forms. Later mutations of the input records cannot add data to -staged metadata or change the returned manifest. - -`read_pinned_json` checks byte identity against a caller-supplied SHA256; its name -does not imply confidential content or authenticated provenance. The pinned -records, including build IDs and protocol/schema advertisements, -are intended for public distribution and require caller review before their pins -are supplied. Format bounds and projections do not identify secrets deliberately -placed inside otherwise valid public fields. Schema, license and notice files -remain explicit reviewed payload inputs. - -Build command metadata accepts only explicit offline, locked, native-targeted -`cargo build` release argv for `pumas-rpc`: the repository `--manifest-path -rust/Cargo.toml` form or Rust-workspace form, with `--no-default-features` and -the two required features. It also accepts the reviewed repository invocation -with `--bin pumas-rpc`, flags ordered as `--target TARGET --release`, and -`--message-format=json-render-diagnostics`. Both feature order spellings are -admitted; arbitrary extra flags, environment assignments, shell command strings, -and command arguments carrying unrelated data are rejected. Preserve the actual -admitted invocation rather than relabeling it. Synthetic canary tests show extra -metadata and appended arguments cannot reach `build-record.json` or -`manifest.json`; these are disclosure-admission controls, not a credential -scanner or proof that supplied metadata is authentic. - -The runtime record requires native target, version `1.24.2`, loader entry, -trusted source archive SHA256 and explicit native-library closure `{name: -{sha256, bytes}}`. The exact loader basename is `libonnxruntime.so`, -`onnxruntime.dll`, or `libonnxruntime.dylib`. Materialize a versioned Unix library -as a regular file at the exact loader basename and bind those bytes; archives -reject links. The current loader's C API/minor-version checks do not verify the -exact runtime pin or source bytes. The existing staging glob also does not -establish dependency closure. A trusted target-specific runtime producer and -native loaded-library evidence are required. - -Output is `pumas-rpc-inference-{version}-{target}.{tar.gz|zip}` with flat files: -the plain RPC executable, explicit native library closure, `LICENSE.txt`, -`THIRD-PARTY-NOTICES.txt`, `protocol-schema.json`, `build-record.json`, -`manifest.json`, and `SHA256SUMS`. An adjacent `.sha256` binds final archive bytes. -The schema digest binds the exact supplied valid JSON bytes; this slice invents -no schema normalization algorithm. Metadata is bounded to 1 MiB; payload to 4 GiB, -130 archive members. Tar uses USTAR and rejects PAX/GNU extension headers before -their bodies can allocate. Checksums prove byte identity, not authenticity or -license completeness. All manifests remain `unverified_candidate`. - -Example interface, using separately reviewed local records and hashes: - -```bash -python3 scripts/release/headless_inference.py assemble \ - --inputs /tmp/pumas-inputs.json \ - --build-record /tmp/build-record.json --build-record-sha256 "$BUILD_RECORD_SHA" \ - --runtime-record /tmp/runtime-record.json --runtime-record-sha256 "$RUNTIME_RECORD_SHA" \ - --contract /tmp/owner-contract.json --contract-sha256 "$OWNER_CONTRACT_SHA" \ - --schema /tmp/owner-protocol-schema.json \ - --output /tmp/pumas-rpc-inference-0.8.0-linux-x86_64.tar.gz -python3 scripts/release/headless_inference.py verify \ - --archive /tmp/pumas-rpc-inference-0.8.0-linux-x86_64.tar.gz \ - --sha256 "$ARCHIVE_SHA" --destination /tmp/pumas-fresh-extraction \ - --contract /tmp/owner-contract.json --contract-sha256 "$OWNER_CONTRACT_SHA" -``` - -`verify` hashes and parses one private archive snapshot, rejects unsafe names, -duplicates/case collisions, links, sparse/extension members, unexpected files, -declared-size and inner/outer checksum mismatches. Extraction must be fresh. -The operator must retain custody of the extracted directory; concurrent edits -during execution are outside this harness's acceptance contract. - -`verify --start` additionally rehashes extracted payloads, verifies the actual -native host, starts the exact extracted executable with a fresh launcher root and -ephemeral loopback port, authenticates and compares the actual owner response with strict JSON types, -then requires graceful stop of only the exact child it launched. Loader injection/search -variables (`LD_*`, `DYLD_*`) and ambient `ORT_*`/`PUMAS_*`/Python overrides are -removed; handshake HTTP requests bypass proxies. XDG/AppData/registry paths are -isolated. HOME, PATH and system -runtime dependencies remain; this is not a filesystem/network sandbox or a loaded -dependency audit. Unix uses SIGINT; Windows uses a new process group and -CTRL_BREAK_EVENT, requiring a usable native console and actual native evidence. -Forced shutdown fails acceptance. Output always keeps native runtime loading -and real inference **unqualified**. - -`verify --attach-root EXISTING_ROOT --registry-db EXISTING_REGISTRY` instead -observes the already-running selected owner. Both explicit paths are required; -`--attach-root` and `--start` are mutually exclusive. It executes only the -read-only observer and HTTP reads, never starts a server or sends a shutdown -signal. A missing, incompatible, changed or unreachable owner is refused without -fallback. Choose a registered library through Pumas's local discovery before -passing these paths; the verifier does not guess a most-recent library. - -## Tested slice and remaining release gates - -The Python suite covers both archive formats across all three target labels, -malicious members/extension headers, bounded metadata, trusted hashes, private -snapshot custody, schema/source/feature/content mismatches, and a controlled -Linux C process's exact extraction, live identity, sanitized loader environment -and graceful shutdown. Boolean/integer confusion, missing owner identity, build/schema/revision -mismatches, wrong roots and generation changes fail. Compatible borrowed attach -leaves the controlled owner running; refused attach has no startup fallback. -Early exit, readiness timeout, invalid port, redirects, forced-stop failure and -observer timeout without stopping a borrowed service are also covered. Neither synthetic runtime bytes nor the C executable are real -Pumas/ORT evidence. Windows/macOS process and inference evidence is unavailable. -The existing three-platform native QA job also runs `OwnerContractTests`; on -Windows this executes the ordinary/extended-length root identity regression. -Linux-only results cannot establish that native Windows check. The Node wrapper -is discovered by the existing source release test glob: - -```bash -python3 -m unittest discover -s scripts/release -p 'test_headless_inference*.py' -v -node --test scripts/release/*.test.mjs -``` - -Before changing release inventory/workflow or publishing, complete: - -1. Review PR59 and its separately preserved HF, modality facade, installed-runtime - and distribution successors; select one accepted immutable final source cohort. - Integration and controlled contracts do not qualify model inference. -2. Produce exact production-build and trusted native-runtime closure records - for each actual native runner, with no implicit ORT/model downloads. -3. Exercise exact consumer extraction/start/owner handshake/clean shutdown on - each tuple, including forced-stop failure and actual authenticated attach. - The controlled C fixture deliberately stands in for authentication; it is not - real Pumas binary acceptance. -4. With separately authorized, explicitly provided real model fixtures, prove - local model load, required modality inference, unload, actual loaded native - bytes and failure boundaries. Current health and synthetic tests are inadequate. - Existing Linux `verify-packaged-onnx.py` inherits `ORT_DYLIB_PATH`; remove ambient - runtime substitution in the eventual acceptance harness before claiming closure. -5. Review current target notices/SBOM, complete dependency/security and platform - signing/notarization requirements, and assemble final-file checksums/provenance. - The adjacent archive hash is not a complete release metadata inventory. Wire - inference-enabled archives into an explicitly authorized release workflow only - after the source/version/native acceptance gates; current tag jobs remain no-inference. -6. Obtain the parent/owner's release decision. This slice changes no tag, release, - existing artifact plan, root-owned candidate PRs or main merge. - -Assembly binds explicit inputs but is not reproducible-build proof: archive -timestamps/compression metadata are not normalized. Version manifests remain -on main's current version until the integrated version bump owner acts. - -The discovery baseline's historical local parallel S3/root-reopen refusal remains -unresolved. This packaging slice does not alter physical root ownership or erase -that evidence. Existing public hosted CI results are not substituted for native -per-platform qualification. No release versions, tags, release inventory, audio -admission or `for_installed_runtime` behavior change here. - -## Concrete remaining implementation and qualification gaps - -- `AudioRuntimeOwner::for_installed_runtime` is unconditionally - `UnqualifiedRuntime` in PR59 and the reviewed successor. The new non-admitting - candidate retains actual interpreter/dependency/sidecar capabilities and the - exact prepared-model allocation, validates bytes and selected worker code, - and preserves their leases. It has no production admission conversion. - The trusted recipe, complete native loader/model read containment and actual - pinned execution/lifecycle contract remain unimplemented or unqualified, - not merely awaiting a test. The facade keeps installed Audio→Text unavailable. -- Qualified Image→Text vision input/provider declarations and native caption - inference remain prerequisites. Text→Text, Text→Embeddings and Text→Image - adapters do not establish vision or arbitrary modality-pair execution. -- The current official managed-uv acquisition route is blocked by a proxy tunnel - 403 in this Cloud environment. It is not evidence of an upstream release HTTP - status, and no alternate host or security bypass is authorized. -- Public S3 model import requires a `.gguf` primary, including bundles. Generic - byte acquisition does not qualify arbitrary ONNX/Safetensors/Diffusers import. - Exact AWS, independent-provider and MinIO acceptance remain unrun. -- Native inference-enabled distribution assembly/checksums, actual loaded runtime - closure, per-platform model inference/disposal, final consumer pins and release - workflow activation remain unqualified. The local producer is implemented; - controlled subprocess/fixture tests are not a native build or model acceptance. diff --git a/docs/plans/hf-cached-search-ui-2026-10-08.md b/docs/plans/hf-cached-search-ui-2026-10-08.md deleted file mode 100644 index 3f384bb7c..000000000 --- a/docs/plans/hf-cached-search-ui-2026-10-08.md +++ /dev/null @@ -1,25 +0,0 @@ -# Present retained HF detail discovery through the existing UI - -The [explicit local discovery API](hf-local-detail-discovery-2026-10-08.md) supplies `cache:` search, source admission, visibility exclusions and bounded reads. The existing `search_hf_models` RPC and adapter signatures already carry the query and complete `modelCard`; the UI consumes those contracts without adding a producer, privileged IPC method or generated schema. - -## User workflow - -In Model Manager, enter model search and choose **Cached details (offline)**. An empty query browses the retained anonymous detail family. Typed queries reuse the existing search state and filters. The preserved manual `cache:` prefix also selects this presentation; selecting Hugging Face strips that prefix. The default remains ordinary Hugging Face search. No unavailable ordinary query silently falls back to cached results. - -Cached rows show the exact observation source URL, observation time, freshness expiration, explicit stale or “within TTL at search” status, and observed revision (or “Not recorded”). The status is an observation at search time, not current online confirmation. The banner and row explain that current access, download selection and backend readiness require their normal live checks. The UI validates the owner marker and provenance before display and clears cached annotations on ordinary results; malformed cached provenance produces an error rather than ordinary-looking rows. - -Cached search passes zero hydration and offers no new download selection or detail menus, including quant-derived and All Files fallbacks. Existing known download jobs retain Pause/Resume/Cancel controls by existing job keys; these do not select a new artifact. Source/query context changes hide previous rows immediately. Debounce cancellation suppresses queued requests and generation checks ignore late search/hydration responses. These are client delivery protections, not cancellation of an already admitted server read. - -## Qualification - -`qualify-hf-cached-search-ui.py` launches the actual minimal `pumas-rpc` binary with an owned launcher root and XDG config, seeds actual anonymous observation envelopes, and inserts one owned ordinary exact-search SQLite fixture after the producer initializes its unchanged schema. Private, gated and unknown-visibility fixtures must be excluded. Exact fresh/stale/missing-revision markers, filtered browse, bounded-limit refusal, unchanged observation bytes, abandoned delivery and live download-detail/acquisition refusal are checked. Failed acquisition must leave empty model and download lists. - -Both uppercase and lowercase proxy variables route upstream requests to an owned refusing loopback server; no real HF, provider or model download is contacted. Request counts measure zero additional upstream calls during cached browse/filter. Startup checks may attempt GitHub through that refusing oracle and are recorded separately. The qualification fixture preserves the process home environment. The helper refuses ambient CLI token presence (including symlinks), removes HF_TOKEN and requires a new owned XDG config without credentials. This is bounded anonymous qualification, not full home isolation. Each RPC/fetch/process wait is bounded; shutdown completes cleanup before reporting errors. - -The mounted workflow uses actual ModelManager, source chooser, search hook, filters, list and summary. It consumes actual HTTP RPC responses when `PUMAS_HF_UI_RPC_URL` is set, and controlled responses otherwise. Unrelated library/download hooks and the adapter transport entry are mocked. Tests cover blank browse, source/time/revision presentation, nonpublic exclusion, nonempty quant tags without download menus, new query filtering, immediate switching, cancelled debounce, late actual response delivery and unavailable ordinary search without fallback. This qualifies mounted React/jsdom plus a launched real RPC process. It does not qualify native Electron, preload/privileged IPC, a real browser window, screenshots, actual online HF success, provider acceptance or inference. - -## Integration and verification - -The UI depends on the anonymous detail-cache protocol, aggregate budget and explicit local discovery API. Cargo qualification uses locked dependencies and `ORT_SKIP_DOWNLOAD=1`. The existing official locked frontend dependencies provide the test/build tooling; no dependency or lockfile change is required. - -Recorded qualification passed 25 focused frontend tests, the 904-test/135-file frontend suite, three mounted actual-RPC workflows, one launched RPC integration test, scoped ESLint, TypeScript, Vite library-only build, strict scoped RPC Clippy, Rust formatting, Python compilation and whitespace checks. Core production sources were unchanged by the UI work, and no new full-core run is claimed here. The inherited core registry test failure on a read-only default user configuration directory remains documented in the local-discovery report. These results do not establish native Electron, privileged IPC, real online HF success or inference. diff --git a/docs/plans/hf-demand-download-details-2026-10-09.md b/docs/plans/hf-demand-download-details-2026-10-09.md deleted file mode 100644 index 91f6f76b7..000000000 --- a/docs/plans/hf-demand-download-details-2026-10-09.md +++ /dev/null @@ -1,50 +0,0 @@ -# Demand-driven Hugging Face download details - -This report records the feature source -`d13a4e4209117ad7c5ed6603fc0e1a424298055e`. Its recorded qualification below -remains historical for that source and backend binary; later composed trees -require their own affected frontend/HTTP/consumer qualification. - -## Acceptance goal and scope - -The [HF cache brief](../breif/hf-cache.md) separates lightweight discovery from expensive repository hydration. Ordinary interactive model search now requests `hydrate_limit = 0` through the existing search contract. Search can reuse existing local download details, and a discovery cache miss can still make its ordinary upstream search request. Opening one repository's download menu requests that repository's missing details; simply rendering a search result does not request its file tree or config. - -This follows the [explicit cached-search presentation](hf-cached-search-ui-2026-10-08.md). Cached mode remains offline and offers no new download choices. There is no new search method, transport, importer, cache publisher or download owner. Existing native/RPC contracts and all Rust sources are unchanged. S3 remains a byte transport and retains the shared format-independent importer. - -## Selected detail behavior - -Discovery size totals and quant tags alone do not prove downloadable file choices. The hook and menu share one predicate for usable existing options. A successful selected response records completion separately from sizes, so unknown-size options are usable and an empty response displays “No downloadable files were found” without fabricating quant or all-files choices. - -Loading suppresses download choices. A failed or repository-mismatched response preserves the discovery row and exposes an error plus “Retry download details”. Closing and reopening the failed menu preserves that error; only an explicit retry initiates another request. A successful response replaces its selected row's options and total, preserving file-group identities and other repositories. Existing acquisition still performs its own live selection, integrity and package checks. - -Per-repository in-flight requests coalesce within a search generation. Registration precedes transport invocation, including a synchronous transport failure, so the failed request cannot strand a settled promise and disable retry. Successful completion is retained synchronously as well as in UI state. Retained callbacks therefore reuse completed empty or unknown-size results. Admission and response application check the current query/source context and generation; old responses, callbacks after a source switch, and delivery after unmount cannot hydrate the new view. Visible-result references are installed in the layout phase before interaction. - -These are renderer request and response-delivery rules. Ignoring an old reply does not cancel already admitted server or filesystem work. The existing backend remains responsible for effect ownership and cancellation. - -## Local qualification - -The following final-source checks passed: - -- Full frontend suite: **912 passed, one skipped, 136 files**. The skipped case requires a launched RPC process and was executed separately below. -- Focused hook and mounted-workflow regressions cover zero eager hydration, selected-repository identity, coalescing, failed reopen, explicit retry, wrong-repository refusal, unknown sizes, empty options, synchronous failure followed by retry, retained callbacks, query/source changes and unmount. -- TypeScript `--noEmit`, scoped ESLint with zero warnings, Vite library-only build, Python byte compilation and whitespace checks. -- `qualify-hf-cached-search-ui.py --demand-details`: **four demand workflows** (three controlled adapter-response cases and one mounted actual-RPC failure/retry case), followed by **three existing mounted actual-RPC cached-search workflows**. The runner also checks actual RPC envelopes, cached provenance/visibility, ordinary failures and absence of published models or download jobs. - -The launched process used the previously qualified RPC binary with SHA-256 `de49db710e5fd57dbcb9245023fb44577111c73656f1fdd87feb56a481babb12`. All tracked Rust source and dependency blobs are unchanged from its qualified source. No new Rust build or core-suite run is claimed. No build-time ONNX download occurred. - -The owned exact-search fixture contains two rows without download options. Discovery causes **zero** upstream detail attempts. Selecting the second row and explicitly retrying its failure causes **two** refused upstream attempts, both initiated through that row's actual detail RPC. No model bytes are downloaded. Positive detail/menu cases use controlled adapter responses; the rejecting loopback proxy is not a Hugging Face or S3 provider. - -The initial new mounted regressions failed against the previous behavior. During implementation, the broader suite exposed a selected-click race before a passive latest-results update; the layout-phase update repairs it. Initial fixture mock/typing issues and lint failures were corrected before the final runs. No unresolved failure remains in the checks executed for this slice. Existing broader core registry baseline failures are documented in the [local-discovery report](hf-local-detail-discovery-2026-10-08.md) and were not rerun here. - -## Reproduction and limits - -Run the existing frontend test, type, lint and library-build commands. Execute the launched-process case explicitly: - -```sh -python3 scripts/tests/qualify-hf-cached-search-ui.py \ - --rpc "$PUMAS_RPC" --demand-details --output "$QUALIFICATION_OUTPUT" -``` - -Use a fresh owned output directory, anonymous configuration and the supported local RPC build. The driver refuses to read or alter an ambient CLI token. Its proxy rejects upstream access; fixture records are inserted only into the owned test database. - -This qualifies the described mounted React/jsdom and loopback RPC paths, not native Electron, privileged IPC, visual acceptance, real online-provider success, import of a new model or inference. Successful real-provider detail hydration may paginate or fetch selected config metadata; this slice does not impose a one-request budget on that operation. It does not change default hydration behavior for other native/RPC callers, HF access policies, rate-limit policy or the persistent cache schema. Shared/bulk catalogs, broader request admission and real-provider/native acceptance remain separate roadmap work. diff --git a/docs/plans/hf-discovery-cache/readiness.md b/docs/plans/hf-discovery-cache/readiness.md index df7a66163..959cb7475 100644 --- a/docs/plans/hf-discovery-cache/readiness.md +++ b/docs/plans/hf-discovery-cache/readiness.md @@ -1,8 +1,10 @@ # Deferred Hugging Face discovery-cache service readiness -Status: planning only, 2026-10-03. Revisit after the current baseline repairs, -S3 acquisition and restricted networked-node milestone. This checklist does not -start search implementation or authorize external resources. +Status: deferred planning checklist, 2026-10-03; reviewed unchanged for 0.8.0 +(2026-11-04). The local `cache:` browse and demand-driven detail hydration shipped +in 0.8.0 (see the brief); the shared/bulk service below is not started. Revisit +when a shared or bulk discovery cache is selected as product work. This checklist +does not start search implementation or authorize external resources. ## Source and dependency decisions diff --git a/docs/plans/hf-local-detail-discovery-2026-10-08.md b/docs/plans/hf-local-detail-discovery-2026-10-08.md deleted file mode 100644 index 69cfe0780..000000000 --- a/docs/plans/hf-local-detail-discovery-2026-10-08.md +++ /dev/null @@ -1,41 +0,0 @@ -# Local discovery from retained anonymous HF details - -## Existing boundary and selected workflow - -The [HF cache brief](../breif/hf-cache.md) calls for useful local search across previously learned repository records while upstream is unavailable. `HuggingFaceClient::search` reuses exact SQLite query identities and may rehydrate them online; new ordinary queries go online. Full-detail observations retain source, validation time and observed commit. The workflow below makes these retained observations explicitly browsable without changing local library FTS, which searches imported models. - -The existing public `PumasApi::search_hf_models` and `search_hf_models_with_hydration` now accept the reserved query prefix **`cache:`**. `cache:` browses retained detail records; `cache:acme multilingual` searches them with case-insensitive conjunctive whitespace tokens. The same existing IPC/RPC search delegation uses that consumer. Ordinary queries retain their existing behavior; upstream errors, including authorization denials or rate limits, do not silently turn into local successes. - -Examples: - -```rust,ignore -// Zero upstream requests, even when disconnected. No detail/tree hydration. -api.search_hf_models("cache:", None, 25).await?; -api.search_hf_models_with_hydration("cache:acme multilingual", Some("llm"), 25, 0).await?; -``` - -This is bounded browse/search of retained details, not a full HF catalog or FTS producer. The native `HuggingFaceClient::search_cached_model_details(&HfSearchParams)` additionally accepts bounded offset and format filtering. Only records learned by anonymous detail hydration qualify; search-only SQLite records are outside this workflow. No new SQLite index, background producer, external service, peer distribution, new RPC method or frontend contract generator is added. - -## Public result semantics - -The existing `HuggingFaceModel` result type is preserved. Search considers repository ID, model name, developer, inferred task and tags; all query tokens must match the combined projection. Kind filters preserve the existing `llm`, `reranker`, `diffusion` and `audio` aliases. Native format filters match exact supported-format tags. Results sort by repository ID before pagination. Empty query browses, zero limit returns an empty result, no match returns empty, and capacity/admission failure returns an error instead of a fabricated empty or partial catalog. - -Each returned `model_card.pumas_discovery` is replaced wholesale with owner-derived `source`, exact `source_url`, `observed_at`, `freshness` (`fresh` or `stale`), `fresh_until`, optional `revision_observed`, `visibility_observed` and `discovery_only: true`. Provider card data cannot spoof that reserved member. Freshness uses the persisted conservative TTL/Age/no-cache policy; stale entries stay discoverable in this explicit mode and are never relabeled fresh. Commit observations do not become immutable download revision authorization. Download options remain empty; compatibility hints are cleared because this projection does not qualify a package or backend. - -Discovery reads perform no HTTP, authentication-header lookup, tree hydration, observation/LRU timestamp refresh, cache write or eviction. Actual snapshot/revision/file selection and acquisition retain their live admission checks; an offline discovery result cannot make an unavailable download succeed. Existing Refetch/detail getters retain their prior fresh/stale/error policies. - -## Visibility, provenance and bounds - -Only known valid observations from the current exact HF API source are considered. Their body must explicitly declare `private: false` and `gated: false`; missing, null, wrong-type, duplicate, private or gated declarations in those fields are excluded. `disabled: true`, wrong-type and duplicate disabled declarations are also excluded; absent/null disabled is unspecified. Typed decoding rejects duplicate visibility fields. Authenticated calls do not populate this anonymous store; current authentication does not expose authenticated records through this workflow. Anonymous retained public bytes describe **visibility at observation time**, not current online visibility: offline browsing cannot establish that a formerly public repository is still public. Unknown legacy visibility is excluded until a normal permitted anonymous detail refresh records it. - -The reader reuses existing detail-family filename/identity checks, held-directory/non-following regular-file reads, source URL hashing, bounded observation/body validation and StoreLifetime ownership. Directory admission remains held by the actual read effect after caller cancellation. Whole-directory accounting must fit 256 exact-family regular records and 64 MiB logical final bytes, with at most 4096 directory entries; incomplete/nonregular/over-capacity inventories fail closed before returning results. Reads add at most one overflow probe per admitted entry. Query length is at most 256 bytes, kind/format at most 128 bytes each, result limit at most 100 and native offset at most 256. Unknown/corrupt/future/wrong-identity records remain unmodified and are skipped. Foreign cache families receive no discovery or cleanup authority. - -Up to 256 candidate projections can be materialized within the 64 MiB input budget before sorting; at most 100 are returned. The existing cooperative exact-lexical-directory/current-process coordination boundary is unchanged. This feature does not add cross-process coordination, catalog completeness, semantic ranking, strict access LRU, stale-success to ordinary search or ongoing knowledge of private/gated status. The source indicator prevents custom endpoints being silently represented as observations from the default authority. The [cached search presentation](hf-cached-search-ui-2026-10-08.md) adds an explicit UI source chooser using this same existing search contract. - -## Recorded qualification - -Owned loopback fixtures exercise actual public `cache:` callers after shutting down upstream, new-query discovery without a historical exact query, browse/reopen, deterministic limits/filtering, explicit fresh/stale/revision/source projection, reserved provenance spoof replacement, authenticated/private/gated/unknown/duplicate visibility exclusion, current-source isolation, corrupt/future records, bounded/nonregular inventory and unchanged live acquisition checks. Cargo uses locked offline official dependencies and `ORT_SKIP_DOWNLOAD=1`; no large model or native ORT download is used. - -At the local-discovery stage, 19 public metadata tests, including eight local-discovery workflows, and 32 cache tests passed, as did strict all-target Clippy, formatting and whitespace checks. The full `hf-client` library run passed 1,998 tests with 11 ignored and one environment baseline failure: `api::models::tests::get_inference_settings_batch_reports_per_model_errors`, creating the default user registry on a read-only filesystem. The failure reproduced in an earlier accepted observation-cache binary with the same failing API source blob as the immediate pre-discovery sources. This is not an all-green full-suite claim or an immediate-predecessor binary comparison. - -This workflow depends on the anonymous observation protocol, per-path admission and aggregate detail-cache budget. Real-provider behavior, native desktop transport and inference remain separate qualification requirements. Ordinary search and live acquisition must continue requiring their own source checks. diff --git a/docs/plans/hf-metadata-caller-adoption-2026-10-08.md b/docs/plans/hf-metadata-caller-adoption-2026-10-08.md deleted file mode 100644 index 9e94bcdbf..000000000 --- a/docs/plans/hf-metadata-caller-adoption-2026-10-08.md +++ /dev/null @@ -1,41 +0,0 @@ -# Adopt persistent HF details in file-metadata discovery - -## Selected existing caller - -This follows the [HF cache brief](../breif/hf-cache.md) and [bounded observation protocol](hf-model-detail-cache-2026-10-08.md). The brief separates discovery from detailed hydration and from download/execution admission. The existing public `PumasApi::lookup_hf_metadata_for_file` and its IPC dispatch both use `HuggingFaceClient::lookup_metadata` to propose metadata for a local file. That advisory workflow is the adoption point. - -Search and existing top-two file-tree matching remain unchanged. Only the selected LFS match, otherwise the selected filename fallback, is hydrated through `get_model_info_cached`. Empty search returns no match without detail hydration. Other candidates do not receive model-detail requests. Full model card, license, official name, pipeline/model type hint and release date come from the qualifying observation. Existing repository/match identity, confidence, expected hash, local fast hash and pending-full-verification state are preserved. A descriptive observation does not verify an artifact, import a package or establish backend compatibility. - -A failed stale detail refresh propagates an error; it does not replace that failure with old descriptive metadata or return a result presented as a freshly hydrated match. This can make a lookup fail where it previously returned an incomplete filename/LFS suggestion. There is no offline stale-success policy in this slice. - -Explicit public metadata Refetch retains `get_model_info` force revalidation. Download snapshots and revision resolution retain their live source/revision identity checks. Search ranking, catalog/SQLite logic, download preparation, acquisition, importer, runtime, vision and release production are not modified. The search request uses the existing `api_base_url` accessor; the default production URL is unchanged, and an existing test source override can now route the public discovery workflow entirely to owned loopback HTTP. - -## Narrow bounded refresh admission - -Simultaneous lookups can select the same repository before either detail response has been published. Anonymous detail reads therefore serialize by exact observation-file path, then recheck authentication and cache freshness after admission. An ordinary follower can reuse the newly published fresh detail without a duplicate detail GET. Explicit Refetch, no-cache/zero-freshness responses and unavailable disk persistence still require their own revalidation; this does not share stale or uncacheable payloads as fresh. - -The process-local registry holds weak mutex references only. It retains neither clients, credentials, response bodies nor store leases. At most 64 distinct exact paths and 32 participants per path are admitted; exhausted local admission returns typed RateLimited for `hf-metadata-local-admission` with a one-second retry hint. There is no automatic retry, sleep loop, detached HTTP task, persistent queue, global HF bucket admission or new service. - -Keys are lexical cache paths incorporating the exact source-URL hash. This is not physical filesystem identity: relative/absolute or symlink aliases need not coalesce, and separate processes are not coordinated by this registry. The existing physical store lifetime/custody owner remains responsible for its own exclusion; it is not replaced by cache locks. - -Canceling a waiter or an HTTP-body reader drops its request/admission future. Once an atomic cache write or invalidation is handed to the existing owned blocking-effect primitive, its owned admission guard moves into the actual closure. It remains held until that effect settles even if the awaiting caller is canceled. A newer refresh or cooldown cannot overtake that admitted effect and then be overwritten or removed by it. No interruption of native filesystem effects is claimed. - -## Authentication boundary - -Authenticated detail requests take a live-only path and never read or mutate the anonymous observation envelope. A queued anonymous lookup rechecks authentication before cache reuse. If authentication disappears after selecting the live bypass, that invocation remains live-only; it cannot fall into anonymous publication without admission. Actual request credentials are still observed through the existing snapshot request path. - -The privacy qualification is scoped to the new full-detail envelope. Existing search and repository-tree cache formats and credential policies are outside this slice. The tests do not claim that every legacy HF cache has been redesigned for private data. All test credentials are synthetic memory-only values scoped to owned HTTP fixtures; no token persistence or gated HF service is used. - -## Public API qualification - -The owned loopback suite calls the existing public `lookup_hf_metadata_for_file` API and public metadata Refetch. The local file is an actual 24-byte GGUF v3 header with empty metadata/tensor tables. It is a format fixture, not an inference-ready model. Fixture LFS identity/hash observations remain marked pending full verification, and `list_models` proves this read-only workflow publishes no library model. - -Coverage includes cold/warm/reopened full card reuse; stale conditional 304 refresh; explicit Refetch with a new body; upstream failure without stale success; persisted detail cooldown; two credential contexts and authenticated denial without anonymous envelope mutation; simultaneous anonymous selection; canceled HTTP reader and waiter; canceled blocking publication followed by newer public Refetch; queued authentication changes; authentication cleared during live bypass; multiple-candidate filename fallback and empty search. Cache-module tests separately bound registry keys/participants and retain prior cache protocol coverage. - -Request reduction is for selected full-detail hydration. Search can still run for each public lookup, and existing file-tree matching retains its own cache behavior. This does not claim a zero-network discovery call, RPC transport qualification, real HF validator availability or real inference. - -## Recorded qualification - -Qualification used locked offline dependencies with `ORT_SKIP_DOWNLOAD=1`, owned loopback sources and synthetic in-memory credentials. It did not require a real model download, gated HF access or a new RPC method. - -At the selected-hydration stage, all 11 focused public API tests and all 20 cache-module tests passed. The broader no-default-features plus `hf-client` library suite passed 1,978 tests with 11 ignored and one environment baseline failure; all 262 HF tests and six SQLite cache tests passed within that run. The failure, `api::models::tests::get_inference_settings_batch_reports_per_model_errors`, attempted to create the default user registry on a read-only filesystem. The earlier observation-cache binary reproduced the same error at `api/models.rs:782`, and its 18 cache tests passed. Strict all-target Clippy, formatting and whitespace checks passed. These results qualify selected detail hydration and its admission behavior, not live HF, RPC transport or inference. diff --git a/docs/plans/hf-model-detail-cache-2026-10-08.md b/docs/plans/hf-model-detail-cache-2026-10-08.md deleted file mode 100644 index be712a22b..000000000 --- a/docs/plans/hf-model-detail-cache-2026-10-08.md +++ /dev/null @@ -1,41 +0,0 @@ -# Hugging Face model-detail observation cache - -## Scope and caller contract - -This slice addresses an unfinished part of `docs/breif/hf-cache.md`: persistent full model-detail observations and conditional refresh. Existing SQLite search/repository records omit some wire detail and do not retain source URL, commit observation and HTTP validators together. The new module uses the existing HF file-cache directory, store lifetime and atomic JSON writer; it introduces no database, remote cache, credential requirement or download transport. - -`HuggingFaceClient::get_model_info_cached(repo_id)` is an explicit advisory discovery/detail API. Fresh anonymous observations can return without HTTP, including after reopening a client. Existing `get_model_info(repo_id)` always revalidates upstream, using persisted conditional validators when available. That preserves explicit public API/RPC metadata Refetch behavior. Integrators can opt ordinary detail consumers into `get_model_info_cached`; no existing search/catalog/UI consumer is silently converted to cache-first behavior in this slice. - -Both methods respect persisted admission cooldown before issuing HTTP; a still-fresh advisory hit may be returned without HTTP during cooldown. Authenticated calls bypass anonymous disk observations and retain the existing live snapshot request. Download snapshot retrieval and revision resolution remain separate live identity checks. A cached `sha` is an observation, never a newly authorized immutable download revision, package admission or inference compatibility claim. - -## Observation identity and persistence - -Each versioned JSON envelope contains the exact anonymous model API URL, original bounded JSON body, ETag/Last-Modified validators, validation timestamp, bounded freshness and optional cooldown deadline. The filename hashes the full URL, avoiding legacy slash/underscore aliases and separating repository case and source endpoints. Read admission checks the envelope version and exact URL, requested repository, optional commit syntax, validators and body bounds. Corrupt, oversized, wrong-source or future-version records are misses. Future validation timestamps do not produce fresh hits. - -The body is capped at 4 MiB; the envelope read is capped at that plus 64 KiB. Unix reads use nonblocking, no-follow opens and admit only regular files, so a FIFO or symlink cache entry cannot hold the worker waiting for a writer. Existing blocking-effect ownership and atomic JSON publication are reused. Cache read/write/invalidation failures do not turn a successful live response into a model-detail failure. No partial downloaded response is published. - -Freshness defaults to at most 24 hours. Bounded Cache-Control fields can shorten it; no-cache forces revalidation and private/no-store prevents persistence. All repeated Cache-Control and Vary fields are inspected; Authorization or wildcard Vary prevents storage, and malformed policy fields are conservative. Age reduces freshness; repeated or invalid Age forces revalidation. This is a narrow native-client observation policy, not a general HTTP proxy cache: Expires and configurable discovery TTL are not implemented. - -## Refresh and failure behavior - -A stale or explicitly refreshed observation sends If-None-Match, otherwise If-Modified-Since. A 200 response replaces the validated body/validators atomically. A 304 requires an actual conditional request and the matching stored representation at the same source URL. Contradictory ETags or a contradictory Last-Modified fallback cannot extend freshness or pair old bytes with a different validator. A 304 without new Cache-Control cannot relax the existing freshness policy. - -HTTP 401/403/404 invalidates the anonymous record. Other upstream failures retain the old observation without returning it as a successful fresh lookup. Redirected responses are not persisted; redirected 304 responses cannot refresh the original record. - -HTTP 429 returns typed RateLimited and persists a per-source/repository admission deadline. Retry-After accepts strict integer seconds or an HTTP date. Otherwise the documented HF RateLimit API bucket reset is used; missing or unusable reset information uses a five-minute cooldown. Valid reset values are capped at 24 hours to prevent arithmetic overflow and unbounded suppression. Calls needing revalidation, including explicit Refetch and reopened clients, return the remaining cooldown without sending HTTP. A still-fresh advisory observation remains usable without HTTP. There are no automatic retries or sleeping request tasks. - -Official protocol references: [HF rate-limit headers](https://huggingface.co/docs/hub/rate-limits) and [HTTP semantics for conditional requests, 304 and Retry-After](https://www.rfc-editor.org/rfc/rfc9110.html). Conditional reuse depends on the actual upstream supplying usable validators; local fixtures establish behavior, not a claim that live HF always sends these headers. - -## Boundaries and integration - -The initial observation-cache protocol did not serialize concurrent refreshes. The [selected metadata caller and admission extension](hf-metadata-caller-adoption-2026-10-08.md) adds bounded per-path serialization and a freshness recheck after admission. A cooldown prevents subsequent requests after publication, not requests already in flight; it remains repository-URL scoped rather than global HF API-bucket admission. - -Per-record resource bounds are independent of the SQLite cache's 4 GB LRU. The [aggregate detail-cache budget](hf-model-detail-cache-budget-2026-10-08.md) additionally bounds this JSON family to 256 final records and 64 MiB. The [explicit local discovery workflow](hf-local-detail-discovery-2026-10-08.md) and [cached search presentation](hf-cached-search-ui-2026-10-08.md) expose retained public observations without changing ordinary refresh errors into stale successes. Authenticated/private persistence, a shared online cache and global API-bucket admission remain outside this protocol. - -## Verification - -The deterministic owned loopback HTTP suite covers restart reuse with full card/license preservation, exact endpoint/repository isolation, ETag and Last-Modified refresh, no-cache across 304, explicit existing Refetch getter behavior, auth bypass, live snapshot/revision isolation, rate-limit reopen/expiry, unavailable storage, corrupt/future/wrong-source records, malformed identity/commit/oversized bodies, repeated policy fields, contradictory 304 validators, huge reset values and nonblocking FIFO admission. It uses a synthetic local bearer value only for auth-isolation assertions; it does not access gated HF repositories or require a token. - -Recorded qualification used locked offline official dependencies and `ORT_SKIP_DOWNLOAD=1`; no live HF scraping, model download or native ONNX execution was required. - -At the observation-cache stage, 18 focused cache tests passed. The broader no-default-features plus `hf-client` library run passed 1,965 tests with 11 ignored and one environment baseline failure: `api::models::tests::get_inference_settings_batch_reports_per_model_errors`, creating the default user registry on a read-only filesystem. The earlier baseline binary reproduced the same error at `api/models.rs:782`; no registry fixture was changed to mask it. All 260 HF tests and six SQLite cache tests passed in that run; one additional HF resource measurement remained ignored. Baseline filtered HF tests passed 242 with one ignored, and baseline SQLite cache tests passed six. Strict all-target Clippy, formatting and whitespace checks passed. These counts describe that protocol stage rather than a new full-suite run of subsequent extensions. diff --git a/docs/plans/hf-model-detail-cache-budget-2026-10-08.md b/docs/plans/hf-model-detail-cache-budget-2026-10-08.md deleted file mode 100644 index 221b68656..000000000 --- a/docs/plans/hf-model-detail-cache-budget-2026-10-08.md +++ /dev/null @@ -1,38 +0,0 @@ -# Bound anonymous HF model-detail cache storage - -## Scope - -The [HF cache brief](../breif/hf-cache.md) calls for local size limits and eviction. The [observation protocol](hf-model-detail-cache-2026-10-08.md) supplies full-detail JSON records; this extension adds aggregate final-file accounting without changing acquisition identity or model publication. - -The shared acquired-model bridge supports bounded GGUF, safetensors/Transformers/Diffusers and static ONNX representations. Generic transfer success remains separate from package qualification and backend compatibility. This cache budget does not establish provider interoperability or inference. - -## Resulting behavior - -Anonymous full-detail observation writes are serialized per exact lexical cache-directory path and admitted against **256 complete records and 64 MiB of logical final-file bytes**. Before publishing a new/replacement record, the owner selects enough eligible victims to fit both limits. Eligible observations are ordered by validation timestamp, then filename for ties. This is oldest-observation eviction, not access-frequency LRU; fresh cache reads remain read-only and do not update disk timestamps. - -Active admission cooldowns are protected. Unknown, corrupt, future-version, wrong-identity, oversized, invalid-validator, and future-timestamp records are counted but never evicted or overwritten by this policy. A valid refresh can replace its own eligible prior observation; accounting subtracts the old bytes once. If protected records leave insufficient capacity, no victims are removed and persistence is refused. Successful live lookup still returns the live metadata. Authenticated calls remain live-only and do not consume or mutate anonymous observation storage. - -The native `HuggingFaceClient::model_detail_cache_usage()` returns `(record_count, logical_bytes)` without HTTP, credentials, source URLs, repository names or response bodies. Associated `MODEL_DETAIL_CACHE_RECORD_LIMIT` and `MODEL_DETAIL_CACHE_BYTE_LIMIT` constants expose the policy. Usage includes exact-family regular filenames even when their content cannot be admitted. The function does not claim SQLite/search/tree cache statistics or total filesystem allocated usage. No desktop/RPC method is added. - -## Ownership and bounded work - -Only names matching `hf_<64 lowercase hex characters>_metadata_v1.json` are accounted or considered for eviction. Other cache families, model outputs, downloads/acquisition documents, arbitrary filenames, symlinks, FIFOs and directories receive no cleanup authority. A matching nonregular member causes inventory/write refusal. Scans inspect at most 4096 directory entries; classification admits at most 64 MiB of reads plus one overflow-probe byte through non-following regular-file handles, with the existing per-record ceiling. Incomplete scans/classification refuse new persistence before eviction, rather than calling a partial ordering globally oldest-first. - -Cache admission and eviction reuse the same structural observation predicate as ordinary detail reads. Eviction additionally requires a valid source/repository URL identity and a nonfuture observation time. Budget inventory/classification reads, eviction, invalidation and publication use held directory capabilities. The preserved ordinary lookup read uses its existing non-following ambient leaf open. The existing `AtomicJsonTarget` publishes the JSON through the held cache directory; no new publisher is introduced. Invalidation inspects only its exact known target, so an incomplete directory inventory cannot suppress no-store/denial cleanup of that target. - -Existing per-URL admission precedes the directory admission. Both owned guards move into the existing `StoreLifetime` blocking effect. Canceling the outer lookup cannot release directory admission while its actual cache mutation is still running. Inventory holds only directory admission and cannot reverse the lock order. Registries retain weak guards, with the existing bounded active-path/participant policy, rather than retaining clients or payloads. - -The budget is a cooperative current-process guarantee for complete final files at exact lexical directory identity. Relative/absolute/symlink aliases, old clients and separate processes are not coordinated by these locks. Existing store-lifetime ownership remains in force. Fully classified known legacy entries can be evicted during an ordinary write to reach the limits; there is no startup clearing/migration. Legacy directories exceeding scan/classification capacity freeze new persistence. Temporary atomic staging overhead, filesystem allocation overhead, foreign families and externally written bytes are outside the final-file accounting. Victim removal may complete before an eventual failed/uncertain new publication; cache preservation is optional and live results remain usable. This is not a multi-file atomic transaction or model-publication protocol. - -## Recorded qualification - -Focused owned fixtures exercise the public live lookup at default record pressure, actual disk eviction and reopened cache reuse, byte pressure and exact replacement accounting, protected/expired cooldowns, fully protected capacity, inadmissible target preservation, corrupt/future/wrong-source records, legacy classification byte capacity, directory scan capacity, nonregular member refusal, concurrent misses, and canceled outer lookup retaining directory admission until its real effect settles. Existing cache protocol and public selected-hydration tests must remain passing. All Cargo commands use locked offline official dependencies with `ORT_SKIP_DOWNLOAD=1`. - -At the aggregate-budget stage, 32 detail-cache tests, including 12 budget cases, and 11 public selected-hydration tests passed, as did strict all-target Clippy, formatting and whitespace checks. The full `hf-client` library run passed 1,990 tests with 11 ignored and one environment baseline failure: `api::models::tests::get_inference_settings_batch_reports_per_model_errors`, creating the default user registry on a read-only filesystem. The failure also reproduced in an earlier accepted observation-cache binary; the failing API source blob matched the immediate pre-budget sources. This is not an all-green full-suite claim or an immediate-predecessor binary comparison. No baseline fixture was changed to mask the failure. - -## Separate qualification requirements - -1. Cold S3 resumption requires fresh reservation/recovery authority; persisted inspection alone does not authorize reopening. -2. Catalog-wide discovery and global HF API-bucket admission require separate public freshness and provenance policies. -3. Exact wheel closure and local-only package consumption require their own acquisition/runtime package qualification. -4. Actual-provider S3 interoperability and supported-platform deployment, migration and resource behavior require real service/platform evidence; synthetic fixtures cannot establish them. diff --git a/docs/plans/http-acquisition-integration-baseline.md b/docs/plans/http-acquisition-integration-baseline.md deleted file mode 100644 index 576c9657e..000000000 --- a/docs/plans/http-acquisition-integration-baseline.md +++ /dev/null @@ -1,322 +0,0 @@ -# Proposed HTTP acquisition integration baseline - -Status: approved implementation plan. The main prerequisite completed green in -Build 37127500248 on 2026-10-03. [Build 37141872406](https://github.com/MrScripty/Pumas-Library/actions/runs/37141872406) passed all seven ordinary jobs on `0dd38c707125facfdaae29c82704213e85ceb155` (tree `7611df7a568d56807589bb2dca2bfbb03e484dd0`): workflow/release contracts, frontend/desktop, strict Rust quality, headless without inference, and native Linux/macOS/Windows. This is exact-head supporting AC15 evidence for the checks that ran. Release archives and native model E2E remain unqualified; AQ-HTTP, external review disposition and maintainer integration remain pending. Review repairs after this head require fresh exact-head qualification. -No live-store migration or deployment cutover is authorized by this baseline. - -## Pinned entry state and scope - -Start from B1 merge `58b74e83fdf34131290933f576c7e338bde4a49d`, with tested tree -`57b285ad99994de9e2cc0b83cc62916a3c184ae6`. Its candidate Build 37125867468 passed -all ordinary/native gates and CodeRabbit accepted/resolved all seven findings. -The merge's separate post-merge checks must finish before implementation. - -Recheck the current heads and applicable repository/Coding-Standards instructions -at implementation admission. Preserve, without rebase or history replacement: - -1. Qualified current main and B1. -2. [PR7](https://github.com/MrScripty/Pumas-Library/pull/7), - `3b2a279b4d35bd19e5cc1727cc905c7ee7477fa6`, including its 97 original commits. -3. [PR10](https://github.com/MrScripty/Pumas-Library/pull/10), - `57ed33db8c2995e4633f559d1a8d31d591b0dcca`, based on PR7. -4. Both PR10-based siblings, neither of which subsumes the other: - [PR15](https://github.com/MrScripty/Pumas-Library/pull/15), - `dd04fdcf48132ef7237e61feba5e5c1d3629d49a`, and - [PR16](https://github.com/MrScripty/Pumas-Library/pull/16), - `f344e7fed8a8cbc6f4c4831ec7c78aa4c44c2d64`. -5. Explicit integration corrections and the cross-owner regressions below. - -Use a separate focused integration branch/worktree. The acceptance claim is a -fixture-qualified HTTP acquisition baseline, not deployment migration or release -qualification. S3 follows this baseline. Private ASR artifact authority, public -speech, generalized package/runtime installation, Xet/CAS and fleet management -are not prerequisites. - -## Conflict-resolution plan - -Core paths below are under `rust/crates/pumas-core/src/` unless stated otherwise. -There are four direct B1/PR7 overlaps, eleven overlaps including other main -changes, and two additional workflow overlaps in the repair history. - -| File | Required resolution and owner | -| --- | --- | -| `model_library/download_recovery.rs` | One held filesystem authority. Retain B1's exclusive private staging, complete descendant binding, document bounds, mode settlement, no-replace publication, Windows release/rebind and retained uncertainty. Add PR7's acquisition workspace bridge over the same verified identity. Both typed and raw metadata writers obey bounds. Never substitute generic/ambient recursive cleanup. | -| `model_library/importer.rs` | Keep B1's ordinary copied producer under RuntimeTasks. Retain PR7's separate managed-HF capabilities, selected-file/revision provenance, completion/cancellation arbitration, guarded effects and HF completion receipts. Preserve in-place/idempotent Pending refusal. Do not reacquire a root grant already held by the active owner. Keep B1 fields/test hooks and expanded acquisition-custody checks. | -| `model_library/importer/recovery.rs` | Keep canonical read-only shard observation, staging/Pending exclusions and PR7's stale-orphan recheck at the actual mutation boundary. Discovery grants no import, cleanup or inferred-download authority. | -| `model_library/library.rs` | Combine guarded I/O with canonical copied-publication readiness. PR7's direct `guard.read_metadata` return must not bypass B1's readiness fence. Reads stay bounded/no-follow and held; no ambient fallback. Preserve immutable identity, raw projections, conditional Pending/Ready index commits and HF proof issuance/settlement as a separate protocol. | -| `api/builder.rs` | Main owns primary-instance/startup composition. Keep conditional instance-claim cleanup and read-only startup shards. Install exactly one shared AcquisitionService on HF before restoration and retain it in PrimaryState. Do not restore inferred-shard automatic downloads. | -| `model_library/mod.rs` | Retain discovery exports and remove only the superseded partial_download module. Resolve references rather than restoring an obsolete owner to silence errors. | -| `rust/crates/pumas-rpc/src/main.rs` | Keep main's signal/server lifecycle and add shared acquisition injection into LlamaCpp VersionManager. Inference-disabled RPC must not gain app-manager dependencies. | -| `rust/crates/pumas-rpc/src/server.rs` | Keep accepted HTTP connection/handler ownership, bounded drainage, repeated receipts and retained failures. Drain HTTP/domain owners concurrently. Extend native cleanup to shutdown_installations, then close/drain shared acquisition after consumers, including failure paths. Preserve request admission and private-ASR restrictions. | -| `rust/Cargo.lock` | Retain main's direct hyper/hyper-util ownership and PR7's unicode-normalization/tinyvec entries; no unrelated upgrades. | -| `docs/release-attribution/0.7.0/inventory.json` | Reconcile final inputs using the existing attribution process; retain both dependency additions and newer ownership inputs. Do not weaken notice/license checks or acquire new archives without separate authority. | -| `frontend/src/components/TorchInstallPreview.test.tsx` | Retain main's readyInstallButton, resetAllMocks and delayed-choice regression, which subsume PR7's narrower readiness wait. | -| `.github/workflows/build.yml` | Union PR10 all-base PR coverage, current main/B1 gates and PR16 native-cleanup/workspace gates. Preserve tag/manual expensive release/E2E restrictions and separate Cargo steps on Windows. | -| `scripts/release/check-ci-release-gating.test.mjs` | Retain all-base assertions, native-cleanup requirements and current release/native/feature contracts. | - -Textually clean files still need semantic review: mutation_authority, B1 -staging/publication/copy planning and index observers, acquisition/store/service/ -task_custody, HF download_store/lifecycle, capability_fs and native installer -cleanup. PR15's hook files do not overlap newer main/B1, but retain their full -command-ownership behavior and tests. - -### Three distinct persisted contracts - -- Acquisition schema7: Transferring -> FilesReady -> Using -> Adopted/Withdrawn; - owns input bytes, demand/use lease, consumer receipt and queue settlement. -- B1 copied publication: per-model `.pumas_import_publication.json` plus metadata - identity; owns destination Pending/Confirmed evidence, mode settlement and - conditional Ready index admission. -- Native installation attempt v2: physical workspace binding and cleanup-pending - diagnostics; installed output success is separate from reclamation. - -Receipts are not interchangeable. A file set is not an imported model; metadata -is not an acknowledged Ready index; installed output is not completed cleanup. -Keep B1's sequence: private stage -> no-replace rename -> Pending index -> exact -payload verification -> mode settlement -> durable Confirmed -> Ready metadata --> conditional Ready index. HF adoption releases its acquisition lease only after -its own importer completion/output proof settles. - -## Five proposed cross-owner regressions - -Use an `acquisition_integration_` selector within the existing crate-private test -owners; do not widen production APIs just to expose test hooks. Use real composed -producer paths with synthetic bytes/temporary roots/loopback servers. - -1. `acquisition_integration_copied_readiness_survives_guarded_observation` - - Positive control: genuine confirmed copy remains Ready through guarded I/O. - - Pending, unreadable/mismatched receipt, erased identity, oversized canonical - evidence and replacement paths remain unavailable. - - Overlays, index/cache observers and load-target resolution cannot manufacture - Ready or follow a replacement. -2. `acquisition_integration_copy_and_hf_exclude_each_other` - - Successful copied and managed-HF imports on fresh targets. - - Hold each at a real effect boundary and attempt its competitor; include - hidden/pending acquisition admission as well as active work. - - Refusal precedes stage/metadata/network effects, preserves the incumbent and - does not poison expected shutdown. Fresh permitted work succeeds after true - settlement. Detect accidental nested acquisition of an already-held grant. -3. `acquisition_integration_completion_receipts_are_not_interchangeable` - - Real producer outputs, plus wrong/missing/copied-versus-HF receipt evidence. - - Neither receipt settles the other producer or clears retained custody. - - Warm/cold observers retain ambiguity without source replay or reimport; - valid positive control for each protocol. -4. `acquisition_integration_startup_preserves_legacy_and_pending_custody` - - Schema4/5/6 temporary fixtures refuse ordinary acquisition startup/mutation, - preserving download-store bytes and making no source requests. - - Schema7 retained acquisition, copied Pending and incomplete shard evidence - coexist without migration, deletion, promotion or inferred download. - - Read-only shard observation remains available without admitting work. -5. `acquisition_integration_shutdown_drains_copy_hf_and_native_consumers` - - Parameterize the active library owner as copy or HF; do not fabricate two - simultaneous owners of one exclusive root. - - Include an admitted HTTP handler and, for default RPC, native installation - on its own workspace. Cancel caller and one shutdown waiter while held. - - Consumers settle before shared acquisition closure, without early success, - deadlock or loss of repeatable failure receipts. Run an inference-disabled - variant without native managers. - -## Exact retained selectors - -All commands are proposed hosted qualification, not locally executed evidence. -From repository root, a core selector means: - -`cargo test --locked --manifest-path rust/Cargo.toml -p pumas-library --lib SELECTOR` - -An RPC selector means: - -`cargo test --locked --manifest-path rust/Cargo.toml -p pumas-rpc SELECTOR` - -A native-installer selector means: - -`cargo test --locked --manifest-path rust/Cargo.toml -p pumas-app-manager SELECTOR` - -Check targeted filters with `-- --list`; require real matching cases on each -applicable platform. Zero tests or ignored-only runs are not qualification. - -### Core acquisition/custody - -- acquisition::manifest::tests -- acquisition::http::tests -- acquisition::service::tests -- acquisition::store::tests -- acquisition::task_custody::tests -- acquisition::workspace::tests -- model_library::download_store::tests -- model_library::hf::acquisition_source::tests -- model_library::hf::download::tests -- model_library::mutation_authority::tests - -Retain explicit default/headless admission sentinels: - -- local_preflight_refuses_missing_configuration_without_contacting_source -- unconfigured_download_refuses_before_remote_or_destination_effects -- durable_intent_claim_refuses_admission_without_poisoning_shutdown -- ticket_recovery_refuses_busy_before_index_or_download_mutation -- admission_rechecks_hidden_predecessors_after_its_store_transaction - -Expected local refusal must preserve state, contact no source and settle cleanly. -Do not suppress aggregate shutdown failures to make the historical ticket case -pass. - -### Core publication/recovery - -- model_library::importer::tests -- copied_import -- model_library::download_recovery::tests -- model_library::library::tests -- custody_guard_ -- canonical_acquisition_custody_blocks_model_mutation_until_withdrawal -- shard_discovery -- shard_startup_tests -- model_library::sharding::tests -- test_recover_incomplete_shards_async_detects_missing_shard_set -- test_find_interrupted_downloads_async_detects_partial_download_dir - -Retain the specific composed-owner sentinels: - -- real_import_precedes_completion_and_holds_destination_successor -- custody_guard_rechecks_a_real_stale_orphan_scan_after_admission -- builder_requires_download_restore_grant_but_no_client_reads_do_not -- acquisition_integration_startup_retains_separate_pending_custody -- startup_guard_cannot_delete_a_successor_or_promoted_instance -- copied_import_dropped_waiter_and_shutdown_wait_for_held_producer -- copied_import_collision_refusals_do_not_poison_shutdown -- copied_import_pending_and_confirmed_failures_do_not_become_ready_at_startup -- copied_import_public_metadata_edits_and_reinspection_cannot_forge_confirmation -- copied_import_deep_rebuild_and_in_place_retry_preserve_pending_fence -- copied_import_ready_observation_requires_readable_matching_bounded_receipt -- copied_import_ordinary_metadata_edit_preserves_receipt_and_cold_readiness -- copied_import_hashes_destination_once_after_every_callback -- copied_import_oversized_metadata_refuses_before_publication -- copied_import_nested_native_publication_rebinds_exact_payload -- receipt_reopen_settles_after_publication_failure_without_network_or_reimport -- receiptless_using_cold_reopen_retains_custody_without_network_or_reimport -- restored_files_ready_settlement_is_atomic_and_receipt_reopen_does_not_reimport -- cancellation_and_shutdown_drain_real_import_before_settlement - -Retain these integration binaries as separate commands: - -- cargo test --locked --manifest-path rust/Cargo.toml -p pumas-library --test intent_ipc_tests -- cargo test --locked --manifest-path rust/Cargo.toml -p pumas-library --test intent_api_tests -- cargo test --locked --manifest-path rust/Cargo.toml -p pumas-library --test package_facts_resolution - -### Native installation and RPC - -Native-installer selectors: - -- native_ -- unconfigured_direct_llama_cpp_installer_rejects_before_native_mutation -- public_direct_installer_configures_shared_llama_cpp_acquisition - -The native_ cases retain attempt-v2 binding, present-legacy retention, failed-clear -custody, cold reopening, process interruption, progress/caller-loss ownership and -repeatable installation shutdown. Retain acquisition::workspace::tests too. - -RPC selectors: - -- http_transport::tests -- server::tests - -Separate RPC integration commands: - -- cargo test --locked --manifest-path rust/Cargo.toml -p pumas-rpc --test integration_tests http_admission_rejects_untrusted_sources_before_rpc_dispatch -- cargo test --locked --manifest-path rust/Cargo.toml -p pumas-rpc --test integration_tests rpc_shutdown_exits_after_delivering_acknowledgement_and_ending_sse -- Linux/macOS only: cargo test --locked --manifest-path rust/Cargo.toml -p pumas-rpc --test integration_tests unix_termination_signals_complete_the_owned_shutdown - -The server suite also retains paused/status/cancel/resume HTTP round trips and -real_server_shutdown_closes_native_installation_admission. - -### Frontend and contracts - -`pnpm --dir frontend test:run src/hooks/useModelDownloads.test.ts src/components/TorchInstallPreview.test.tsx` - -Retain PR15's pause/cancel/resume matrix: both failure forms, newer active/paused/ -terminal snapshots, overlapping command pairs and both settlement orders. -Run the full frontend and desktop-contract gates afterward. - -## Feature/native-host matrix - -Ubuntu ordinary qualification: - -- ./scripts/rust/check.sh -- cargo test --locked --manifest-path rust/Cargo.toml -p pumas-library --no-default-features -- cargo test --locked --manifest-path rust/Cargo.toml -p pumas-library --no-default-features --features hf-client -- cargo test --locked --manifest-path rust/Cargo.toml -p pumas-rpc --no-default-features -- python3 scripts/release/check-dependency-features.py - -The existing Rust script retains fmt, all-target/all-feature check/Clippy, -workspace default tests, doctests and no-default compilation. Keep its existing -BEAM-tooling exclusion for pumas_rustler. Package-separated no-default tests are -required; workspace feature unification is not inference-disabled evidence. - -Native ubuntu-24.04, macos-15 and windows-2025: - -- Preserve every current main/B1 native gate. -- Retain/add acquisition::workspace::tests and native_ cleanup qualification. -- Run the five acquisition_integration_ cases in their owning core/RPC packages. -- Retain copied_import, held destination/library metadata, shard/startup, intent - IPC and HTTP transport suites. -- Windows: nested copy publication, locked stages and reserved-handle/reparse cases. -- Unix: signals and managed process groups. Linux: incomplete process observation, - router and silent-SSE regressions. -- Core acquisition_integration_ with --no-default-features --features hf-client - on all three hosts. -- RPC acquisition_integration_ and http_transport::tests with --no-default-features - on all three hosts. Full no-default package suites remain Ubuntu gates. - -Keep dependency ownership, version alignment, attribution, all scripts/release -Node tests, frontend lint/types/tests, Electron validation/tests, launcher tests, -desktop-contract generator/conformance and existing Python/Torch fixture QA. - -## Schema and retained-state qualification - -Main/B1 download schema5 and B1 copied-publication identity are independent. -PR7 acquisition mutations require schema7. Schema4/5 model projections retain -only their explicitly supported read-only inspection; schema6 rejects ordinary -access. Normal opening must not silently migrate. - -Retain core selectors: - -- runtime_refuses_old_formats_and_unadmitted_current_rows_without_mutation -- restore_rejects_old_tracking_formats_without_migrating_or_touching_files -- schema_six_rejects_normal_read_without_rewrite -- malformed_restore_inventory_is_an_error_and_preserves_store_bytes -- duplicate_members_fail_model_projection_and_receipt_read_without_rewrite -- duplicate_top_level_members_fail_closed_without_rewrite -- duplicate_consumer_receipt_keys_fail_closed_without_publication -- managed_hf_receipt_settlement_is_one_restart_safe_publication -- receipt_partition_rejects_the_same_acquisition_receipt_under_two_keys -- receipt_stays_with_using_or_adopted_record_in_one_owner_partition - -Existing offline conversion unit tests remain isolated-fixture tests only: - -- offline_v4_v5_migration_preserves_all_custody_partitions_without_authorizing_pending -- schema_six_migration_preserves_acquisition_and_model_partition_without_receipts -- duplicate_members_fail_offline_migration_without_rewrite -- malformed_schema_v4_upgrade_preserves_original_document -- schema_v4_upgrade_prepublication_failure_preserves_original_document - -Do not silently upgrade fixtures to hide startup failures. Native attempt v2 -remains separate: present legacy staging is retained without fabricated physical -binding; absent legacy cleanup is harmless; replacements are never adopted. - -## Exit and deferred qualification - -Exit requires exact integrated commit/tree, independently reviewed semantic joins, -all required ordinary/native checks, real matching targeted tests, five passing -cross-owner cases, applicable external review dispositions, unchanged authority -and readiness guarantees, and strict attribution/feature/release gating. - -Ordinary CI does not establish tag-only archives/release binaries/Electron -packages, packaged startup, manually/tag-gated Torch RPC E2E installation, real -models/GPU inference, public ASR, live-store migration, old-writer exclusion, -rollback, networked deployment or a real cluster. No new archive/model acquisition, -credentials, public listener or migration is authorized by this plan. - -After this baseline, S3 adds source resolution, addressing/pagination, immutable -object/version or digest evidence, checksum semantics and credential-safe scoped -HTTP access under the same retry, custody, verification and publication owners. -Existing schema5 deployments are not directly upgradeable merely because fresh -schema7 fixtures pass. Any deployment cutover and networked request/stop/drain -qualification remain separate bounded milestones. diff --git a/docs/plans/local-asr-operation-contract.md b/docs/plans/local-asr-operation-contract.md deleted file mode 100644 index e39d0af75..000000000 --- a/docs/plans/local-asr-operation-contract.md +++ /dev/null @@ -1,322 +0,0 @@ -# Local ASR operation contract proposal - -Status: private Python operation ownership is implemented and synthetically tested; the public producer contract below remains proposed and is not advertised. This follows the Cohere loader milestone in `local-cohere-transcription.md`. No consumer should call these proposed methods until the producer implementation and generated contracts exist. - -## Existing boundaries to reuse - -- `PumasModelRef` and owner-fresh selected-artifact resolution identify installed library assets. A native `cohere_asr` configuration is necessary but is not model identity attestation. -- `ServingLoadOperation` and `RuntimeProfileProcessOwner` retain managed profile/load generation ownership. Caller-provided paths, ports and unowned sidecars are not accepted. -- `TorchClient` protocol 3 remains compatible for existing image/text consumers. Speech is an additive, explicitly versioned capability, not a global runtime upgrade or a claim that every Torch model generates images. -- `ModelManager.speech_lease` and the synchronous loader adapter retain the loaded model/device through native work. An executor future being cancelled is not a worker-exit receipt. -- The public RPC shutdown supervisor and existing managed process owner remain the owners of listener and process cessation. Do not add a detached shutdown task or a second competing process supervisor. - -## Proposed public methods, contract version 1 - -All requests reject unknown fields. Existing local Host/Origin admission and request-body limits apply; speech has an additional explicit 1.5 MiB request envelope bound before JSON/base64 allocation. - -1. `get_transcription_capability`: accepts a `model_ref` and `runtime_profile_id`. Returns `contract_version`, the canonical `model_ref`, a model-content binding, runtime recipe identity, an opaque `runtime_instance_id`, state/diagnostics, and audio/language/output limits. Availability requires an installed validated model, a separately qualified native ASR runtime, an exact owned live profile/listener, the speech protocol handshake, and one unambiguous READY speech slot. Discovery performs no acquisition or implicit model load. Unsupported/missing/busy are distinct states; process/provider type alone is insufficient evidence. -2. `start_transcription`: accepts the discovered model/runtime binding, a caller-generated `request_id` UUID, explicit language, and audio `{encoding: "pcm_s16le", sample_rate_hz: 16000, channels: 1, sample_count, data_base64}`. Sample count is 1 through 480,000; decoded bytes must be exactly twice that count, at most 960,000 bytes. Admission returns an `operation_ref` bound to profile/runtime instance/operation identity and a status snapshot. It acknowledges admission, not completion. -3. `get_transcription_operation`: accepts that exact `operation_ref`. Returns the canonical model/runtime identities, status, cancellation acknowledgement, cleanup status, optional bounded text, or a typed diagnostic. An unknown/expired operation or changed runtime instance never means success or authorizes replay. -4. `cancel_transcription`: accepts the exact `operation_ref` and requests cooperative cancellation. Repeated calls are idempotent for that operation. A response distinguishes cancellation requested from worker cessation; it cannot release model/device custody merely because the request was delivered. - -States are `running`, `cancellation_requested`, `completed`, `cancelled`, `failed`, and `cleanup_unconfirmed`. Only confirmed worker completion/cessation allows a terminal reusable slot. `cleanup_unconfirmed` is observable but retains active custody and refuses new work on that device until the existing managed process owner proves the affected runtime has stopped. Preserve both operation and cleanup diagnostics; never mask the former with the latter. - -Successful text is at most 16,000 UTF-8 bytes, accompanied by model and operation identity. Oversized/invalid output is rejected rather than truncated. Empty text is valid. The game must present text for user review and explicit submission; model output is never an instruction to execute a command. - -## Private provider extension - -Proposed loopback private routes under `/api/speech`: `capability`, `operations` (admit), `operations/{id}` (status), and `operations/{id}/cancel`. Each response includes `speech_protocol: 1` and the provider's startup-random runtime instance ID. The capability is named `local_transcription_v1`; the handshake may advertise protocol support without claiming an installed/loaded model is available. Older Torch protocol-3 images continue to serve their existing methods and fail speech capability checks explicitly. - -The Python application owns a bounded operation registry, cancellation event and independently retained executor worker. No HTTP handler owns the only reference to admitted work. One active speech operation per runtime is the initial admission policy, with no hidden queue; the shared device lease still excludes image/load/unload conflicts. A disconnected polling or start client does not release or replay native work. - -Admission binds a request UUID to a digest of all request fields and decoded audio. While its receipt is retained, repeating the same identity returns the same operation; changed payload under that identity refuses. Retention is an explicit memory policy: at most 64 settled receipts, up to 10 minutes, exposed in capability/status. Active or cleanup-unconfirmed owners are never evicted. Expired/unknown receipts are reported as unknown; there is no exactly-once or replay guarantee across expiry/runtime restart. Consumers must not automatically retry an ambiguous admission as new work. - -Audio buffers are released only after confirmed synchronous work and required device synchronization. Do not persist audio/transcripts or log their contents by default. Buffers retained by `SpeechCleanupUnconfirmed` remain fenced inside the lease until process cessation; no universal secure-memory-erasure claim is made. - -## Shutdown and resource policy - -Closing admission requests cancellation of every admitted speech operation and retains every worker/lease. The Rust owner must coordinate this private drain with its existing exact profile generation before managed process teardown. Transport timeout/disconnect is unknown provider outcome, not permission to forget it. If a separately explicit shutdown policy escalates to process termination, the operation reports forced/incomplete cleanup and the existing process owner must still prove descendant cessation. No normal transcription duration timeout is introduced by this design; 30 seconds bounds input audio, not compute time. - -The implementation review must settle how the existing process-owner shutdown phases compose with this cancellation drain before public routes are enabled. In particular, Python lifespan cleanup cannot release an unconfirmed CUDA lease, and a Rust waiter cannot deadlock teardown by awaiting a process that it alone must stop. - -## Model loading and runtime prerequisites - -An existing READY slot alone is not enough unless Pumas bound its selected artifact/content and qualified recipe at managed load admission. Reuse the canonical serving owner; extend Torch serving deliberately for Cohere rather than bypassing image-only allowlists with an arbitrary model path. Keep source/model protection through loading and validate binding freshness before publication. If the current load-target API does not supply the needed custody, add a narrow owned lease rather than treating its display path as authority. - -The current image/text recipe pins Transformers 4.57.6. Native Cohere requires its own qualified exact lock and recipe for Transformers >=5.4, with CPU/CUDA-only initial support. Recipe/probe/handshake coverage must establish native class availability, local-only loading, safetensors-only model weights and remote-code refusal. No capability may become available from changing a version string or mocked handshake. - -## Reviewable milestones - -A. Implement the private Python operation owner and synthetic lifecycle fixtures on the loader branch, without public capability advertisement or runtime lock changes. - -B. Add typed Rust client/DTO/RPC ownership and capability projection, including shutdown composition, model binding and generated consumer-contract tests. Keep unsupported states truthful until a qualified runtime and model exist. - -C. Qualify a separate managed ASR runtime, then acquire the gated model only after approval. Exercise approved local synthetic speech through the actual Pumas producer and the game adapter. Native packaged execution, microphone consent/capture and speech quality require explicit evidence. - -Required regressions include strict base64/sample/language bounds, busy admission, repeated/conflicting request IDs, lost acknowledgement without replay, status expiry/runtime replacement, cancellation before/after generation, repeated cancellation, late output discard, device synchronization failure with retained lease, shutdown during preprocessing/generation, and forced/unconfirmed child cleanup. A fixture or unavailable UI does not complete the requested voice feature. - - -### Private ownership checkpoint, 2026-10-03 - -Milestone A adds only `torch-server/speech_operations.py` and its synthetic tests. -The owner is bound to one event loop and one startup-random instance identity; -its synchronous admission turn validates, deduplicates and reserves without an -await point. Foreign-loop calls are rejected. The private raw-body boundary -rejects envelopes over 1.5 MiB before JSON/base64 decoding, then validates exact -fields, canonical request UUIDs/base64, explicit supported language and mono -PCM16LE sample metadata. A future transport must also enforce the cap while -reading its stream, before collecting the body. - -Each admitted operation independently retains its native thread and -`ModelManager.speech_lease`. Worker completion is checked against actual thread -exit; neither caller cancellation nor a cancelled asyncio waiter is a cessation -receipt. Cooperative/repeated cancellation discards late text. Only confirmed -cleanup releases the slot and PCM reference. Settled receipts contain bounded -value diagnostics rather than exception objects/tracebacks, and are expired by -a timer as well as lookups; the default bounds remain 64 receipts/600 seconds. -Expiry/restart has no exactly-once or safe automatic replay guarantee. - -Unconfirmed device cleanup preserves both diagnostics, the exception-owned -conversion buffer, original PCM and the live device lease in a retained, -cancellation-resistant quarantine task. It is never included in settled-cache -retention or evicted. There is no process-cessation acknowledgement/release API. -`close_admission` and bounded `drain` report incomplete custody without waiting -indefinitely on quarantine. A synthetic child-process regression checks that -ordinary `asyncio.run` shutdown cancellation does not reach async-generator -finalization and release the real lease; its test-owned external supervisor -terminates the fixture and observes child exit. - -This deliberately does not implement the production process boundary. Milestone -B must coordinate bounded drain with the existing managed process owner before -listener/lifespan teardown. Forced loop closure or explicit async-generator -finalization while custody is incomplete is prohibited. An unconfirmed runtime -requires external process termination; awaiting its orderly asyncio shutdown -would hang. No runtime/process cessation claim follows from the private drain. -Model/content/recipe binding, protocol handshake, routes, Rust DTO/RPC ownership -and capability projection remain milestone B gates; the internal model-name -selector alone is not identity attestation. Qualified runtime/model execution -and speech quality remain milestone C gates. - -Verification in the existing environment: - -- 31 operation tests passed, including default-adapter shutdown during synthetic - preprocessing/generation, concurrent duplicate/conflicting IDs, strict decode - limits, cancellation/lost acknowledgements, late-output discard, quarantine, - audio/traceback release, cache bounds/expiry, stale identities and bounded drain. -- Existing Cohere adapter/lease tests: 15 passed. Model manager: 2 passed. - Model load lifecycle: 7 passed. -- Whole Torch Ruff 0.15.2 checks and formatting passed (35 Python files). -- The broad Torch suite ran 166 tests with 7 errors, all in existing FastAPI - route enumeration (`_IncludedRouter.path`), matching the inherited 7-error - environment mismatch recorded in the loader checkpoint. This is not a - full-suite pass; no existing route test was changed. -- No route mounting, capability advertisement, Rust changes, dependency/lock - changes, model acquisition, real model inference or speech-quality claim. - - -#### Exceptional startup and data-free diagnostics review - -An exception from `Thread.start` is now an unconfirmed native-startup outcome, -not evidence that no worker exists. Such operations retain their thread, audio, -lease and a cancellation-resistant quarantine owner. Even an apparently -non-started exceptional startup requires the external managed runtime to be -stopped/recreated: an ordinary status/identity probe cannot prove non-start. -A late successful worker result does not convert startup quarantine to success -or release custody. Later inference/device-cleanup diagnostics and retained -conversion buffers remain separate from the original startup diagnostic. - -Diagnostic receipts now use only stable codes, allowlisted exception categories -and fixed code-owned messages. They never call backend exception `str`/`repr`, -copy exception arguments, or expose custom exception class names that could -contain audio/transcript data. Original operation, startup and cleanup failures -remain distinguishable without copying backend content. - -Regressions were observed failing before the correction for exceptional startup -and an exception containing submitted PCM. Added fixtures cover native start -followed by an acknowledgement error, unacknowledged startup, late unconfirmed -device cleanup, and an outcome notification emitted before the actual thread -exits. Every synthetic subprocess remains owned by its test supervisor through -termination and observed exit. - -Post-review verification: 34 operation tests passed, along with the existing 15 -loader, 2 manager and 7 load-lifecycle tests. Whole Torch Ruff checks/formatting -still pass. The broad suite ran 169 tests with only the same 7 inherited -`_IncludedRouter.path` errors; this is not a full-suite pass. No production -scope beyond this private owner was changed. - - -### Private exact-slot checkpoint, 2026-10-03 - -This continuation of milestone A replaces the private model-name selector with -exact runtime/slot/load identity. It does not complete milestone B or enable a -speech producer. `ModelManager` creates a startup-random full runtime UUID and a -canonical full UUID encoding of a checked monotonic 128-bit load counter. -Runtime UUID plus load generation is the complete generation identity. The -counter consumes failed/unloaded reservations, uses bounded memory, and refuses -on exhaustion rather than wrapping. Existing short public slot IDs and serialized -slot fields are preserved; a live slot-ID collision cannot overwrite another slot. - -There is exactly one `SpeechOperationOwner` per manager runtime, across all -models and devices. Closing it does not permit constructing a replacement owner -inside the same runtime. Private admission now requires `runtime_instance_id` -and `slot: {slot_id, load_generation}`. Its request digest includes this exact -identity along with every existing audio/language/request field. Operation refs -and status retain the exact slot reference. Repeating an old retained request -returns its original receipt without reacquiring a model; changing a slot or -load generation under that request ID conflicts. Status/cancel reject a forged -slot binding even when the runtime and operation IDs match. - -Admission captures the exact slot and loaded object and borrows artifact-use -custody before scheduling the native runner. Immediately before native work, -`ModelManager.speech_lease` takes the existing shared device lock and checks the -runtime, slot ID, load generation, READY state, model type, exact slot object, -loaded object, device and unreleased borrow again. It validates the authority -receipt under that lock. Authority refusal codes are restricted to a stable -allowlist at admission and native acquisition; unknown or data-bearing provider -codes become a fixed unavailable refusal. An unload/reload or replacement in -the admission-to-worker gap therefore fails the original operation without acquiring a successor, -even if the successor has the same name or slot ID. The runtime-wide single- -active policy, independent worker retention, cancellation handling and startup/ -device-cleanup quarantine continue to apply. - -#### Artifact authority remains deliberately unavailable - -`speech_binding.py` defines only the narrow `ArtifactUseAuthority.acquire(ref)` -and `ArtifactUseLease.validate(ref)/release()` dependency seam. The production -default always refuses with `artifact_authority_unavailable`; no route, -capability, environment variable, readiness flag or production fake can make it -available. Existing app composition does not supply an authority. Returning a -private `SpeechSlotRef` supplies identity only, not speech readiness or custody. -Only test fixtures supply a synthetic authority and explicitly assume synthetic -evidence for selected references. Those fixtures do not attest actual files or -qualify a native model/runtime. - -A future real authority must retain canonical model and selected-artifact byte- -content manifests, runtime recipe/code identity, and exact owned profile/process -generation from load admission through slot unload or confirmed process -cessation. The operation lease borrows that already-attested slot-lifetime -custody; a new claim at transcription admission cannot retrospectively attest -bytes loaded earlier. The synchronous methods operate nonblockingly on retained -evidence, with no filesystem/DB work or async admission gap. Identity values, -paths, configuration, READY state and caller assertions are not evidence. The -interface intentionally does not implement storage, deletion protection, -manifest attestation, runtime qualification or process-cessation authority. - -The admitted operation retains its borrow across scheduling and throughout -native work. Confirmed worker/device completion allows borrow release while the -device is still fenced, as part of successful lease exit; cancellation alone -does not. Proven non-start may also release a borrow. Exceptional context exit -or generator finalization cannot release the device. A borrow-release exception -quarantines the operation and retains the device lease. Exceptional native -startup and unconfirmed native cleanup retain the borrow with the original PCM/conversion buffers and device -lease, even through cancellation, expiry, drain and orderly loop shutdown. -Releasing an operation borrow is not slot-lifetime custody release, artifact -deletion authorization or a secure-erasure claim. Existing external process- -termination requirements for unresolved quarantine remain unchanged. - -Verification of this checkpoint: - -- 36 private operation tests passed, including synthetic artifact-release and - lease-exit failure subprocesses and retained-borrow assertions in startup/device - quarantine. -- 15 focused binding tests passed: unavailable production default before native - work; strict slot envelopes; generation-bound duplicates/conflicts; stale, - released and foreign references; real manager unload/reload to a READY - successor in the start-to-worker gap; same-ID/object replacement; revalidation - during lock acquisition; authority revalidation under the shared lock; - cancellation custody; runtime-wide ownership; generation nonreuse/exhaustion, - failed-load reservations and slot-ID collisions; bounded provider diagnostic - codes; and unchanged name-based text lookup/public slot serialization. -- Existing Cohere adapter/lease tests: 15 passed. Model manager: 2 passed. - Model load lifecycle: 7 passed. -- Whole Torch Ruff 0.15.2 checks and formatting passed (38 Python files). -- The broad suite ran 186 tests with the same 7 inherited - `_IncludedRouter.path` errors in FastAPI route enumeration. No unrelated route - tests were changed or hidden; this is not a full-suite pass. -- No routes, capability advertisement, Rust DTO/RPC/schema changes, dependencies, - runtime recipes, live stores, model downloads or real native ASR qualification. - -#### Exception-safe admission and runner-factory review - -A correction to the exact-slot checkpoint moves operation UUID, observation -future, entry and empty binding construction before artifact acquisition. -`prepare_speech` creates the exact-slot record without borrowing; `bind_speech` -transfers the borrow directly into that record after the operation registry, -active owner and independent custodian already retain it. Authority refusal -without transfer remains a plain admission refusal. A failure after transfer -but before native launch releases only on confirmed cleanup; uncertain release -retains the binding/audio with observable `cleanup_unconfirmed` and incomplete -drain. Construction errors cannot leave an unregistered borrowed authority. - -Task-factory exceptions are separately observable through the private -`owner_startup_diagnostic`, preserving native-startup and operation/cleanup -failures alongside it. A factory can schedule or eagerly start the actual runner -and then raise without returning its task. The runner therefore retains its own -actual task before native acquisition, and an exception latches incomplete -custody synchronously. A directly owned, cancellation-resistant quarantine guard -is independent of the failed task factory. Pending coroutines, eager native -workers, audio, bindings and leases stay owned. Neither factory failure nor late -native output authorizes release or turns the operation into success. If the -exact eager runner already settled with confirmed cleanup before the factory -error, its genuine terminal receipt remains authoritative, with the separate -fixed startup-failure diagnostic. No unknown startup is inferred to be non-start. - -Focused evidence: 37 operation tests and 18 binding tests passed. Deterministic -cases cover UUID/future/entry/binding construction failure before acquisition; -post-transfer failure with successful or uncertain borrow release; factories -failing before scheduling, after scheduling and after eager native startup; -late output/device cleanup; combined native and owner startup exceptions; -repeated cancellation; retained custody through orderly asyncio shutdown; and -an eager, exactly settled pre-native refusal. Existing Cohere (15), manager (2) -and load-lifecycle (7) tests passed. Whole Torch Ruff checks/formatting passed. -The broad suite ran 190 tests with only the same 7 inherited FastAPI -`_IncludedRouter.path` errors. This correction adds no real authority, production -speech exposure, public schema, runtime qualification or process/drain integration. - -#### Await-safe startup fence and embedded import-closure review - -An actual `asyncio.Lock` can be unlocked while an awakened earlier waiter has -not resumed. A following `acquire()` can therefore suspend even after the busy -check. Runner-factory uncertainty is now checked after successful acquisition, -before handling a failed/cancelled acquisition, and before every preworker -borrow-release path. A later cancellation cannot clear that latch, settle the -operation or report complete drain. The exact binding, PCM, lease reference and -independent custodian remain retained. A resumed successful acquisition stays -fenced before native startup. The already-settled exact pre-factory refusal is -still handled separately. A supervised subprocess fixture uses the real -`asyncio.Lock` handoff window, with both cancellation and eventual acquisition, -and checks custody through repeated cancellation and orderly loop shutdown. - -The existing image/text runtime embed table now includes `speech_binding.py`, -which `model_manager.py` imports unconditionally. Its transitive imports are -standard-library-only. The Rust required-file regression includes the new file; -no speech owner or Cohere loader is embedded, and locks, dependencies, recipe, -protocol and advertised capabilities are unchanged. A lightweight Python test -materializes every Python file from the actual Rust embedded-file table into a -temporary install tree and imports/creates the existing image/text app in a -fresh isolated interpreter. Only Torch is substituted. All local imported -modules must come from that tree. A negative test removes the installed binding -file and proves that even an offered repository `PYTHONPATH` cannot supply it. -This proves the staged source import closure, not Rust materialization execution, -packaged native inference or runtime qualification. - -Post-review evidence: 38 operation tests, 18 binding tests and 2 embedded-import -tests passed, along with existing Cohere (15), manager (2) and load-lifecycle (7) -coverage. Whole Torch Ruff checks/formatting passed (39 Python files). The broad -suite ran 193 tests with only the same 7 inherited `_IncludedRouter.path` errors. -The Rust edits are limited to the required embedded-file entry and its existing -required-file test. Native Rust build/test execution remains a hosted gate; -`rustfmt` is not installed in this lightweight environment. No native Rust or -full packaged-runtime pass is claimed. - -The installed-file import-closure regression declares FastAPI 0.128.0, -Uvicorn 0.40.0 and psutil 7.2.1 in the development test requirements, matching -`runtime/requirements.lock`. This avoids accidentally relying on packages in -the developer's ambient interpreter. The managed runtime lock and its existing -Pydantic/Starlette dependency contract are unchanged; no Torch installation, -ASR recipe qualification or model inference follows from this source-import test. -A wheel-only dependency resolution for the repository's Python 3.12.3 target -succeeded using official PyPI metadata, selecting Pydantic 2.13.5 and Starlette -0.50.0 as in the current runtime lock. This was dependency resolution without -package installation or source builds. Windows/macOS dependency installation -and the full isolated startup tests remain hosted qualification gates. diff --git a/docs/plans/local-cohere-transcription.md b/docs/plans/local-cohere-transcription.md deleted file mode 100644 index 433fe8376..000000000 --- a/docs/plans/local-cohere-transcription.md +++ /dev/null @@ -1,48 +0,0 @@ -# Local Cohere transcription - -Status: loader and private Python operation owner (milestone A in `local-asr-operation-contract.md`) are implemented and synthetically tested. Next slice: production shutdown/model custody, Rust ownership and truthful capability discovery. No available end-to-end transcription capability is claimed. - -## Objective and ownership - -Support the requested Lanternwake voice-to-text feature through Pumas Library, using an installed local Cohere Transcribe model. Pumas owns model identity, managed runtime, operation admission, inference, cancellation and terminal cleanup. Lanternwake owns consent-triggered bounded capture and editable transcript review before explicit submission. - -The isolated Python slice owns `torch-server/loaders/cohere_asr_loader.py`, loader dispatch in `loaders/__init__.py`, `ModelManager.speech_lease`, focused tests and this plan. The private Python operation owner is implemented in `speech_operations.py`; its ownership and verification are recorded in `local-asr-operation-contract.md`. Remaining integration covers public Rust contracts, RPC handlers, serving capability projection, runtime recipes and production shutdown composition. Acquisition/import/custody implementations are unchanged. - -## Internal adapter contract - -- Installed directory with native `cohere_asr` config and `CohereAsrForConditionalGeneration` architecture, local safetensors weights. Pumas library resolution must independently bind repository/revision or content digest and retain asset custody. Configuration validation alone is not identity attestation. -- Native `AutoProcessor` and `CohereAsrForConditionalGeneration`, both `local_files_only=True` and `trust_remote_code=False`; model load also requires safetensors. Imports are lazy. An older runtime raises `SpeechRuntimeUnsupported` without breaking unrelated imports. -- `transcribe(model, processor, pcm16le, language, cancel)` accepts bytes containing one to 480,000 signed little-endian mono samples at 16 kHz (up to 30 seconds), and an explicit language from the model's 14-language set. It accepts no URL or caller-supplied file path. -- Generate at most 512 new tokens. Return one UTF-8 transcript bounded to 16,000 bytes; reject invalid/oversized output, do not silently truncate. Empty text is permitted for silence and must remain text, never a gameplay command. -- No thread is created by the adapter. The operation wrapper must hold `speech_lease` until the synchronous function returns. Cooperative cancellation is checked before work, after preprocessing/generation/decoding and through a stopping criterion. Preprocessing and the encoder may not respond immediately. A cancellation acknowledgement is not proof of worker cessation. Initial devices are CPU and CUDA only; MPS/other accelerators fail unsupported before loading. CUDA is synchronized before clearing the owned float audio conversion. If synchronization fails, `SpeechCleanupUnconfirmed` retains the original error, cleanup error and buffer; the operation wrapper must fence/retain the device inside its lease until runtime/process cleanup proves cessation, then release the buffer. Ordinary context-manager exit is not sufficient in that outcome. No universal secure-memory-erasure claim is made. -- The shared device lock prevents unload and cross-model concurrent inference while the lease is held. The operation wrapper must not cancel an executor future and release that lease while its native thread continues. - -## Public operation design, pending integration - -The producer must implement truthful capability discovery tied to the installed model and qualified runtime, then an operation-ID-based admission/status/cancel contract. Request metadata must explicitly identify encoding, sample rate/count and language; response must bind the model/operation identity to bounded text or a typed terminal error. The Rust and Python operation owners must agree exact routes, fields and protocol version together. No consumer should infer these names from this proposal. - -Missing model, missing runtime, wrong architecture, unsupported language, busy runtime, malformed audio, cancellation, shutdown and invalid backend output need distinct outcomes. A disconnected client does not authorize replay or release of worker custody. No hosted fallback is permitted. - -## Runtime dependencies and acquisition - -The [official model card](https://huggingface.co/CohereLabs/cohere-transcribe-03-2026) recommends native Transformers >=5.4.0 and reports testing with torch 2.10.0. It lists torch, huggingface_hub, sentencepiece, protobuf and accelerate alongside the processor dependencies. This PCM-only adapter also uses NumPy; it requires no compressed-audio decoder. Existing FastAPI/Uvicorn remain the sidecar transport. A compatible exact dependency lock must be qualified separately before production capability is advertised. - -The current managed runtime pins Transformers 4.57.6 and cannot supply this native model class. This slice deliberately does not upgrade the shared image/text runtime recipe or lock. The ASR runtime selection and qualified dependency set remain the runtime owner's work. - -[Official files](https://huggingface.co/CohereLabs/cohere-transcribe-03-2026/tree/main) list 4.13 GB weights under [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0). The page currently requires contact-sharing acceptance; exact fields/conditions are not visible while logged out. No gate acceptance, download, credential creation, paid API call or private voice transmission occurred. Local model inference remains blocked until acquisition and runtime setup are authorized and available. - -## Acceptance evidence - -Loader tests use synthetic classes and PCM to prove local-only loading arguments, native class requirements, config rejection, input/language/output bounds, cooperative cancellation points, conversion cleanup and device lease behavior. They do not demonstrate model accuracy or actual Transformers execution. - -The developer test requirements pin NumPy 2.3.5 for actual PCM conversion assertions. - -Run `python3 -m unittest discover -s torch-server/tests -p test_cohere_asr_loader.py -v` and the existing model manager/load lifecycle suites. Milestone A evidence in `local-asr-operation-contract.md` covers private admitted-work cancellation, repeated cancellation, observer loss, deduplication, bounded drain and retained unconfirmed custody. Public transport/model identity and production shutdown composition remain separate integration gates. Finally run a real approved installed-model synthetic speech fixture through Pumas and the game. Physical microphone and speech quality require separate evidence. - -### Loader slice checkpoint, 2026-10-03 - -- 15 focused adapter/lease tests passed, including unsupported runtime/device, local loading arguments, cancellation points, and unconfirmed CUDA cleanup. -- Existing model manager (2 tests) and model load lifecycle (7 tests) passed. -- Whole Torch Ruff 0.15.2 checks and formatting passed. -- The global Python broad suite executed 135 tests with 7 errors in existing FastAPI route enumeration (`_IncludedRouter.path`). The unchanged PR22-equivalent baseline executed 120 tests with the same 7 errors in the same environment. This is an inherited environment mismatch, not a full-suite pass. No route test was weakened. -- Real model loading, CPU/CUDA inference, managed ASR runtime, public operation lifecycle and game transcription remain unqualified or unimplemented. Loader source acceptance does not satisfy those claims. diff --git a/docs/plans/local-intent-api-2026-09-12/execution-ledger.md b/docs/plans/local-intent-api-2026-09-12/execution-ledger.md deleted file mode 100644 index 8b8c5e1f0..000000000 --- a/docs/plans/local-intent-api-2026-09-12/execution-ledger.md +++ /dev/null @@ -1,374 +0,0 @@ -# Execution Ledger: Local Intent API - -## 2026-09-12 — Plan creation - -- Created a local-only implementation plan from the intent/discovery/distribution - brief and the user's release scope. -- Surveyed native API operations, model-reference/package-facts types, download - lifecycle entrypoints, same-device client, RPC error projection, and current - architecture/planning guidance. -- Selected four dependency-ordered milestones: native local resolution, managed - acquisition, durable local desired state, and existing local transports. -- Recorded separate intent naming because existing `get_model` is indexed lookup. -- Deferred nodes, fleets, new networking, MCP, shared discovery caches, and - inference gateway development. -- Identified existing recovery/import work as a prerequisite to evaluate before - acquisition and durable-state integration. No claim that it is complete. -- Implementation and acceptance evidence remain pending. No runtime code changed. -- Documentation verification: relative Markdown links resolve; `git diff --check` - passes for this documentation change. Runtime suites were not run for planning. - -## 2026-09-12 — Implementation admission - -- User explicitly requested implementation of this plan, with Sol medium for - implementation and Astra medium for design and error fixing. Started M1 and - transitioned the previously Planned plan to Active. -- Delegated the native local implementation to Sol and an independent read-only - acquisition prerequisite assessment to Astra. Parent owns integration, review, - documentation, and acceptance. -- Existing unrelated workflow/stub deletions and temporary recovery directories - are outside the write set and remain untouched. - -## 2026-09-12 — Source findings and baseline verification - -- Astra identified hardcoded main revision in metadata, downloader, identity, - bundle preflight, persistence and recovery. Added M2a with a concrete local - prerequisite design; this does not broaden network exposure or complete M2. - Evidence: [acquisition audit](reports/acquisition-prerequisites.md). -- Initial unchanged-code `api_tests`: 11 passed, 25 failed. Root failure was the - existing llama router test expecting `llama-server` in an error now emitted as - `Runtime spawn failed: No such file or directory`; subsequent failures included - a poisoned registry test mutex. Astra independently reproduced the root test. -- Rerun excluding three known launcher diagnostics: 27 passed, 6 failed, 3 - filtered. Existing runtime shutdown expectation `profiles_processed >= 1` - failed and poisoned later registry tests. No runtime/test behavior changed to - hide these failures; relevant model/library regressions will be run separately. -- Expanded M1 write scope narrowly to existing library/context owners so the - intent module can reuse canonical source-fingerprint validation without - reconciliation or cache writes. Parent rejected a provisional timestamp/size - approximation; Astra owns the canonical read-only helper and Sol integrates it. - -## 2026-09-12 — M1 accepted: native local intent resolution - -### Behavior and ownership - -- Sol implemented `PumasApi::intent()` and shared local query/get/status logic, - transport-independent requirements/outcomes, safe candidate/handle projection, - native example, and public-interface tests. -- Astra added the canonical read-only fingerprint helper by sharing descriptor - construction below existing external-asset reconciliation. Public operational - methods retain their behavior. No new downloader, persistence schema, transport - method, listener, runtime loader, node, fleet, or MCP operation was introduced. -- Parent and Astra review closed inconsistent summary/detail identity, revision - and repository evidence, stale negative decisions, unknown-format evidence, - invalid GGUF inspection, and filename-only quantization inference. Positive and - negative decisions now require coherent current source evidence. -- Read-only matching detects changes across snapshot pages/evaluation and returns - unavailable observation; it does not retry mutations or regenerate facts. -- `AllowUpstream` remains explicitly unsupported; ensure/release are not exposed. -- Public Rustdoc/core README state that a handle is an availability observation, - not a lease, tensor-integrity proof, or runtime readiness promise. - -### Verification and limits - -- `cargo test --offline --manifest-path rust/Cargo.toml -p pumas-library --test intent_api_tests`: **9 passed** after final review fixes. Covers exact local - matching/no writes, missing/invalid/unsupported states, ambiguity, constraints, - unknown revision/format evidence, stale/removed files, malformed cache identity, - contradictory cached revisions, known-invalid GGUF and header vs filename quant - evidence. Real filesystem/index/facts producers; HF/process clients disabled. -- `cargo test --offline --manifest-path rust/Cargo.toml -p pumas-library --lib cached_package_facts`: **2 passed** after source-coherence fixes. Includes - same-length file/metadata changes, current revision/repository/identity checks, - and observation without metadata/cache/feed writes. -- `cargo test --offline --manifest-path rust/Cargo.toml -p pumas-library --test api_tests -- --skip runtime --skip launch_llama_cpp`: **30 passed, 6 filtered**. - Six unrelated runtime-profile cases excluded after the documented unchanged-code - baseline failures; this does not claim the full suite passes. -- `cargo test --offline --manifest-path rust/Cargo.toml -p pumas-library --lib package_facts`: **28 passed** before final helper-only coherence additions; - the final helper subset was rerun afterward. -- `cargo clippy --offline --manifest-path rust/Cargo.toml -p pumas-library --lib --test intent_api_tests --example intent_model -- -D warnings`: **passed** - after final fixes. Native example also passed Cargo check. -- Exact changed Rust files formatted; documentation relative links and - `git diff --check` pass. Evidence is Linux/native and controlled local artifacts; - no external HF, remote transport, persistence-migration, or all-platform claim. -- Existing HF directory/file target mismatch (I8) returns `Incomplete`. No - canonical package-fact/load-target behavior was changed to hide it. -- Concurrent unrelated runtime-profile/mmproj changes appeared during this work; - they were preserved and are not part of M1 or its acceptance claim. - -M1 and A1 are accepted within these limits. The plan remains Active with partial -acceptance. **Exactly one next slice: M2a**, the audited immutable-revision -acquisition prerequisite. M2–M4 and their acceptance claims remain pending. No -commit was created. - -## 2026-09-12 — M2a admission and compatibility decision - -- Continued on the user's instruction. Sol owns acquisition, persistence, and - importer implementation; Astra owns revision identity design and error review. -- Preserve public `DownloadRequest`, notification payloads, and binding inputs. - Add an optional revision field to public `PersistedDownload`: external Rust - struct literals must supply this field. This is a source-breaking change to - that lower-level record, despite preserving the operational request contract. -- The existing locked atomic JSON store remains authoritative. Support validated - v4-to-v5 upgrade, mapping legacy records to main; v5 writes explicit revision - evidence. Older v4 readers must refuse v5. Failed validation must preserve the - original document and all custody state. No downgrade rewrite is supported. -- Ticket recovery cannot carry an immutable pin today. Refuse non-main ticket - recovery and protect pinned destinations from generic legacy recovery paths; - ordinary persisted resume must retain the exact commit. Full recovery lifecycle - acceptance remains deferred to M2's existing gate. -- Constructor inventory also includes `src/tests.rs`; admit mechanical fixture - initialization there, without changing runtime behavior or unrelated tests. - -## 2026-09-12 — M2a accepted: immutable-revision acquisition foundation - -- Sol implemented private revision threading through managed preflight, metadata - and cache isolation, bundles, worker requests/retries, admissions, persisted - resume, and owned normal/Diffusers import. Astra implemented validated identity - and bound provenance reads, corrected identity stability across implicit file - expansion, reviewed migration outcomes, and fixed diagnosed fixture failures. -- Public operational requests continue with main. Pinned identity and destination - include the complete commit for every selector kind; discovered files remain - evidence without renaming an already planned pinned destination. -- Store v5 and validated locked v4 upgrade preserve custody. Malformed and proven - pre-publication failures preserve original bytes; uncertain post-publication - outcomes return failure without guessing rollback. The public persisted-record - constructor compatibility change is documented in the core README. -- Provenance guards refuse conflicting metadata/markers before admission and - recheck under destination ownership before execution/restored finalization. - Ticket recovery remains unavailable for pins; native persisted resume retains - the exact revision. No broader crash/recovery acceptance claim was added. -- Verification: **404 tests passed** across store (61), importer (24), recovery - (30), HF (221), managed API (19), identity (10), intent integration (9), and - existing relevant API regression (30) suites. Three unit-harness entries are - subprocess helpers exercised by parent tests; six known runtime API cases were - filtered for the previously recorded I7 baseline failures. -- HF loopback fixtures initially failed under socket restrictions; authorized - outside-sandbox reruns passed. Six old fixtures were updated to preserve their - lifecycle fault-injection claims while supplying valid preflight provenance. - The strict production guard was retained. -- Clippy passed with warnings denied for the library, tests, and native example. - RPC and UniFFI consumers passed offline Cargo check. Rust 2021 formatting, - documentation links, and diff whitespace checks passed. -- Detailed commands, migration outcome semantics, moving-main and retry/reopen - evidence, and limits are in the [M2a report](reports/immutable-revision-implementation.md). -- Existing workflow/stub deletions, recovery scratch directories, and concurrent - runtime-profile/mmproj edits remain outside this work and were preserved. - -M1 and M2a are accepted. The plan remains Active with partial acceptance. -**Exactly one next slice: M2**, beginning with its lifecycle prerequisite gate -before connecting managed acquisition to the public intent language. -`AllowUpstream`, ensure/release, and transport projections remain unimplemented; -nodes, fleets, and new networking remain deferred. No commit was created. - -## 2026-09-12 — M2 admission and verification prerequisite - -- User requested continuation. Started M2 with Astra reviewing lifecycle and - integrity prerequisites and Sol implementing revision resolution/orchestration. -- Audit found pinned progress identity still used legacy identity projection; - Astra corrected it. More substantially, existing-file skips and recorded hashes - do not prove acquired byte integrity. Add verification under the existing task - and destination owners before allowing pinned completion/import. -- Admit only bound verification helpers in download_recovery.rs and canonical - facts production in importer.rs beyond the existing M2 write set. Immutable - tree rehydration supplies per-file evidence on resume without a new store - schema. Unknown auxiliary integrity remains unknown. -- Preserve unresolved custody as blocked/unavailable; public status uses a - read-only snapshot and pinned local requirement, not a second downloader or - ephemeral-only operation identifier. Broad crash recovery remains unaccepted. - -## 2026-09-12 — M2 accepted: managed native intent acquisition - -- Sol implemented native immutable upstream selection, actionable ambiguity, - stable pending requirements, and read-only progress projection over the - existing managed download owner. Public operational download requests retain - legacy behavior; no transport, desired-state store, or network listener added. -- Pinned execution verifies exact admitted file evidence before promotion and - import, including existing finals and complete partials. Cold execution - rehydrates file sizes/hashes and rejects contradiction with durable primary - identity. Bound filesystem verification preserves failed bytes. -- Pinned import must publish canonical package facts before reporting completion. - Parent added failure-injection coverage for canonical-facts publication and a - native acquisition example that always awaits managed download shutdown. -- Astra review and fixes closed selector-ID collisions, completed explicit-branch - lookup after live state cleanup, explicit commit substitution, mismatched - active artifact constraints, and handled upstream/integrity failures being - incorrectly counted as failed mutation effects. Actual cache/IO and panic - failures retain ownership. Cold fixtures explicitly observe settled tasks and - order cache removal before execution evidence lookup. -- Final verification: **433 tests passed** across the managed HF, native intent, - API lifecycle, importer, recovery, artifact identity, store, and relevant - operational integration suites. Three subprocess helpers ignored; six unrelated - runtime API cases excluded for the recorded baseline reasons. No full-runtime - suite or all-platform claim. All core tests/examples pass Clippy with warnings - denied; RPC without default features and UniFFI pass Cargo check. -- Real upstream gate passed for the 1,185,376-byte public - `ggml-org/test-model-stories260K` artifact at immutable commit - `479896ec924af6d40fd419ab8f4d1eb2101de00d`. Independent local size/SHA-256 match; - both canonical facts records present. Isolated temporary library and registry; - no runtime execution. Exact evidence and commands are in the - [M2 report](reports/managed-intent-acquisition.md). -- I2 broader crash/recovery evidence and I8 canonical directory load-target - correction remain owned separately. M2 rejects known unsupported acquisition - layouts instead of claiming availability for them. - -M2, A2, and A3 are accepted within these bounds. The plan remains Active with -partial overall acceptance. **Exactly one next slice: M3**, beginning with its -store/lifecycle design gate for durable local ensure/release. M4 existing local -transport projections remain planned; nodes, fleets, and new networking remain -deferred. Unrelated dirty files were preserved. No commit was created. - -## 2026-09-12 — M3 admission and persistence prerequisite re-plan - -- User requested continuation. Astra independently inspected the index/store and - existing reconciliation lifecycle while parent audited deletion entrypoints. -- ModelIndex uses WAL synchronous NORMAL and unversioned additive schema setup; - runtime task shutdown aborts without draining; ModelLibrary deletion removes - the index row before asynchronous filesystem effects. Public ensure cannot - inherit durable acknowledgement or exclusion guarantees from those behaviors. -- Admitted M3a: the crate-private authoritative declaration/deletion-claim store - and process-crash transaction evidence. Public ensure/release and reconciliation - remain M3's gated next integration, with no additional scheduler or owner here. -- Exact proposed store and lifecycle designs are recorded before implementation. - This re-plan does not accept M3 or its broader crash/recovery claims. - -- Reviewed and admitted the exact M3a store design before Sol implementation: - existing index connection, component schema v1, FULL writer synchronization, - atomic additive migration, normalized requirement/consumer-derived ID, typed - immutable target, and UUID creation generations. Binding preserves that UUID - for idempotent retry; release/re-ensure allocates a new one to prevent ABA. - Sol owns the store and a second Sol owns on-disk/process tests; Astra reviews. - -## 2026-09-12 — M3a accepted: authoritative declaration storage - -- Sol implemented the private component-versioned store on the existing index - connection; a second Sol implemented on-disk and subprocess tests. Parent and - Astra reviewed schema admission, canonical identity, transaction exclusion, - migration preservation, and the boundary with future lifecycle integration. -- Immediate transactions own declaration creation/binding/release and deletion - claims. Writer connections use FULL synchronization. Snapshot reads reject - partial/future schema, malformed/cross-inconsistent rows, and contradictory - retention/deletion custody. Catalog clearing does not cascade into authority. -- Review fixed namespace/index discovery, first-installer transaction ordering, - read snapshot coherence, canonical JSON/UUID/quantization handling, local target - loss, and retention/claim overlap. A shared production commit hook makes the - before-COMMIT process test exercise the actual INSERT/readback boundary. -- Final tests: **378 passed**: index 74 (including 11 new storage tests), intent 7, - managed HF 233, API HF 25, public intent 9, and relevant API 30. One ignored - process helper is invoked by its parent test; six runtime cases remain excluded - for previously documented unrelated baseline failures. No full runtime-suite, - power-loss, or all-platform claim. -- All core library/tests/examples pass Clippy with warnings denied. RPC without - default features and UniFFI pass Cargo check. Exact Rustfmt edition 2021, - documentation relative links, and whitespace checks pass. -- The [M3a report](reports/m3a-declaration-store.md) records scope and evidence. - Historical binaries ignore the new tables; downgrade with live declarations - or claims remains unsupported. No public ensure/release method, scheduler, - filesystem deletion guard, transport, or new networking was exposed. - -M3a is accepted. Full M3 and A4 remain pending. **Exactly one next slice: M3b**, -owned ensure/release, immutable planning/admission, actual deletion/relocation -exclusion, startup/retry reconciliation, and their cross-component crash gates. -The lifecycle design and deletion inventory identify the required bounded scope -amendments before that implementation. Unrelated working-tree changes remain -untouched; no commit was created. - - -## 2026-09-12 — M3b integration admitted and active - -The user requested continued implementation. Admitted the exact owner and -deletion composition reports and extended the write set for runtime ownership, -shared persistence injection, pure HF destination planning, lower library/merge -guards, and explicit shutdown. Sol implements finite ownership, HF planning, -and the public desired-state service; Astra handles reconciliation lifecycle -integration and deletion correctness. Existing native root grants and stores -remain the sole custody authorities. Unconfigured lower destructive operations -fail closed, including path-only source merge; this compatibility limit is -explicit. M3 acceptance remains pending cross-component verification. - -Integration review identified two additional existing mutation paths: constructor -partial-file promotion and explicit planned migration. Admitted their narrow -correction: defer startup partial publication to the configured download owner, -and make migration share the same claims/capability operations. Unsafe split -transfer, cross-filesystem copy/delete, and partial duplicate transfer preserve -source state and report refusal. No additional task scheduler or store is added. - - -## 2026-09-12 — M3b accepted; M4 admitted - -- Durable native ensure/release/status/list operations now compose under the - existing primary. Commit precedes pure canonical planning; immutable binding - and generation checks precede admission. Caller cancellation does not detach - effects; shared shutdown drains local work and then downloads independently - of its waiter. -- Existing native root grants, strict persisted custody, and deletion claims - guard destructive paths, including discovered migration and constructor - bypasses. Explicit compatibility limits are recorded in the M3b report. -- Real crash tests cover accepted declaration, upstream admission, and published - artifact boundaries. Interrupted active custody resumes its exact existing - writer; manual pause/error remains blocked. Same-pin repair after a branch - change passes. The repair test found and fixed an existing noncanonical - review-reason append in the partial-metadata importer. -- Relevant verification: 877 tests passed, six subprocess helpers exercised by - parent tests; core Clippy -D warnings, RPC no-default-feature check, UniFFI - check, formatting and whitespace checks passed. I7 runtime exclusions remain. -- M3 and A4 are accepted within the report's bounded Linux evidence. No commit - was created; unrelated working-tree changes remain untouched. - -M4 is now admitted. It extends seven prefixed operations through existing -authenticated IPC and the closed RPC command/outcome contract. The scope adds -PrimaryState dispatch and the existing RPC shutdown call to the transport write -set. Real process evidence will use the existing RPC binary and its IPC owner; -actual upstream pending/disconnect checks can use a child-only rate-limited -CONNECT proxy and the already-verified public pinned fixture, without TLS -interception, a new production endpoint, or any new listener. Offline local -process/contract checks remain independent. Nodes, fleets and new networking -features remain deferred. - - -## 2026-09-12 — M4 accepted; local intent plan complete - -- Added all seven intent operations through the existing authenticated IPC and - loopback RPC contracts. `PumasLocalClient::intent()` mirrors the native facade; - RPC uses collision-free `intent_` methods and closed typed commands/outcomes. - Strict receiver shapes retain native defaults; infrastructure errors use the - existing public projection. No desktop or binding migration was required. -- Actual registry-backed child owners verify native/IPC Available parity, - authentication, invalid/unsupported inputs, reconnect, forced restart and - generation-safe durable release. Actual RPC binary consumers verify both - transports and ordinary restart. Both real pinned HF acquisition gates pass, - including the same pending writer after consumer disconnect, verified - availability, retained bytes after release and successful graceful shutdown. -- The live gate exposed expected root contention being archived as an owner - failure. Admitted a narrow reconciliation correction: opportunistic work stays - dirty with bounded retry, explicit refresh retains its conflict, and neither - poisons shutdown. Actual effect/join failures remain observable. Held-root - regressions and both live process gates verify the correction. -- Updated two test producers: restart setup preserves normalized model evidence; - tracked persisted download fixtures explicitly initialize revision. Production - strict decoding and availability assertions remain intact. -- 267 relevant M4 integration/regression tests pass. Both RPC build variants, - core and RPC Clippy with warnings denied, export-contract/UniFFI compatibility, - exact formatting, whitespace and document links pass. The report records - ignored helpers, older manual RPC cases and the unchanged timing-test limit. -- Existing operational native, UniFFI, RPC, Electron and frontend contracts were - inventoried and retained. Public examples, core/RPC guides and architecture - document the intent service, side effects, pending state, retention, upgrades - and deferred capabilities. - -All objective claims A1–A7 and milestones M1–M4 are accepted within their recorded -scope. The [M4 report](reports/m4-local-transports.md) holds final evidence. I7 -runtime baseline exclusions, I8 directory-contract limits and broader historical -power-loss/lifecycle guarantees remain outside this acceptance. Nodes, fleets, -remote discovery and additional network features remain deferred until after -the next Pumas release. Unrelated working-tree changes were preserved; no commit -was created. - -## 2026-09-14 — Commit preparation - -Reviewed the remaining intent/storage/transport write set against the accepted -M1–M4 scope after separating Torch and conversion work. All nine local intent -API tests and five durable desired-state tests pass on the current combined -checkout; RPC with inference disabled also passes cargo check. The initial -sandboxed test attempt could not create its IPC fixture; the same tests passed -with local socket permission. Prior M4 process/acquisition evidence and its -explicit compatibility limits remain the acceptance record. No broad GPU -matrix or new live acquisition was repeated for commit preparation. diff --git a/docs/plans/local-intent-api-2026-09-12/issues.md b/docs/plans/local-intent-api-2026-09-12/issues.md deleted file mode 100644 index f1abec3e2..000000000 --- a/docs/plans/local-intent-api-2026-09-12/issues.md +++ /dev/null @@ -1,13 +0,0 @@ -# Issues: Local Intent API - -| ID | Severity | Finding/evidence | Owner | Disposition | -| --- | --- | --- | --- | --- | -| I1 | Contract | `api/models.rs::get_model` already means indexed lookup | Core intent interface | Resolved in plan: separate `api.intent()` namespace; preserve existing method | -| I2 | Lifecycle prerequisite | Existing remediation plan records unfinished download restore/import/crash evidence | Existing remediation program; intent integration owner | M2 bounded ordinary resume, integrity, caller-drop and shutdown evidence accepted in [report](reports/managed-intent-acquisition.md). M3b adds bounded declaration/admission/publication process-exit evidence in its [report](reports/m3b-local-desired-state.md). Broader historical lifecycle/power-loss guarantees remain open; existing lifecycle owner retains authority | -| I3 | Persistence | Durable declaration schema and lifecycle integration need separate guarantees | Core intent/store implementation | M3a private store accepted with [implementation evidence](reports/m3a-declaration-store.md) and [exact design](reports/m3-store-design.md). M3b integration accepted: guarded deletion/relocation, owned drain, immutable replay, and startup/bounded retry; see [evidence and explicit compatibility limits](reports/m3b-local-desired-state.md) | -| I4 | Consumer scope | Existing bindings and desktop consumers use operational contracts | Local transport implementation | Existing native, UniFFI, RPC, Electron and frontend consumers inventoried in the [M4 report](reports/m4-local-transports.md). Existing operational contracts remain; new binding/UI intent projections require a separate bounded scope update | -| I5 | Deferred scope | Brief includes nodes, fleet management, remote discovery and transfers | User release scope | Deferred until after next release; revisit then, with fresh scope and acceptance. No placeholders in current implementation | -| I6 | Acquisition contract | Download requests, metadata, worker URLs, identity and ticket recovery previously assumed main; see [audit](reports/acquisition-prerequisites.md) | Existing download/import/store owners | M2a accepted: private pinning, identity, persistence/resume and import verified; ticket recovery refuses pins. See [evidence](reports/immutable-revision-implementation.md). M2 now exposes bounded native AllowUpstream after its [separate gates](reports/managed-intent-acquisition.md) passed | -| I7 | Existing test baseline | Baseline api_tests: router/other missing-binary diagnostics changed in existing process owner; runtime shutdown test also expects profiles_processed >= 1; panics poison shared registry mutex | Existing runtime-profile test owner | Astra reproduced router failure before intent changes; retain separate relevant model/library API regression evidence and disclose full-suite failure | -| I8 | Existing artifact contract | `package_facts/artifact.rs` classifies a Safetensors package with config.json as HfCompatibleDirectory, but descriptor entry_path can be its primary file while load target requires a directory | Existing package-facts/load-target owner | Open, separate canonical contract correction; Local observation retains shape checks and returns Incomplete. M2 rejects known affected upstream Safetensors layouts before transfer; no fabricated path or claim for all layouts | -| I9 | M1 review | Cached revision/repository could disagree with current metadata; unknown format and invalid GGUF evidence could be misclassified | Intent and canonical freshness helper | Resolved: current source coherence gates positive/negative decisions; unknown/invalid facts stay incomplete; header quantization matches canonical labels while filename guesses cannot satisfy quantization. Regression tests pass | diff --git a/docs/plans/local-intent-api-2026-09-12/plan.md b/docs/plans/local-intent-api-2026-09-12/plan.md deleted file mode 100644 index a9877d1fe..000000000 --- a/docs/plans/local-intent-api-2026-09-12/plan.md +++ /dev/null @@ -1,587 +0,0 @@ -# Plan: Local Intent API and Transport-Independent Domain Language - -**Plan status:** `Complete` -**Current phase:** M1–M4 accepted within the recorded local release scope. -**Current acceptance status:** `accepted` -**Next slice:** None in this plan. Distributed capabilities remain deferred until after the next Pumas release. -**Development decision:** `defer-and-implement`: -implement the local API foundations; defer distributed architecture. - -## Objective and release scope - -Let an application describe the model artifact it needs and let Pumas own -resolution, acquisition, verification, and local desired-state reconciliation. -Define that contract independently of HTTP, JSON-RPC, MCP, or an eventual fleet -protocol. This prepares the API layers for the next Pumas release without -implementing distributed Pumas. - -Scope follows the user's 2026-09-12 instruction and sections 1–3 of the -[intent/discovery/distribution brief](../../breif/intent-discovery-distribution.md). -The brief's distributed proposals are architectural context, not requirements -for this plan. The [agent brief](../../breif/agent-interaction-mcp.md) supplies a -future consumer perspective, not authority to implement MCP. - -### Included - -- A small intent interface in `pumas-core`, accessible without a GUI or runtime. -- Validated model/artifact requirements, resolved identities, availability - outcomes, and local desired/observed state. -- Deterministic local resolution and acquisition through existing Hugging Face, - download, import, package-facts, and reconciliation capabilities. -- Durable local `ensure_model` and non-destructive `release_model` semantics. -- Thin projections through the existing same-device IPC client and loopback - JSON-RPC server. This extends established local transports, not exposure. -- Compatibility evidence for existing operational methods and one native and - one local process consumer example. - -### Deferred until after the next release - -Pumas node identities/capabilities, fleets, remote library discovery, machine or -fleet registry redesign, LAN exposure, remote authentication, peer acquisition, -artifact transfer protocols, distributed desired state, host-daemon deployment, -Kubernetes adapters, and renaming/restructuring the `network` domain for those -features. No placeholder node types, remote endpoint fields, fleet registries, -transport negotiation, or generic network adapter framework are needed now. - -MCP tools/tasks/subscriptions, shared/bulk discovery caches, and unified inference -gateway development are outside this plan. The gateway's existing -[post-release deferral](../../breif/unified-inference-gateway.md) remains in force. -Existing outbound Hugging Face discovery/downloads stay usable. No new listener, -port, service, deployment mode, runtime loading, or inference routing is added. - -## Current code and intended ownership - -| Existing owner | Relevant behavior | Planned use | -| --- | --- | --- | -| `pumas-core/src/lib.rs`, `api/builder.rs`, `api/state.rs` | `PumasApi` construction and primary state | Compose one intent module under the existing owning instance | -| `pumas-core/src/api/models.rs` | Indexed `get_model`, search, package facts, execution descriptors, artifact load targets, import, update feed | Reuse operational behavior below the intent interface | -| `pumas-core/src/models/package_facts.rs` | Versioned `PumasModelRef` and artifact/package facts | Reuse identities and evidence; validate before intent decisions | -| `pumas-core/src/api/hf.rs`, `model_library/hf/` | Details, download admission, progress, recovery, shutdown | Own actual acquisition and worker lifecycle | -| `pumas-core/src/api/reconciliation.rs` | Coordinated index reconciliation and watcher integration | Observe and repair through existing authority | -| `pumas-core/src/model_library/download_store.rs` | Durable download state | Remain the download authority, distinct from desired intent | -| `pumas-core/src/ipc/{protocol,local_client}.rs` | Explicit same-device owner connection | Adapt the same intent contract without taking ownership | -| `pumas-rpc/src/{contract,handlers,server}.rs` | Validation, public error projection, JSON-RPC dispatch | Decode, invoke core, project bounded outcomes | - -Paths above are relative to `rust/crates/`. Confirm exact call sites at each -milestone; this is a source survey, not a completed behavioral audit. - -## Binding design decisions - -### 1. One deep intent module - -Add a public `intent` module in `pumas-core` and an accessor conceptually shaped -as `api.intent()`. Its methods own selection and orchestration. Keep the current -operational methods available to administrative and existing consumers. - -In particular, existing `PumasApi::get_model(&str)` returns an optional indexed -record. Do not change that method into an acquiring call. The intent namespace -makes its stronger side effects and outcome contract explicit. - -The domain types depend on domain values, not HTTP status, JSON-RPC envelopes, -SSE events, MCP handles, database rows, or transport connection state. Serde -representations may live with types where appropriate, but deserialization alone -must not bypass semantic validation. No new crate or general command bus is -required unless implementation reveals a present dependency constraint. - -### 2. Initial language and interface - -Names below are proposed public names; M1 settles concrete Rust signatures and -records them here before publication. Semantics are binding. - -| Concept | Meaning and constraints | -| --- | --- | -| `ModelRequirement` | Explicit local model reference or upstream repository selector, optional revision, artifact constraints, acquisition policy | -| `ArtifactRequirement` | Supported format, optional quantization and selected artifact; reject contradictory or unsupported constraints | -| `ArtifactIdentity` | Existing stable model/artifact identity and resolved revision where available; no display-name or absolute-path identity | -| `ModelHandle` | Resolved identity and local artifact access information with verification evidence; availability observation, not a file lease or loaded runtime | -| `DesiredModelState` | Durable local requirement for `Present`, pinned to the resolved immutable revision before acquisition | -| `ObservedModelState` | Explicit missing/resolving/acquiring/verifying/available/blocked/failed state with bounded reason and progress where meaningful | - -Reuse `PumasModelRef`, package facts, and existing format/quantization types when -their semantics fit. Do not introduce parallel identity systems. Distinguish an -upstream repository selector from a local indexed model ID. Unknown revision or -integrity evidence stays unknown; never fabricate a hash or claim verification. - -| Intent operation | Observable promise | -| --- | --- | -| `query_models` | Read-only local candidates and match evidence; no acquisition or automatic repair | -| `get_model` | Return a verified available handle, accepted pending acquisition, or a typed unsatisfied/failure outcome; do not create durable desired state | -| `get_model_status` | Read a snapshot by stable model/requirement identity; optional operation correlation must not be the only recovery path | -| `ensure_model` | Persist local desired state before acknowledging acceptance, then reconcile toward availability | -| `release_model` | Remove the caller's durable requirement; never imply file deletion, runtime unload, or cancellation of another consumer's work | - -Initial selectors are explicit identities and structured artifact constraints. -Open-ended capability ranking, automatic substitutions, and free-text model -recommendation are not promised. Multiple valid candidates return an explicit -ambiguous result; lack of evidence does not mean a match. A provided revision is -honored; an unpinned upstream request resolves to an immutable revision before -mutating. A durable ensure remains pinned until explicitly changed. - -Use an explicit acquisition policy: `LocalOnly` or `AllowUpstream`. A local-only -miss performs no upstream calls. Upstream acquisition uses existing provider -credentials and policy; clients cannot submit arbitrary destination paths or -bypass managed storage, gated repository access, or verification. - -### M1 concrete native interface - -- `PumasApi::intent(&self) -> IntentApi<'_>` borrows the current owner. -- `query_models(&ModelRequirement)` returns typed candidates/match evidence. -- `get_model(&ModelRequirement)` returns typed observed availability or the - reason the requirement cannot currently be satisfied. -- `get_model_status(&ModelRequirement)` performs a fresh read-only observation - with the same domain-state meanings. -- `ModelSelector` separates a local `PumasModelRef` from an upstream repository - selector. `ArtifactRequirement` carries optional format, quantization, and - selected-artifact constraints; every entrypoint validates them. -- M1 explicitly rejects `AllowUpstream` as unsupported. It registers no ensure - or release methods. The handle is a local observation, not a runtime lease. -- Indexed readiness alone is insufficient: compare current source evidence - through the existing fingerprint owner and check current filesystem shape. - Missing/stale facts return incomplete state without cache writes or repair. - -### 3. Availability and lifecycle - -`Available` means the selected local artifact satisfies the requirement and the -existing authoritative checks needed for access passed. It does not promise a -loaded model, runtime installation, GPU fit, inference readiness, or perpetual -file availability. Consumers needing a fresh access decision re-resolve it. - -Represent invalid requirements, unsupported constraints, ambiguity, not found, -policy refusal, transient unavailability, failed verification, and operation -failure distinctly. Map these outcomes through existing public error machinery -without leaking credentials, raw upstream responses, or internal diagnostics. -A transport timeout must never be interpreted as proof that acquisition failed. - -Acquisition is asynchronous when needed. Accepted work belongs to the existing -Pumas lifecycle owner; dropping a request or losing a local connection does not -detach its task or cancel shared work. Correlation IDs can be returned for -observation, but domain identity remains independently queryable. - -Deduplicate only after requirements resolve to the same artifact/revision and -compatible policy. Independent requests may join work; conflicting revisions -or policies must not be silently collapsed. Reuse download admission, recovery -tickets, generation checks, importer ownership, and shutdown handling. Never -add an independent downloader or automatically retry mutations with uncertain -outcomes. Retry transient reads within bounded policy; settle/observe admitted -mutations before deciding whether another attempt is safe. - -### 4. Local desired state has one durable owner - -An ensure declaration belongs to a stable local consumer key and normalized -requirement. The consumer key is application-managed identity, not a security -credential, transport session, or node ID. The same consumer and declaration -is idempotent; different consumers may retain the same resolved artifact. -Release addresses that consumer's declaration and is idempotent. Existing local -owner authorization still governs access; do not imply tenant isolation. - -Persist declarations and their resolved targets in the existing library's -SQLite persistence ownership, with explicit schema migration and transaction -boundaries. Reuse the existing index connection/migration mechanism if suitable; -M3 must identify the exact store before editing schema. Desired state does not -copy download progress or redefine indexed artifact truth. - -Reconciliation runs while the existing owning Pumas instance is running and -resumes after restart. No always-running daemon is implied. Wake reconciliation -from relevant existing model/download changes, coalesce wakeups, and use bounded -backoff for retryable failures. Startup reconciliation and snapshot reads cover -missed notifications. Invalid or conflicting state remains observable and does -not enter an automatic destructive repair loop. - -If a retained artifact disappears, ensure can reacquire it under the recorded -policy. Explicit administrative deletion must report a conflict while retained; -the caller must release declarations first. Release stops future maintenance -for that declaration; it does not delete bytes. Already admitted shared work is -observed to settlement through its existing owner. No new garbage collector or -retention scheduler is included. - -Persisted migration failure must preserve original data and report failure; -never rebuild an authoritative library as recovery. Record backup/downgrade -behavior before shipping the schema change. Do not claim restart/crash safety -solely from an in-memory test or orderly shutdown. - -### 5. Transport and consumer evolution - -Native Rust is the canonical behavior contract. Same-device IPC and loopback -JSON-RPC adapt it. Use namespaced RPC names (proposed `intent_get_model`, etc.) -so existing operational methods retain their meanings. Settle receiver limits, -unknown-field policy, discriminants, numeric ranges, and error mappings before -registering each method. Unsupported future inputs must not silently default. - -Keep domain semantic validation reusable; transport framing, request IDs, -authentication, timeouts, and safe error presentation stay in adapters. Polling -status is sufficient initially; no new event protocol is required. Existing -update feeds remain authoritative for their existing scopes. - -New Electron/UI and native-language binding surfaces are not required for this -release preparation. Inventory actual consumers and verify that existing ones -still work. If a current consumer needs a new intent method, explicitly add its -whole producer/decoder/generated-contract/consumer path to a bounded milestone; -do not publish a half-supported binding or manually edit generated files. - -## Composed-design review - -**Applicability:** `applicable`; the intent module adds a public interface, -local desired-state persistence, and existing-transport adapters. - -1. **Independent concerns:** Core owns requirement matching and orchestration on - demand in the owning library; the existing download module owns byte transfer - and worker completion; the desired-state store owns declarations across - restarts; adapters own decoding/projection per request. Each changes for its - own policy, lifecycle, persistence, or transport reason. -2. **Interleavings:** Identity resolution must precede deduplicated admission; - durable declaration commit must precede ensure acknowledgement; readiness - follows verification/index publication. Transport sessions and runtime load - state must not enter those decisions. -3. **Required knowledge:** Callers know requirements, acquisition permission, - stable consumer identity for ensures, and typed outcomes. They do not know - search/download/import ordering. The composition root wires existing owners - and drains owned work; it does not become a resolver. Peer modules see - existing operational contracts and scoped state-change notifications. -4. **Change paths:** Changing artifact selection touches core matching/tests; - changing JSON framing touches its adapter/tests; changing download recovery - touches the existing download owner and intent integration evidence; changing - desired-state schema touches its store/migration and restart evidence. None - should force application orchestration changes. -5. **Dependencies:** Requirements and resolved identities carry stable values. - Download admission and reconciliation carry real lifecycle obligations, - which stay inside intent implementation. No raw DB rows, worker generations, - recovery-token choreography, or transport versions escape to intent callers. -6. **Independent evolution/failure:** Adapters can be tested/replaced without - changing core policy. Upstream failure produces a typed core outcome while - local resolution remains usable. Desired-state storage failure blocks ensure - acknowledgement without fabricating download success. -7. **Deletion tests:** Removing intent would push selection and acquisition - ordering back into callers. Removing the desired-state store would lose the - restart promise. Removing a local adapter would remove an actual local client - path. A new registry, command bus, generator, peer adapter, or fleet schema - has no current justification and is declined. -8. **Retained complexity:** One intent module plus local desired declarations - and thin local adapters. Necessary matching, concurrency, persistence, and - recovery complexity stays with its owner; existing downloader, index, - reconciliation, and public-error machinery are reused. - -Reassess composition if implementation requires callers to orchestrate retries, -import, recovery, or transport-dependent state transitions. - -## Milestones - -M1, M2a, M2, M3a, M3b, and M4 are `Accepted`. Full M3 is accepted within its recorded local evidence. Execute in dependency order. Write sets below are -allowed scopes, not permission for unrelated refactors; resolve new exact files -within those scopes when admitting a slice. Each milestone may update this -plan, its ledger, and issues. Changes outside a listed scope require an explicit -write-set update before editing. - -### M1 — Native local resolution - -**Status:** `Accepted` within the native Linux/file-artifact evidence below. - -**Goal:** An embedding application can resolve a structured requirement to an -existing verified artifact through `api.intent()`, with no network side effects. - -**Write set:** `rust/crates/pumas-core/src/intent/` (new), -`rust/crates/pumas-core/src/{lib.rs,api/mod.rs,api/models.rs,models/mod.rs}`, -`rust/crates/pumas-core/tests/intent_api_tests.rs` (new), -`rust/crates/pumas-core/examples/intent_model.rs` (new), -`rust/crates/pumas-core/src/model_library/{library.rs,package_facts/context.rs}`, -`rust/crates/pumas-core/README.md`. - -The internal library/context scope is admitted only for a read-only adapter to -existing package-facts freshness checks; it must not duplicate fingerprint -algorithms, reconcile, or write caches. README scope documents the actual native -contract in the same slice. - -Settle concrete signatures, reuse existing identity/facts producers, and deliver -query/get/status with `LocalOnly`. Keep unsupported acquisition unreachable or -explicitly unsupported until M2. No schema or transport changes in this slice. - -**Gate:** Native integration tests cover exact match, missing artifact, -ambiguous candidates, revision/format mismatch, invalid reference, incomplete -facts, and a filesystem change after indexing. Existing indexed `get_model` -retains its lookup semantics. Example consumes the real interface without -search/download/import choreography. Supporting Rust checks pass. - -**Re-plan if:** Existing identity or artifact evidence cannot represent a correct -local match without changing a published contract. - -### M2a — Immutable-revision acquisition prerequisite - -**Status:** `Accepted`; implementation and controlled Linux verification are in -the [M2a report](reports/immutable-revision-implementation.md). Production intent -acquisition and broader recovery/crash guarantees remain M2 work. - -**Depends on:** M1. - -**Goal:** Existing managed acquisition can retain one resolved immutable commit -through metadata, bytes, identity, import, and persisted resume. Preserve the -public operational `DownloadRequest` contract and its default-main behavior. - -**Write set:** `rust/crates/pumas-core/src/model_library/` files -`artifact_identity.rs`, `download_store.rs`, `importer.rs`, -`download_recovery.rs`, `hf/metadata.rs`, `hf/types.rs`, `hf/download.rs`, -`hf/lifecycle.rs`, `hf/bundles.rs`, `hf/mod.rs`, and -`rust/crates/pumas-core/src/api/hf.rs`. Tests belong with those owners initially; -README and this plan's records document the actual compatibility result. -`src/tests.rs` is admitted only for the persisted-record fixture constructor. -`model_library/mod.rs` is admitted for crate-private revision helper visibility. - -Use a crate-private validated revision context and pinned managed entrypoint. -Persist the commit through the existing store owner, with explicit v4-to-v5 -migration and old-reader refusal. Record the public `PersistedDownload` -constructor compatibility effect before changing that lower-level type. -Identity/destination must distinguish commits for every artifact selection -kind; changing a hash that the destination never uses is insufficient. -Ticket recovery must preserve the pin or explicitly refuse pinned recovery; -never reconstruct it as main. This does not authorize a recovery lifecycle -rewrite or claim full crash recovery. - -**Gate:** Controlled moving-main metadata/auxiliary/payload tests; equal-pin -coalescing and distinct-pin isolation; persisted resume/import identity; -malformed/pre-publication migration failure preservation, explicit uncertain -publication refusal, and downgrade refusal; existing default-main, -caller-drop, importer, and shutdown regressions. Exact evidence and source -findings are in [the prerequisite report](reports/acquisition-prerequisites.md). - -**Re-plan if:** Pinning requires changing public request/binding semantics, -replacing store authority, or expanding unresolved recovery lifecycle work. - -### M2 — Managed acquisition behind the intent interface - -**Status:** `Accepted` for the bounded native scope; see the [M2 report](reports/managed-intent-acquisition.md). - -**Depends on:** M2a and verified lifecycle prerequisites recorded in I2. - -**Goal:** An allowed upstream miss becomes one owned acquisition and eventually -a verified local handle, without caller-managed download/import steps. - -**Write set:** M1 scopes plus `rust/crates/pumas-core/src/api/{hf.rs,state.rs}`, -`rust/crates/pumas-core/src/model_library/hf/`, -`rust/crates/pumas-core/src/intent/acquisition_tests.rs` (new). -`rust/crates/pumas-core/examples/intent_acquire.rs` demonstrates native acquisition -and supplies a reproducible real-upstream verification path. -The source audit additionally admits `model_library/download_recovery.rs` only -for capability-bound byte verification, and `model_library/importer.rs` only -for canonical facts generation during pinned finalization before completion. -`model_library/mod.rs` is admitted only for crate-private observation visibility. -`api/mod.rs` is admitted only for a test-only native API fixture re-export. - -The existing transfer path trusts some recorded hashes and existing files. -Before exposing acquired availability, add owned pinned byte verification: -rehydrate exact admitted filenames from their immutable commit tree on each -execution/resume, verify available LFS SHA-256 and size through held filesystem -authority before promotion/import, and fail closed on missing evidence or -unavailable required metadata. Regular auxiliary files without hash evidence -remain explicitly unverified; do not fabricate cryptographic assurance. -Reuse existing persistence and task ownership; no new schema or recovery owner. - -Pending outcomes carry a pinned local requirement as stable correlation plus -optional operational progress. Query/status remain read-only; unresolved durable -custody must not be interpreted as absence or authorize another writer. Pinned -owned import produces canonical package facts before completion, so status can -observe availability without doing repair work. - -Resolve explicit upstream selectors to immutable revisions/artifacts, reuse -existing admission/import/verification, and expose pending/status outcomes. -Do not rewrite recovery/storage machinery under this milestone. If a required -fix falls outside this scope, coordinate it with its existing plan owner. - -**Gate:** Real core integration with an isolated controlled upstream exercises -miss → acquire → verify/index → available, concurrent same-target requests, -different revisions, requester disconnect/drop, gated/unavailable upstream, -failed integrity, resumed partial acquisition, and shutdown settlement. Prove -`LocalOnly` causes zero upstream requests. A representative real Hugging Face -acquisition validates the external path separately from fixtures. - -**Re-plan if:** Safe acquisition depends on unresolved recovery/import ownership -or the actual downloader cannot honor immutable revision selection. - -### M3a — Authoritative declaration-store prerequisite - -**Status:** `Accepted` for the private storage boundary; see the [M3a report](reports/m3a-declaration-store.md). - -M3 source inspection found cache-oriented SQLite settings, unversioned additive -schema initialization, cancellation-only runtime task shutdown, and unowned -filesystem deletion after index removal. These do not establish the durable -ensure contract. Split the authoritative persistence prerequisite from public -operation and lifecycle integration; M3a alone does not accept full M3. - -**Write set:** `rust/crates/pumas-core/src/index/model_index.rs`, a new -`index/model_index/intent_declarations.rs`, and its nested `intent_declarations/tests.rs`. -`intent/{resolver.rs,mod.rs}` are admitted only to share the existing quantization -normalization helper with canonical declaration encoding (no behavior change). -The core README documents this private migration and its compatibility boundary. -The [store design](reports/m3-store-design.md) records the admitted migration, -key, transaction, and downgrade contract before schema implementation. The -[lifecycle design](reports/m3-lifecycle-design.md) and [deletion inventory](reports/m3-deletion-inventory.md) -retain M3b integration obligations. Existing library/index ownership remains singular. - -**Goal:** A crate-private transactional declaration store retains normalized -consumer/declaration identity and immutable acquisition recipe independently of -indexed availability. Atomic retention and deletion-claim operations prevent -prospective deletion/ensure races at the persistence boundary. No public ensure, -release, scheduler, filesystem deletion rewrite, or transport is exposed here. - -**Gate:** Fresh/upgrade schema, failed migration preservation, future/malformed -schema refusal, idempotency and conflicting declarations, two-consumer retention, -release isolation, competing deletion claims/ensure transactions, reopen after -forced process exit around commit, and survival of index clearing. Precise Linux -process-crash limits and unsupported historical downgrade behavior are explicit. -This gate does not accept M3's filesystem/admission/reconciliation crash points. - -### M3b — Durable local desired state integration (M3 acceptance) - -**Depends on:** M2 and M3a. - -**Goal:** Ensure survives owner restart, restores a missing retained artifact, -and release removes only the relevant declaration. - -**Write set:** `rust/crates/pumas-core/src/intent/`, -`rust/crates/pumas-core/src/index/`, -`rust/crates/pumas-core/src/api/{state.rs,builder.rs,reconciliation.rs,runtime_tasks.rs,hf.rs,mod.rs,models.rs,links.rs,migration.rs}`, -`rust/crates/pumas-core/src/model_library/{mod.rs,library.rs,merge.rs,mutation_authority.rs,download_recovery.rs,partial_download.rs,importer.rs,library/migration.rs,hf/download.rs,hf/lifecycle.rs,hf/types.rs}`, -`rust/crates/pumas-core/tests/intent_desired_state_tests.rs` and -`rust/crates/pumas-core/tests/intent_desired_crash_tests.rs` (new), and -`rust/crates/pumas-core/src/lib.rs` for explicit owned shutdown. - -M3b admits the owner and deletion contracts in `reports/m3b-owner-contract.md` -and `reports/m3b-deletion-contract.md`: finite effects drain independently of -requesters; primary composition shares its existing download persistence even -when HF is disabled. Standalone libraries without configured mutation authority -refuse destructive operations; path-only destructive merge is consequently -unsupported until its source is explicitly composed. Deletion claims do not -expire or disappear on a failed partial operation. Pinned planning must compute -the actual canonical destination before binding and before artifact mutation. -Initial durable selectors are local references with LocalOnly and repositories -with AllowUpstream; other combinations return Unsupported. Retries reuse the -existing reconciliation coordinator and bounded backoff, never a new scheduler. - -Before migration implementation, record exact schema/store ownership, normalized -key semantics, transaction/admission ordering, deletion guard call sites, -shutdown wiring, retry limits, and downgrade behavior. Add only the persistence -and lifecycle hooks required for local declarations. - -**Gate:** Fresh/upgrade DB fixtures, failed migration preservation, duplicate -ensure, two-consumer retention/release, deletion conflict, unavailable upstream, -missing artifact reconciliation, orderly restart, and forced process exit at -commit/admission/publication points. Reopen real on-disk state and prove no -acknowledged declaration disappears, no duplicate artifact writer is admitted, -and no false available state is returned. Document supported filesystem/platform -evidence limits rather than generalizing a Linux-only result. - -Current retained-owner qualification separates those gates: process-exit -fixtures prove acknowledged SQLite persistence through read-only observations -and prove that the same registry refuses another primary. Public owner reopen -and ABA behavior use successful composed shutdown. Neither a surviving durable -declaration nor reaping the root process supplies a crash-recovery receipt; -automatic primary restart remains blocked pending qualified physical-store -lifetime ownership. The current boundary is recorded in -`reports/m3b-local-desired-state.md`. - -**Re-plan if:** A second library owner, destructive migration, independent task -scheduler, or remote identity becomes necessary. - -### M4 — Existing local transports and consumer evidence - -**Depends on:** M3b. - -**Goal:** Native and local process callers observe equivalent intent semantics. - -**Write set:** `rust/crates/pumas-core/src/ipc/`, -`rust/crates/pumas-core/tests/intent_ipc_tests.rs` (new), -`rust/crates/pumas-core/src/api/state.rs` for authenticated primary dispatch, -`rust/crates/pumas-core/src/api/reconciliation.rs` for expected root-contention deferral, -`rust/crates/pumas-rpc/src/{contract.rs,handlers/mod.rs,server.rs}`, -`rust/crates/pumas-rpc/src/handlers/intent.rs` (new), -`rust/crates/pumas-rpc/tests/intent_integration_tests.rs` (new), -`rust/crates/pumas-rpc/tests/integration_tests.rs` for persisted fixture compatibility, -`rust/crates/pumas-rpc/Cargo.toml` only for test dependencies if needed, -`rust/crates/pumas-core/examples/intent_local_client.rs` (new), -`rust/crates/pumas-core/README.md`, `rust/crates/pumas-rpc/README.md`, -`docs/ARCHITECTURE.md`, `docs/README.md`. - -Add receiver validation and explicit outcome projection together with each -registered operation. Inventory existing native/binding/desktop consumers; -retain their operational contracts. Document side effects, pending outcomes, -release semantics, upgrade requirements, and deferred capabilities. - -**Gate:** Real owner/client process evidence through both same-device IPC and -loopback JSON-RPC: resolve, pending acquisition, status, ensure, restart, release, -malformed/unsupported input, connection loss, and safe errors. Compare outcomes -with native fixtures. Existing RPC and operational API regression suites pass; -no network exposure or GUI/runtime dependency is introduced. Verify library-only -RPC build as well as the normal build. - -**Re-plan if:** An existing consumer must migrate, generated schemas must change, -or exposure/authentication policy would expand. Amend the precise consumer write -set and corresponding evidence before proceeding. - -## Objective acceptance claims - -Every claim below is blocking for this plan's acceptance. A1–A7 are satisfied within -the recorded native/local evidence and explicit compatibility limits. Implementation -evidence is recorded in the [ledger](execution-ledger.md). Static -checks support these claims but do not substitute for behavior evidence. - -| ID | Observable criterion | Kind | Environment | Mode | Status | -| --- | --- | --- | --- | --- | --- | -| A1 | Native requirement resolves a correct local artifact; misses, ambiguity, invalid/incomplete evidence remain distinct; local-only performs no upstream work | integration | simulated isolated library/files | automated | satisfied — M1 ledger | -| A2 | Allowed upstream acquisition reaches verified indexed availability with one artifact writer and owned cancellation/shutdown behavior | integration | simulated controlled upstream + real core persistence/workers | automated | satisfied — M2 report | -| A3 | A small real HF artifact can be acquired by requirement and resolved locally afterward | integration | required-real HF access, isolated root, sufficient disk | either | satisfied — M2 report | -| A4 | Committed local ensures survive restart/forced exit, repair missing availability safely, and release respects other consumers | system | representative processes and on-disk SQLite/filesystem | automated | satisfied — M3b report | -| A5 | Existing IPC and loopback JSON-RPC preserve native semantics and reject invalid inputs without leaking internals | contract + system | representative local owner/client processes | automated | satisfied — M4 report | -| A6 | Existing operational lookup/acquisition consumers retain documented behavior; native/RPC paths work without GUI or inference plugins | integration + contract | representative supported development host | automated | satisfied — M4 report | -| A7 | Public examples and final diff show callers only specify intent; no new node/fleet/networking or gateway implementation is introduced | contract/design review | not-applicable | manual | satisfied — M4 report | - -Use targeted Cargo suites named above plus affected formatting/lint checks, -then the existing relevant API/RPC regression suites. Build with -`cargo build --manifest-path rust/Cargo.toml -p pumas-rpc --no-default-features` -for the library-only check. Derive final feature/platform matrix from supported -build contracts; do not claim all platforms from one host. Real upstream access -is required for A3 and the M4 pending/disconnect process gates; unavailability -does not stop independent local work but prevents marking the whole plan accepted. - -## Coordination, blockers, and re-plan triggers - -M1 is accepted. Its evidence covers coherent existing local file targets, -including Safetensors and header-inspected GGUF, and explicit non-ready states. -It does not claim inference/tensor validation or that every existing package -layout supplies a coherent load target. I8 records the existing HF directory -layout inconsistency, which safely returns `Incomplete`. - -The existing -[current-standards remediation program](../current-standards-remediation-2026-09-03/plan.md) -retains authority over its in-progress download recovery/import lifecycle work. -It explicitly records incomplete recovery and hard-crash evidence. M2/M3 must -identify which guarantees they need and verify those checkpoints before relying -on them; this plan neither completes nor replaces that work. See [issues](issues.md). - -The immutable revision re-plan trigger was reached during source inspection. -M2a completed the bounded prerequisite. M2 has now verified native orchestration, -ordinary persisted resume, owned shutdown, verified indexed availability, and one -real upstream acquisition. Broader hard-crash recovery remains unaccepted in I2; -M3b established its bounded durable-state guarantees with the recorded process-exit evidence. - -No separate worktree or branch is required by this plan. Preserve unrelated -working-tree changes and coordinate serial edits to shared source/plan owners. - -Re-plan if identity semantics conflict with real consumers, safe acquisition or -persistence cannot meet the contract, the scope needs new remote capabilities, -or the release needs a smaller deliverable. A release cut may ship accepted -milestones, but must omit unavailable operations and explicitly defer remaining -milestones; never relabel lookup-only behavior as completed `ensure_model`. - -## Execution records and completion - -- [Execution ledger](execution-ledger.md) -- [Issues and dispositions](issues.md) -- Detailed evidence belongs in `reports/` when produced; no report is required - merely because that directory exists. -- No new ADR is created during planning. Accepted durable behavior will update - the existing architecture/core/RPC guides; create an ADR only for a decision - that needs a separate durable rationale. - -The user authorized implementation of this identified plan on 2026-09-12. -Their request to continue implementation starts the previously planned work; -M1, M2a, M2, M3a, M3b, and M4 are accepted; this local implementation plan is complete. The canonical plan path is -`docs/plans/local-intent-api-2026-09-12/plan.md`. Subsequent invocations use -`continue` while active. Final transport and consumer evidence is recorded in -[the M4 report](reports/m4-local-transports.md). diff --git a/docs/plans/local-intent-api-2026-09-12/reports/acquisition-prerequisites.md b/docs/plans/local-intent-api-2026-09-12/reports/acquisition-prerequisites.md deleted file mode 100644 index 4b970dc74..000000000 --- a/docs/plans/local-intent-api-2026-09-12/reports/acquisition-prerequisites.md +++ /dev/null @@ -1,200 +0,0 @@ -# Acquisition prerequisites audit - -Date: 2026-09-12. Source inspection only; no tests were run for this report. -Paths below are relative to `rust/crates/pumas-core/src/` unless qualified. - -## Recommendation - -Admit a bounded immutable-revision prerequisite before M2 orchestration. This -can extend the existing downloader and persistence owner without redesigning -their authority. Preserve current operational requests' default-`main` behavior; -require a resolved immutable commit for intent acquisition. Do not publish -`AllowUpstream` acquisition until its complete pinning path is verified. - -Incomplete recovery evidence does not establish that ordinary live acquisition -is unsafe and does not prevent this prerequisite work. It does prevent claiming -the full M2 recovery gate or M3 restart/crash guarantees. Keep those distinct -from the concrete revision defects below. M1 remains independently deliverable. - -## Concrete gaps in the current acquisition path - -| Concern | Source evidence | Required behavior | -| --- | --- | --- | -| Request and metadata | `model_library/types.rs:524` has no download revision. `model_library/hf/types.rs:309` does not decode a repository commit. `hf/metadata.rs:40,161` fetch unversioned metadata and `tree/main`. | Resolve a supplied branch/tag or default selector to a validated commit before admission; retain it throughout preflight. | -| Byte transfer | `hf/metadata.rs:286,349` and `hf/download.rs:3724` construct `resolve/main` URLs. | All auxiliary and payload reads, retries, and resume use the same commit. Revision-aware cache keys must prevent reuse of another revision's metadata. | -| Artifact identity and destination | `model_library/artifact_identity.rs:84,240` hardcode `main`. `:204–228` selects bare quant, GGUF filename, or `full_repo` for several artifact IDs; changing the digest alone does not distinguish them. `api/hf.rs:370` uses that artifact ID in the destination. | Pinned revision participates in both identity and managed destination for every selection kind; legacy default-main paths remain deliberate compatibility behavior. | -| Deduplication | `hf/lifecycle.rs:651` pending identity and `hf/download.rs:2793–2821` active dedupe use destination, repository, filenames, sizes, and hashes, without revision. | Equal pins may join; distinct pins cannot collapse, including when file evidence coincides. No intent-owned second downloader. | -| Durable execution | `model_library/download_store.rs:29–48` persists `DownloadRequest`; that request currently cannot preserve a pin. | Persist the resolved commit before acceptance. Cold resume must not resolve a moving branch again. | -| Imported evidence | `model_library/artifact_identity.rs:111` projects the selected identity's revision into `upstream_revision`. | Import and marker reconstruction retain the exact commit that supplied bytes. | - -## Proposed bounded write set - -Resolve exact helper placement before edits, using these concrete owners: - -- `src/model_library/types.rs`: request representation and reusable validation. -- `src/model_library/artifact_identity.rs`: pinned identity and destination naming. -- `src/model_library/hf/{metadata.rs,types.rs,download.rs,lifecycle.rs}`: - revision metadata, URLs/cache isolation, admitted execution, and dedupe. -- `src/model_library/hf/bundles.rs`: its tree lookup and `model_index.json` - preflight also use `main` (`:24,40`) and must use the same resolved revision. -- `src/api/hf.rs`: existing managed preflight and destination integration. -- `src/model_library/download_store.rs`: persisted execution validation and - explicit format/upgrade/downgrade handling through the existing store owner. -- Existing tests in those files; a controlled upstream fixture at the narrowest - existing test seam. Admit `hf/mod.rs` only if that fixture needs construction - wiring, rather than adding a production endpoint override for testing. -- If adding a field to public `DownloadRequest`, mechanical constructor updates - in `src/{api/builder.rs,model_library/importer.rs,tests.rs}` and in - `rust/crates/pumas-rpc/src/contract.rs`, - `rust/crates/pumas-uniffi/src/{bindings.rs,bindings/ffi_types.rs}`. These are - compatibility updates, not authority to expose a new binding operation. - -Importer production changes are needed only if inspection proves its existing -request-to-metadata path loses the new revision. Do not admit broad importer, -recovery, or storage rewrites under this slice. - -## Compatibility decision required before implementation - -Adding `revision: Option<_>` with a serde default preserves decoding of old JSON -requests, but it breaks Rust source compatibility for public struct literals. -Inventory and update in-repo constructors; record the external Rust compatibility -class. An internal resolved-download value is an alternative if preserving the -public struct is required, but must still carry its revision through durable -execution and importer evidence. - -Serde defaults alone are not safe downgrade handling. The current download -store strictly requires schema version 4 (`download_store.rs:1489–1514`), while -its nested public request does not reject unknown fields. An old reader can -ignore a newly added request revision and execute its old `main` behavior. -Select a versioned representation that makes unsupported pinned state fail -closed on old readers. A store schema increment with an explicit validated -upgrade is a candidate; record downgrade refusal and preserve original state -on migration failure. This changes the persistence contract, not its owner. - -Default-main operational requests must retain their documented behavior and -existing destination identity. Intent pinning must not infer that legacy -`upstream_revision = main` identifies an immutable commit. - -## Required evidence for the prerequisite - -1. Move `main` after resolution in a controlled upstream; metadata, auxiliary - files, payloads, retry, and reopened resume still request the original commit. -2. Equal pinned requests join one writer. Different pins with identical file - names/sizes/hashes remain distinct for GGUF, quant, full-repo, and file-group - identity paths. Unsupported or invalid revision input mutates nothing. -3. Persist/reopen pinned execution and prove import metadata records that commit. - Failed integrity cannot publish available state. Exercise absent or - contradictory commit evidence and upstream refusal. M2a accepts a validated - commit; production branch/tag/default-selector resolution and its failure - cases belong to M2. Moving-main fixtures may resolve their initial commit in - test setup before invoking the shared revision-aware acquisition entrypoint. -4. Validate current-store upgrade, failed migration preservation, and unsupported - downgrade refusal; retain a default-main request/store regression fixture. -5. Re-run affected owner tests and Rust consumers after constructor changes. - Existing examples include caller-drop tests (`hf/download.rs:7589,7660`), - real importer ordering and shutdown (`:10020,10276`), shutdown waiter custody - (`:13551,14714`), and byte-complete restore (`:16607`). - -The full intent integration and representative real HF acquisition remain M2 -gates after this prerequisite; the above tests do not replace them. - -## Recovery guarantees still outstanding - -`hf/download.rs:341–365` explicitly refuses active recovery custody, hidden -admissions, and unverified quarantine during restore. That is concrete -fail-closed behavior, not evidence of a duplicate writer. Automatic intent -reconciliation must observe that blocked state rather than retry admission as -if the old work did not exist. - -The existing remediation plan records production restore/lifecycle work open -and hard-process crash recovery unproved (`current-standards-remediation-2026-09-03/plan.md:18–27`). -It separately accepts awaited managed importer ownership within its Linux -checkpoint; `api/builder.rs:484–489` installs the actual importer. Revision -support neither closes nor invalidates those existing evidence boundaries. - -Before claiming M2/M3 complete, coordinate exact admission-outcome recovery, -persisted unresolved-custody reconciliation, resume/import ownership, shutdown -settlement, and forced-process-exit evidence with that existing owner. Do not -automatically repeat mutations whose durable outcomes remain uncertain. - -For M3 planning, the existing `ModelIndex` connection is a plausible declaration -owner (`index/model_index.rs:250,271–334`, WAL and `synchronous=NORMAL`). Actual -administrative deletion runs through `api/links.rs:83` and -`model_library/library.rs:2092`; both require explicit M3 write-set admission -for a retention guard serialized against ensure. No desired-state persistence -or deletion changes are part of this prerequisite slice. - -## Concrete design recommendation for M2a - -Preserve public `DownloadRequest` and add a crate-private execution revision -value, with distinct legacy-main and validated immutable-commit cases. Place -the value beside the existing artifact identity helpers, rather than creating -a new public identity system. Existing operational entrypoints delegate with -legacy-main. A crate-private managed pinned entrypoint accepts the existing -request plus a validated commit; intent will resolve the selector before -calling it. Branch/tag text must not reach worker URL construction as a pin. - -Use revision-aware private helpers behind existing metadata, bundle, download, -and artifact-identity methods. A resolved revision determines metadata/cache -lookups, every URL, artifact ID/destination, pending admission identity, state, -worker execution, markers, persisted snapshots, and restored execution. Do not -derive it later from display paths or patch metadata after import publication. - -The existing public callback payloads (`hf/types.rs:69,94`) and public -`InPlaceImportSpec` can remain unchanged. Add revision-aware crate-private -importer entrypoints; their public counterparts delegate with legacy-main. -Thread revision into the private `import_in_place_with_mode` and -`import_library_owned_diffusers_directory` helpers and their existing metadata -construction. Pass it separately from public notification payloads inside -`import_completed_download` and the Aux mutation. Notifications remain the -same operational contract; indexed metadata records the pinned truth before -availability is published. `model_library/importer.rs` is therefore an explicit -production write file for this recommended design. - -Persist execution revision with each snapshot, validating it everywhere the -store validates resumable, admission, quarantine, and revocation payloads. -Choose schema version 5 with an explicit v4-to-v5 upgrade through the existing -atomic store owner, mapping old records to legacy-main. Existing v4 binaries -then reject the new store instead of silently resuming pinned bytes from main. -Preserve all custody data; reject malformed upgrades without replacing the -original document. Adding a public `PersistedDownload` field still changes -Rust source compatibility for callers constructing that lower-level record; -record this separately. Avoid claiming that preserving `DownloadRequest` -preserves every public struct literal in the crate. - -Migration shares the store's existing atomic-publication outcome contract: -malformed input and failures proven before replacement preserve original bytes. -A failure after replacement can leave the complete v5 document visible with -uncertain durability. Return the failure, preserve observed custody, and do not -claim success or roll back guessed state. Fault-injection evidence must cover -both outcomes; original-byte preservation is not promised after publication. - -One additional boundary needs an explicit decision: ticket recovery's -`RecoverySnapshot`/`VerifiedDownloadRecovery` currently carries repository and -selected artifacts, but no revision (`model_library/download_recovery.rs:142–176,973–1061`). -It cannot recreate a pinned request safely by defaulting to main. Coordinate -that file with its remediation owner and either propagate the validated -revision through snapshot fingerprint, verified ticket, and recovered -admission, or explicitly refuse pinned ticket recovery until that propagation -is implemented. The latter is a bounded prerequisite limitation, not completed -M2 partial-recovery support. Native persisted resume must support the pin in -either case. Existing operational recovery must not overwrite a pinned -artifact through an unscoped default-main request. - -For this choice, the production write set is -`model_library/{artifact_identity.rs,download_store.rs,importer.rs,download_recovery.rs}`, -`model_library/hf/{metadata.rs,types.rs,download.rs,lifecycle.rs,bundles.rs}`, -and `api/hf.rs`, with `hf/mod.rs` for controlled metadata/byte test fixture -wiring if needed. Tests belong with these owner modules initially. Public -request constructors in RPC/UniFFI need no mechanical changes. Admission of -`download_recovery.rs` is narrowly for revision propagation or fail-closed -refusal, not the unresolved recovery lifecycle program. - -## Protocol verification during implementation - -Checked the official [Hugging Face Hub client source](https://raw.githubusercontent.com/huggingface/huggingface_hub/main/src/huggingface_hub/hf_api.py) -on 2026-09-12. Revision-specific model metadata uses -`/api/models/{repo_id}/revision/{revision}`; repository trees use -`/api/models/{repo_id}/tree/{revision}`. A query parameter on the unversioned -model endpoint is insufficient evidence of pinning. Controlled fixtures must -exercise these actual routes and reject absent or contradictory commit evidence. diff --git a/docs/plans/local-intent-api-2026-09-12/reports/immutable-revision-implementation.md b/docs/plans/local-intent-api-2026-09-12/reports/immutable-revision-implementation.md deleted file mode 100644 index 3d6852af0..000000000 --- a/docs/plans/local-intent-api-2026-09-12/reports/immutable-revision-implementation.md +++ /dev/null @@ -1,93 +0,0 @@ -# M2a immutable-revision implementation - -Status: M2a accepted within the evidence and limits below. -Date: 2026-09-12. - -## Selected contract - -M2a's private managed entrypoint accepts an already validated immutable commit. -Existing public operational methods use the same implementation with legacy -main behavior. Production resolution of branch/tag/default intent selectors, -`AllowUpstream`, and full intent acquisition remain M2 work. - -The private revision context travels through metadata, repository-tree cache -keys, bundles, auxiliary and payload reads, artifact destinations, admissions, -worker execution, import, and persisted resume. The public request and -notification payloads retain their existing fields. Notification data does not -replace the owned importer's revision context. - -## Durable compatibility - -The existing download store owns v5 publication and validated v4 upgrade under -its existing instance and operating-system locks. Every v4 snapshot maps to -legacy main, including snapshots retained under custody records. V5 requires -explicit null-or-commit revision data. V4 readers reject schema 5. - -`PersistedDownload` gains a public `revision: Option` field. External -Rust struct literals must initialize it; this is a source compatibility break -to that lower-level type. `DownloadRequest` and binding request constructors -retain their existing contract. - -Malformed source and failures proven before replacement preserve original -bytes. Post-replacement uncertainty can leave complete v5 visible; the owner -returns failure and preserves observed state without automatic rollback. - -## Recovery boundary - -Ticket recovery cannot represent a pin and refuses non-main upstream revisions. -Destination checks read both metadata and download markers through existing -held filesystem authority, preventing legacy recovery from overwriting pinned -artifacts. Native persisted resume retains its pin. This does not establish -the separately deferred recovery lifecycle/crash acceptance gates. - -## Verification - -Built the library unit-test executable with -`cargo test --offline --manifest-path rust/Cargo.toml -p pumas-library --lib --no-run`, -then ran the following owner filters against that executable. HF/API fixtures -require loopback sockets and were run outside the socket-restricted sandbox. - -| Owner filter | Result | -| --- | --- | -| `model_library::download_store::tests` | 61 passed; 2 subprocess helper entries ignored by the normal harness | -| `model_library::importer::tests` | 24 passed | -| `model_library::download_recovery::tests` | 30 passed; 1 subprocess helper entry ignored by the normal harness | -| `model_library::hf::` | 221 passed on the final run | -| `api::hf::` | 19 passed | -| `model_library::artifact_identity::` | 10 passed | - -The new evidence includes strict commit validation, stable identity before and -after implicit file expansion, equal-pin joining, distinct-pin admissions with -identical file evidence, absent/mismatched upstream SHA refusal before admission, -moving-main metadata/tree isolation, pinned bundle preflight, and auxiliary and -payload transfer through retry, persisted reopen, ranged resume, and real import. -The worker fixture uses the payload's actual SHA-256. Its failed transfer leaves -an error with partial bytes and a marker; it does not publish a final payload. -This proves the exercised transfer checks, not a new general hash-verification -or tensor-integrity contract. - -Migration tests reopen valid records produced by real admissions, quarantines, -revocations, and interrupted confirmation. They prove custody preservation, -malformed-input refusal, explicit revision requirements, pre-publication failure -preservation, and uncertain post-publication failure without rollback. Downgrade -refusal follows the original v4 reader's strict schema-version check against the -verified v5 output; an old binary was not executed. - -Additional Cargo verification: - -- `cargo test --offline --manifest-path rust/Cargo.toml -p pumas-library --test intent_api_tests`: 9 passed. -- `cargo test --offline --manifest-path rust/Cargo.toml -p pumas-library --test api_tests -- --skip runtime --skip launch_llama_cpp`: 30 passed, 6 filtered. -- `cargo clippy --offline --manifest-path rust/Cargo.toml -p pumas-library --lib --tests --example intent_model -- -D warnings`: passed. -- `cargo check --offline --manifest-path rust/Cargo.toml -p pumas-rpc -p pumas-uniffi`: passed. - -Six existing runtime-profile API cases remain excluded for the previously -documented baseline failures (I7). Initial HF socket failures were environmental; -the outside-sandbox run exercised those fixtures successfully. Six old lifecycle -fixtures required valid JSON markers or fault injection after admission to keep -testing their original admitted-error behavior under the new preflight guard. -Production provenance refusal was not weakened. One uppercase commit fixture -was corrected from 42 to 40 characters. - -Evidence is Linux/native with controlled local upstream fixtures. Production -branch/tag resolution, external HF acquisition, verified intent availability, -desired-state persistence, and the broader recovery/crash gates remain pending. diff --git a/docs/plans/local-intent-api-2026-09-12/reports/m3-deletion-inventory.md b/docs/plans/local-intent-api-2026-09-12/reports/m3-deletion-inventory.md deleted file mode 100644 index da6bf643f..000000000 --- a/docs/plans/local-intent-api-2026-09-12/reports/m3-deletion-inventory.md +++ /dev/null @@ -1,29 +0,0 @@ -# M3 deletion and relocation integration inventory - -Status: source findings for M3b; no deletion behavior changed in M3a. - -The private M3a claim transaction is a persistence primitive. It does not protect -filesystem effects until these existing operations cooperate with it: - -| Existing path | Required M3b behavior | -| --- | --- | -| `ModelLibrary::delete_model`, `model_library/library.rs` | Claim the model before index/link/file removal; reject retained targets; retain the exact claim through owned completion or fail-closed recovery. | -| `PumasApi::delete_model_with_cascade`, `api/links.rs`, and dispatch in `api/state.rs` | Delegate to the same guarded library operation; do not introduce a separate API-only check. | -| `ModelLibrary::cleanup_duplicate_repo_entries` | Guard removal and partial-payload merging of retained source/target identities; a retained duplicate is not permission to delete its declaration or substitute another model ID. | -| `ModelLibrary::reclassify_model` | Its directory rename changes model ID before deleting the old index row. Require retention-aware relocation semantics or a typed conflict before moving retained targets. | -| `LibraryMerger::merge_single_model` and source cleanup, `model_library/merge.rs` | Moving payloads/removing source directories must respect the source library's declarations and claims; merely guarding destination import is insufficient. This file needs a narrow M3b write-set amendment before edits. | -| `ModelIndex::delete`, `clear`, startup stale-row removal and FTS rebuild | These are projection operations. Declarations and deletion claims must survive them; an absent projection row does not prove no retention or no deletion custody. | - -A guard implemented only as a retention SELECT followed by asynchronous file -removal races with a concurrent ensure. An in-memory lock released when a caller -future is dropped also cannot prove that spawned filesystem effects have stopped. -The durable claim must be acquired atomically against target retention and -settled by the existing operation owner only after all effects are observed. -Claims must not expire automatically after a crash. - -Before public ensures are enabled, M3b must test actual deletion/reclassification -and cancellation races, rather than inferring filesystem exclusion from M3a's -SQLite transaction race tests. The claim also must compose with the existing -managed download destination authority: it is not a replacement for its writer -reservation or recovery validation. Unsupported historical downgrades cannot be -made safe merely by a schema marker ignored by old binaries. diff --git a/docs/plans/local-intent-api-2026-09-12/reports/m3-lifecycle-design.md b/docs/plans/local-intent-api-2026-09-12/reports/m3-lifecycle-design.md deleted file mode 100644 index 94aa48879..000000000 --- a/docs/plans/local-intent-api-2026-09-12/reports/m3-lifecycle-design.md +++ /dev/null @@ -1,78 +0,0 @@ -# M3 lifecycle integration proposal - -Status: proposed, not accepted. Parent proposes implementing only M3a, the crate-private authoritative SQLite store prerequisite; public ensure/release and background reconciliation remain M3b and are not authorized by completion of that prerequisite. Read-only source inspection on 2026-09-12; no production edits or Cargo execution. This report addresses lifecycle integration; the parent review owns exact index schema, migration/downgrade behavior, and deletion guard inventory. - -## Existing owners and constraints - -- `src/api/reconciliation.rs:396–496` already schedules single-flight scoped work through `PrimaryState.runtime_tasks`. `start_owned_reconciliation` retains its run token after requester cancellation and awaits `run_scope`. Extend this path rather than adding a declaration scheduler. `notify_filesystem_changes` (approximately line 587) supplies missing-file events; builder marks all scopes dirty at startup. -- `ReconciliationCoordinator::should_run` is event-driven: after success a scope runs again only when dirty. Its cooldown fields do not currently establish periodic retry. Dirty events during an active run survive, but an in-flight trigger does not itself arrange another run. Consequently a missing event concurrent with a pass needs a bounded follow-up in the same existing runner, or an explicitly retained dirty state for the next trigger. -- `src/api/runtime_tasks.rs:26–42` spawns tasks and aborts them on shutdown; it has no closed-admission flag or asynchronous drain. `PumasApi::drop` in `src/lib.rs:289` calls this abort-only shutdown. Do not claim these are durable effect-drain guarantees. Awaited `spawn_blocking` can outlive an aborted wrapper. -- HF `run_download_invocation`, managed pinned admission, task generations, destination reservations, and `shutdown_downloads` already own acquisition. Reuse them. Startup calls real `restore_persisted_downloads` before constructing primary state; ordinary queue inventory is reconciled under its existing owner before restoration. Unresolved admission/recovery custody remains an error, not absence. -- `intent/acquisition.rs::acquire_upstream` currently combines immutable revision/tree selection with managed admission. Its public pending requirement uses a local model reference. That reference alone cannot repair a missing package: acquisition rejects `LocalModel` selectors. M3 needs an immutable upstream acquisition recipe stored alongside declaration identity. - -## Declaration and acquisition ordering - -Use a durable declaration identified by consumer identity plus the canonical original requirement, with an opaque declaration ID for release. Preserve case-sensitive repository/path/consumer identities; normalize only semantics already normalized by requirement validation. The index owner must define exact canonical encoding and uniqueness. Different consumers retain independently. A duplicate ensure returns the same declaration and must not replace an already pinned recipe because a branch moved. - -Persist both the original requirement and, once known, an immutable acquisition recipe containing repository ID, full commit, canonical artifact selector/request, selected artifact ID, and target local identity. Do not store a local handle, availability claim, or download status as authority. A declaration may remain unresolved when upstream is unavailable; ensure can acknowledge that durable desired state with an unavailable observation. - -Recommended sequence: - -1. Validate requirement and consumer before mutation. Register an owned declaration operation; under the declaration/index mutation gate, insert-or-read the unique declaration in one durable transaction. Acknowledge retention only after observing successful commit. Requester disappearance does not erase the row. -2. Resolve local availability using the existing read-only resolver. For upstream-capable unresolved declarations, prepare revision/tree/artifact through the existing HF invocation owner. Split the current acquisition helper into private preparation and managed admission, without changing public get behavior. -3. Under the same declaration mutation gate, re-read the declaration and atomically install the immutable recipe only if its generation remains live and unbound. A competing ensure uses the committed winner. Release during upstream preparation prevents installation and subsequent admission. -4. After recipe commit, admit the exact pinned request through `start_hf_download_owned_at_revision`. Keep the declaration gate across the admission decision/handoff so release cannot complete and then be followed by a stale new admission. Never hold a SQLite transaction across network or filesystem admission. Download identity/custody remains exclusively in the existing download store. -5. Persisted recipe plus the live declaration is enough to repeat after a crash before admission. A crash after admission but before response must join/recover the existing durable download; never infer absence from an empty live snapshot or a swallowed store error. Existing strict admission performs the final check. -6. Release deletes only that consumer's declaration transactionally and idempotently. It does not delete files or cancel an admitted shared download. Other consumers retain their declarations. Once release returns, a stale declaration pass must not admit fresh work for the deleted generation. - -A locally selected artifact with no verified upstream provenance can be retained against deletion, but external disappearance has no invented repair source. Return Missing/Incomplete as appropriate. `LocalOnly` declarations never resolve upstream, including on startup and watcher events. - -## Reconciliation and bounded retry - -Add a desired-state phase to the existing scoped run after catalog reconciliation. For `Model(id)`, select declarations bound to that identity; unresolved declarations are considered on all-scope startup or explicit ensure. Deduplicate recipes within one pass and invoke the same acquisition service as get. Do not call broad operational reconciliation from intent query/status; these stay read-only. - -Startup should load declarations after database migration and ordinary download restoration, then schedule one all-scope desired pass through the existing coordinator. An unavailable upstream must leave declaration rows intact and permit startup. An unresolved download-authority failure still prevents unsafe admission; preserve the existing restore behavior rather than treating it as successful empty recovery. - -Each declaration gets at most one resolution/admission attempt per pass. A pass must not automatically resume a paused, failed-integrity, or custody-blocked download: these states are observed and retained. The existing downloader owns transfer retries (`hf/download.rs::run_download` uses `NetworkConfig::hf_download_max_retries` and `hf_download_max_retry_elapsed`). Do not add an independent retry loop or reset its budget on every watcher event. - -Use persisted `next_attempt_at` and consecutive transient-failure count for unresolved upstream preparation if repeated events would otherwise bypass throttling. Proposed bounded backoff is 30 seconds, 2 minutes, then 10 minutes, capped at 10 minutes; eligibility is checked only on existing triggers (startup, explicit ensure, relevant watcher event). This is event-driven retry, not a promise of timed autonomous recovery. Successful preparation clears preparation backoff; invalid requirements/integrity/custody failures do not automatically retry. Parent must settle whether explicit ensure bypasses backoff; recommend no bypass for duplicate ensures. If automatic wall-clock retry is required, explicitly amend the existing coordinator rather than silently adding detached sleeps/tasks. - -## Durable deletion claims (required correction to the gate) - -`ModelLibrary::delete_model` (`src/model_library/library.rs:2092`) deletes the index row before awaited symlink and directory removal. An in-memory mutex released when the requester disappears cannot exclude late filesystem effects. A declaration commit between index deletion and directory removal would otherwise acknowledge retained bytes that are about to disappear. - -M3a must expose a transactional deletion-claim API: acquire a unique claim for the model/target only if there are no retaining declarations; reject ensure/bind while the claim exists; settle only the matching claim token after all destructive effects are observed. Persist the claim before any removal. A crash or uncertain cancellation leaves it blocking, never implicitly clear it because the model row vanished. The claim cannot cascade away when the catalog row is removed. Startup reconciliation of such claims belongs to M3b's owned deletion protocol, not a schema-open repair that guesses effects completed. Guard all destructive paths using the same authority, including cleanup/reclassification destinations found by the parent audit. - -The claim is durable authority, while any in-memory gate merely serializes live handoffs. Recipe installation must check both declaration generation and destination deletion claim in the transaction. Claim release requires an exact token; a stale cleanup task cannot release a newer claim. Store-only M3a tests establish these transaction contracts, not safe filesystem deletion. - -## Shutdown checkpoint and minimal additional seam - -Do not make durable declaration work depend on a cancellable RuntimeTasks wrapper. Preferred prerequisite: extend the existing runtime owner with closed admission and an awaitable drain for newly tracked declaration/reconciliation work, retaining any blocking database effect until its result is observed. This changes an existing owner, not the scheduler or library ownership model. Orderly intent shutdown closes declaration admission/triggers, drains in-flight commit/pin/admission handoffs, then drains HF downloads. Drop remains best effort and must not be described as orderly shutdown. - -This requires explicit write-set admission for `api/runtime_tasks.rs` and the selected public shutdown integration (`lib.rs` or `api/hf.rs`), which M3's current list omits. Alternative: use the existing HF invocation owner for every declaration effect, but it must also work when HF is not configured; introducing a hidden HF client solely for local database ownership is not recommended. This is a concrete ownership prerequisite, not evidence that current acknowledged SQLite rows are lost. - -## Evidence gates and crash points - -Run real child processes with fresh SQLite and download-store owners. Terminate at (a) before declaration commit, (b) after commit before acknowledgement, (c) after acknowledgement before preparation, (d) after immutable recipe commit before admission, (e) after durable download admission before publication, and (f) during release commit. Reopen and assert acknowledged declarations survive, released declarations do not reappear, a recipe never follows a moved branch, unresolved custody blocks duplicate admission, and availability is recomputed from current package facts/files. - -Include requester drop during commit and pin preparation, two consumers releasing independently, release racing admission, missing-file watcher while reconciliation is already running, startup with unavailable upstream, and shutdown while database/pin/admission effects are held. Acknowledgement-before-exit needs parent/child synchronization, not sleeps. Test malformed/incompatible stores separately from valid empty stores. Existing M2 fresh-owner resume evidence is useful but does not replace these inter-store crash gates. - -Linux process-exit tests prove only the tested SQLite/filesystem configuration. Record journal/synchronous settings and platform behavior from the index review. They do not prove power-loss durability or all-platform recovery. No migration, broader recovery contract, or M3 acceptance is asserted by this proposal. - -## Suggested implementation split - -- Index owner: declaration schema, canonical key, transactional insert/bind/release, generation check, retention queries, migration/downgrade fixtures. -- Intent owner: public ensure/release result types, validation, prepare/persist/admit composition, immutable recipe conversion, no-write status projection. -- Lifecycle owner: `api/{state,builder,reconciliation}.rs`, the admitted runtime-owner drain seam, startup/watcher triggers, bounded preparation eligibility, shutdown ordering. -- Parent/library owner: all destructive deletion and duplicate cleanup guards sharing the retention transaction/gate; release never delegates to deletion. -- Process-test owner: `tests/intent_desired_state_tests.rs` and necessary test-only crash hooks at the exact commit/admission/publication points. - -Before implementation, settle the exact mutation gate shared with deletion, runtime shutdown write-set amendment, retry contract, and immutable recipe serialization. These are decisions required by the plan; no second downloader, library owner, remote identity, or independent scheduler is proposed. - -## M3a boundary and follow-up - -Repository owner inventory finds no general core task owner beyond `api/runtime_tasks.rs`; HF lifecycle is download-specific and `runtime_profiles/process_owner.rs` owns runtime processes. Do not instantiate another HF client or borrow runtime-process ownership for local declaration effects. Extend the existing runtime task owner in M3b with closed admission, retained completion/result observation, and an awaitable drain. The existing reconciliation coordinator continues to decide scheduling; this owner extension only controls effect lifetime. It must retain blocking transaction/deletion joins through requester cancellation and shutdown, with errors observable by the owner even when the caller is gone. - -M3a implements only crate-private schema/store APIs for declarations, immutable recipe CAS, retention queries, and durable deletion claims. It adds no public ensure, background loop, or claim auto-clear. A later M3b must wire the effect owner, claim-aware deletion, startup reconciliation, and public operations before claiming retained-artifact behavior. Forced-process tests for M3a can prove committed store rows/claims survive reopening, but do not satisfy M3's cross-store admission/publication or repair gates. - -M3b follow-up: see [the owner contract](m3b-owner-contract.md) and [deletion inventory](m3-deletion-inventory.md). The latter requires an explicit `model_library/merge.rs` write-set amendment before public ensure can rely on all destructive-path guards. diff --git a/docs/plans/local-intent-api-2026-09-12/reports/m3-store-design.md b/docs/plans/local-intent-api-2026-09-12/reports/m3-store-design.md deleted file mode 100644 index 773c005df..000000000 --- a/docs/plans/local-intent-api-2026-09-12/reports/m3-store-design.md +++ /dev/null @@ -1,137 +0,0 @@ -# M3 authoritative declaration store: proposed design - -Status: **implementation admitted for M3a; acceptance pending**, 2026-09-12. Read-only source inspection; no schema or implementation changes and no test execution. This document proposes an M3a store prerequisite followed by M3b public ensure/reconciliation/deletion integration. Neither slice is accepted by this report. - -## Existing authority and hazards - -Use the existing `ModelIndex` connection in `shared-resources/models/models.db`; do not create a second authoritative database or derive declarations from files/download rows. - -- `index/model_index.rs:257–283`: opening configures the connection, runs schema helpers, then initializes FTS. There is no global schema-version gate today. -- `:312–331`: writers use WAL and `synchronous=NORMAL`; readers use query-only connections. `Arc>` serializes clones of one index but does not serialize a different connection/process. -- `:334–376` and `model_index/governance.rs`: initialization is multiple DDL/seeding operations, including unrelated schema migrations. It is not one authoritative intent migration transaction. -- `model_library/library.rs:224–235`: an index-open failure already propagates; do not replace this with delete/recreate recovery. -- `library.rs:1006,1126`: startup rebuild removes missing projected model rows. `:1295–1318` deep rebuild calls `ModelIndex::clear`; `model_index.rs:1071` clears models/FTS. Declarations must survive both. -- `library.rs:2092–2126`: administrative deletion removes the index row before asynchronous link/file deletion. A transaction that merely checks retention before deleting the row is insufficient: a new ensure could commit during the later filesystem deletion. - -## M3a write scope and boundary - -Add a private `index/model_index/intent_declarations.rs` module with only necessary crate-private visibility from `model_index.rs`. Integrate schema guards and durability settings in `model_index.rs`. Tests belong in the private module and exercise real on-disk connections. Existing index/catalog behavior must remain unchanged in M3a except refusing incompatible/corrupt intent schemas and strengthening writer commit durability. - -M3a exposes no public `ensure_model`, does not start reconciliation, and does not wire a partial retention guard into existing deletion paths. Its methods establish the atomic store operations required by M3b. Keep M3a records crate-private until domain input/output semantics are integrated. - -## Schema and compatibility version - -Use a component schema version, initially `1`, separate from model/package-facts contract versions: - -```sql -CREATE TABLE intent_schema_meta ( - singleton INTEGER PRIMARY KEY CHECK (singleton = 1), - schema_version INTEGER NOT NULL CHECK (schema_version > 0) -); -CREATE TABLE intent_declarations ( - declaration_id TEXT PRIMARY KEY, - consumer_key TEXT NOT NULL, - original_requirement_json TEXT NOT NULL CHECK (json_valid(original_requirement_json)), - generation TEXT NOT NULL, - model_id TEXT, - bound_target_json TEXT CHECK (bound_target_json IS NULL OR json_valid(bound_target_json)), - created_at TEXT NOT NULL, - updated_at TEXT NOT NULL -); -CREATE INDEX idx_intent_declarations_model ON intent_declarations(model_id); -CREATE INDEX idx_intent_declarations_consumer ON intent_declarations(consumer_key); -CREATE TABLE intent_deletion_claims ( - model_id TEXT PRIMARY KEY, - claim_token TEXT NOT NULL UNIQUE, - created_at TEXT NOT NULL -); -``` - -There is deliberately **no foreign key to `models`**, and no cascade from model records, package facts, or download state. A declaration is authoritative even while its artifact/index row is absent. `model_id` identifies the managed target for retention; it is not proof that the artifact exists. Validate row bounds and canonical values in Rust on every read/write, in addition to SQL constraints. Do not persist transient download progress or a cached Available assertion here. - -A marker absent with all three tables absent means legacy version 0. Any partial combination, missing/wrong singleton, unsupported version, wrong required columns/keys/indexes, malformed requirement, or noncanonical derived key is a startup error. Do not silently repair authoritative schemas with independent `CREATE TABLE IF NOT EXISTS` statements. Existing declarations with unsupported contract data must remain on disk and cause a bounded failure, not be skipped during enumeration. - -Read-only opens check the same supported-version/data boundary without creating tables. Legacy version 0 is readable as having no declarations. New writer opens reject future intent versions before unrelated schema initialization; perform this inspection immediately after opening the connection and before write-oriented PRAGMAs/DDL where feasible. - -## Upgrade and durability protocol - -1. Open the connection; inspect the component marker/table combination and refuse malformed or future state. -2. Set WAL, busy timeout, foreign keys, and **`synchronous=FULL` before any acknowledged declaration/claim transaction**. Use FULL on the writer connection rather than temporarily toggling it around individual commits. -3. Perform the additive 0-to-1 intent schema installation, all indexes, and marker insertion in one `BEGIN IMMEDIATE` transaction. On a legacy database initialize existing ordinary schema first if necessary, but do not intermingle its unrelated migration batches inside the new intent migration. Validate the new intent schema before committing. -4. On any statement/validation failure roll back the transaction. Preserve the pre-existing logical schema/rows; never remove or reconstruct `models.db`, WAL, SHM, or declaration tables. -5. On ambiguous commit/I/O error return failure and reopen/read authoritative state before retry. Do not treat an error as proof that commit was absent and do not roll back by overwriting files. The idempotency keys below make readback/retry safe. - -SQLite transaction rollback is the primary preservation mechanism; M3a performs no destructive migration. No automatic side backup/replacement algorithm is proposed. If a separate pre-upgrade backup is added, it must be a consistent SQLite snapshot including WAL state, not a copy of the main `.db` file. Future destructive migrations require a separately reviewed backup/recovery protocol. - -FULL strengthens the intended acknowledged-commit durability boundary on supported SQLite/filesystem combinations. Process-crash tests prove process restart behavior; they do not prove arbitrary device/controller power-loss behavior. - -## Exact M3a key and payload contract - -`consumer_key` is a caller-supplied stable, case-sensitive identifier, 1–128 ASCII bytes, restricted to letters, digits, `.`, `_`, `:`, and `-`, starting with a letter or digit. Reject surrounding whitespace, empty keys, controls, and path separators rather than silently aliasing callers. - -`declaration_id` is lowercase SHA-256 of the bytes `pumas-intent-declaration-v1\0`, followed by the big-endian u64 length and UTF-8 bytes of consumer_key, followed by the big-endian u64 length and UTF-8 bytes of the canonical original requirement. It is deterministic, not a random task ID. This makes equal requirements from the same consumer idempotent and distinguishes consumers and meaningfully different requirements. On a key hit compare the canonical stored payload/consumer too; a conflicting collision is an error, never an overwrite. - -Normalize a validated `ModelRequirement` in one private helper before fixed-field-order serialization. Preserve the original upstream selector (including a moving branch/default) in that original value; its immutable binding is stored separately. Reuse the existing M1 quantization normalization through a crate-private helper re-export; M1 matching semantics remain unchanged. Canonicalize known equivalences consistently with the intent domain: absent optional fields use one representation, commit hex is lowercase, and domain-normalized quantization labels are consistent. Reject unsupported/invalid semantics; preserve selected-artifact-path constraints exactly under existing M1 validation, including absolute observed paths. Such a constraint is never a managed replay destination; model_id remains the relative managed identity. Do not accept unchecked caller-supplied declaration IDs or arbitrary JSON. - -`generation` is a freshly generated UUID on insertion/re-ensure only and remains unchanged on first binding. Binding is immutable-once, so retaining the creation generation permits idempotent bind retries while its compare-and-swap still rejects stale work. An exact duplicate operation returns the existing generation unchanged. Release followed by re-ensure receives a new UUID even though declaration_id is identical; stale work from the removed declaration cannot bind or release the new row. Numeric generation counters resetting to 1 would create an ABA race. - -Private Rust values, agreed with the parent for Sol implementation: - -- `IntentDeclarationRecord`: declaration ID, consumer key, normalized original requirement, UUID generation, optional typed bound target, timestamps. Its model_id projection must equal the bound target's model reference ID; unbound targets have null model_id. -- `BoundTarget::Local { model_ref: PumasModelRef }`. -- `BoundTarget::Upstream { model_ref: PumasModelRef, repository_id: String, commit: String, filename: String, format: PackageArtifactKind }`. - -`bound_target_json` is only serde encoding of that private typed enum, with explicit discriminants and unknown-field rejection. No arbitrary JSON recipe and no duplicated mutable `DownloadRequest` structure is stored. Upstream replay is limited to the current single-file formats supported by M2 (GGUF, bare Safetensors, ONNX); later package/bundle support needs its own schema/contract decision. - -Validate a bound target against the original requirement before writes and again on reads. For Upstream require a validated repository, lowercase full 40-character commit, one portable relative filename, supported matching format, and an existing valid model reference containing that same revision and a selected artifact ID. Reconstruct the minimal existing `DownloadRequest` exactly as current M2 does: repository owner/name for family/name, model_type `llm` for GGUF, exact filename, no request quant or file group. Recompute `SelectedArtifactIdentity::from_download_request_at_revision` with that filename and require exact selected-artifact equality. Preserve original format/quantization constraints in original_requirement_json; binding is not a claim that uninspected bytes have a verified quantization. Explicit original repository/immutable revision/artifact constraints cannot be changed by binding. Symbolic/default original selectors may bind to a validated resolved immutable commit once. - -The local model ID cannot currently be purely recomputed without upstream metadata-derived destination family/model type. M3b must supply a validated managed target reference from its planning owner before binding; M3a validates its identity shape/coherence but cannot claim it proves the exact future destination. This is an explicit M3b integration gate, not permission to accept arbitrary filesystem destinations. - -A local-only declaration receives `BoundTarget::Local` directly from its original local reference at commit and immediately retains that model ID, even if the artifact is absent or the optional selected-artifact ID is unspecified. Its purpose is model retention; it does not imply availability. Do not silently upgrade a local-only target into upstream acquisition. M3b separately proves which original policies/selectors support public ensures. - -M3a accepts only `LocalModel` with `LocalOnly`, and `UpstreamRepository` with -`AllowUpstream`. Other combinations fail validation before mutation. In -particular, repository-based local-only retention needs a verified local -provenance binding that this private codec does not yet express; M3b must settle -that contract before exposing public ensure coverage for it. A binding never -implicitly grants upstream permission. - -An unresolved upstream declaration has null target/model_id and no physical retention claim yet. It is durable intent to resolve, not an admitted acquisition. A deletion claim on an unknown eventual target therefore need not reject the unresolved commit; the atomic later bind must reject it before any acquisition. Only bound targets count toward retention. M3b must determine whether public ensure acknowledges unbound resolution or only pinned acceptance; M3a exposes no public acknowledgement contract. - -Strictly decode the typed target and validate all null combinations, identity consistency, canonical keys, and UUIDs during inventory. Unsupported replay versions or malformed durable rows fail closed; never reconstruct a missing commit as main. - -## Exact crate-private store operations - -Every store operation revalidates the component marker and authoritative row contract; only `ModelIndex::new` may install the schema. Every mutation locks the existing connection and uses `BEGIN IMMEDIATE`; never hold a SQLite transaction or the connection mutex across `.await`, HTTP, callbacks, or filesystem deletion. SQL transactions serialize retention decisions across cooperating connections. - -- `commit_intent_declaration(consumer_key, original_requirement) -> IntentDeclarationRecord`: validate/canonicalize/derive ID before SQL. Return an exact existing row unchanged; never resolve its moving selector again. Otherwise insert a fresh UUID generation and original payload. For an original local selector derive BoundTarget::Local and model_id, atomically rejecting an existing deletion claim for it. The upstream-unbound insert performs no download or target mutation. -- `bind_intent_declaration(declaration_id, consumer_key, expected_generation, bound_target) -> IntentDeclarationRecord`: validate input before SQL; inside the transaction require a live row belonging to the consumer with the exact UUID generation. Reject a deletion claim on the bound model ID. If already bound to identical data return unchanged; reject an attempted repin rather than silently replacing it. Otherwise bind the typed target and model_id atomically, retaining the declaration creation generation. Missing/deleted/stale rows are conflicts, never recreated by a stale worker. -- `release_intent_declaration(declaration_id, consumer_key, expected_generation) -> ReleaseResult`: exact consumer/declaration scope. Missing is idempotently AlreadyAbsent; a different current generation conflicts. Delete and commit before acknowledging. No file deletion, cancellation, runtime operation, or cascading release. -- `get_intent_declaration(...)`, `list_intent_declarations(...)`, `list_intent_declarations_for_model(model_id)`: strict decoding and stable ordering; no per-row error suppression. Bounded public pagination may be added with M3b projection. -- `claim_intent_model_deletion(model_id, claim_token) -> ClaimResult`: validate opaque UUID token. In one transaction reject if any declaration retains model_id, otherwise insert the claim. Repeating the same model/token is idempotent; a different existing token conflicts. A claim for a model absent from `models` is still valid and blocks future commit/bind. -- `release_intent_model_deletion(model_id, claim_token) -> bool`: delete only the exact model/token. A mismatched token cannot clear another task's claim. Missing is idempotent. M3b may invoke successful removal only after owned filesystem settlement. -- `list_intent_model_deletion_claims()`: strict restart inventory. No TTL, automatic expiry, PID liveness heuristic, or unconditional startup clearing. - -M3a may use narrowly scoped, documented `allow(dead_code)` for these staged private methods pending M3b composition. Do not create public runtime operations merely to suppress warnings. A release removes future desired maintenance; M3b rechecks declaration existence/generation before admission, while admitted shared work remains owned to settlement. - -## M3b deletion and downgrade integration obligations - -Before exposing ensures, every destructive model path must acquire a durable deletion claim, and every declaration commit must reject that claim in the same database authority. Parent owns the exact deletion/pruning inventory. A process-local mutex alone is insufficient because cancellation/crash can occur after index removal and before file deletion. - -Retain a claim through the entire owned deletion task. Cancellation of a caller must not clear it while effects continue. A crash leaves a visible blocked claim requiring validated owner settlement/recovery; never silently expire it. Release the claim only after deletion effects and associated index/link updates are observed. Ensure-versus-delete races must end either in a committed declaration and rejected deletion, or in a claimed deletion and rejected/blocked ensure. - -An additive SQL `BEFORE DELETE ON models` retention trigger can provide defense for older code paths because current administrative deletion removes the index row first. It is **not a complete downgrade fence** and is not proposed as M3a integration. Before adding it in M3b, decide how projection rebuild/clear handles retained rows: preserve their projected rows conservatively or introduce an explicit transaction-scoped projection path. Do not let a trigger unexpectedly turn a missing-artifact scan into loss of declaration inventory or a partially cleared FTS table. Never rely on a model-row trigger alone when the row may already be absent. - -Existing M2 binaries do not read a future component marker or `PRAGMA user_version`. Therefore M3a's version check protects newer schema-aware binaries, **not old binaries**. Downgrading to those binaries with live declarations/claims is unsupported; do not claim startup refusal. They may ignore retention, although non-cascading declaration tables survive ordinary old index clears. A complete old-binary refusal fence would require a separate compatibility mechanism/change, not a marker that old code never reads. M3 acceptance must state this limitation explicitly and prove whatever partial SQL protection is actually installed. - -## M3a acceptance evidence required - -1. Fresh and populated legacy on-disk databases: transactional install, strict reopen, existing model/governance/facts rows preserved. -2. Inject failure between table/index creation and marker commit; reopen proves no partial authoritative schema or lost old rows. Reject future/partial/corrupt versions without schema replacement. -3. FULL configuration verified on actual writer connection; committed declarations survive forced process exit and reopen. Kill before commit yields either no declaration or a complete committed one, never partial acknowledgement. -4. Exact duplicate commit, first-bind CAS, conflicting repin, release/re-ensure UUID ABA rejection, two-consumer retention, scoped/idempotent release, and malformed key/requirement/recipe rejection without writes. -5. Separate connections race claim versus declaration commit: exactly one wins; wrong token cannot release a claim; reopened claims block ensures. -6. `clear`, startup rebuild/stale model removal, and FTS rebuild leave declaration/claim rows intact. No foreign-key cascade to models. -7. Read-only legacy/current/future/corrupt opens perform no migration. Old-reader downgrade behavior described from actual code/tests, not inferred from the presence of a version field. - -M3b then supplies acquisition replay, serialized deletion integration, owned reconciliation, startup resumption, and public ensure/release semantics. Passing M3a does not satisfy full M3 acceptance. diff --git a/docs/plans/local-intent-api-2026-09-12/reports/m3a-declaration-store.md b/docs/plans/local-intent-api-2026-09-12/reports/m3a-declaration-store.md deleted file mode 100644 index 580e4ff07..000000000 --- a/docs/plans/local-intent-api-2026-09-12/reports/m3a-declaration-store.md +++ /dev/null @@ -1,88 +0,0 @@ -# M3a: Authoritative declaration-store prerequisite - -Status: accepted for the private storage prerequisite on 2026-09-12; full M3 remains unaccepted. - -## Implemented boundary - -The existing ModelIndex connection now installs a component-versioned private -intent schema in one immediate SQLite transaction. Writer connections use WAL -with FULL synchronization. Read-only opens do not migrate. Incompatible, -partial, or malformed authoritative state is rejected before ordinary index -initialization; no database replacement/rebuild is used as recovery. - -Private declarations store a consumer-scoped canonical requirement ID, creation -UUID, original requirement, and optional typed bound target. Binding is immutable -and uses the creation UUID as its compare-and-swap token. Exact duplicates retain -their UUID; release and re-ensure create a new lifetime, preventing stale work -from binding or releasing a replacement declaration. - -Local model declarations immediately retain their model ID. Upstream declarations -can remain unresolved until an immutable single-file recipe is bound. Deletion -claims and target retention decisions share immediate transactions; claims use -exact UUID tokens and survive restart without automatic expiry. Declarations -and claims have no foreign-key cascade from the searchable model catalog. - -Every read uses one SQLite snapshot and strict schema/row validation. Canonical -JSON/IDs, model projections, UUIDs, policy/selector combinations, filename rules, -artifact identity, and declaration/claim contradictions are checked rather than -silently repaired or ignored. - -This is a private storage foundation. It adds no public ensure/release method, -background reconciliation, acquisition admission, filesystem deletion protection, -or transport operation. Its supported private inputs are LocalModel/LocalOnly -and UpstreamRepository/AllowUpstream. Repository-based local-only retention still -needs a provenance-binding contract in M3b. - -## Verification - -Final verification used the compiled core test binary after: - -```sh -cargo test --offline --manifest-path rust/Cargo.toml -p pumas-library --lib --test intent_api_tests --test api_tests --no-run -``` - -| Suite/filter | Passed | Limits | -| --- | ---: | --- | -| `index::` | 74 | Includes 11 new declaration-store tests; one ignored child helper is explicitly invoked by its parent process test | -| `intent::` | 7 | Native intent regression fixtures | -| `model_library::hf::` | 233 | Managed acquisition regressions | -| `api::hf::tests` | 25 | Native lifecycle and refusal fixtures | -| `intent_api_tests` | 9 | Public local intent integration | -| `api_tests --skip runtime --skip launch_llama_cpp` | 30 | Six unrelated runtime cases excluded for the existing baseline reasons | - -**378 tests passed** on the final source. The focused new module separately -passed 11 tests before the final index-suite rerun. Controlled process/socket -fixtures ran with sandbox restrictions lifted where required; all state was -isolated in temporary roots. - -Additional checks passed: - -- `cargo clippy --offline --manifest-path rust/Cargo.toml -p pumas-library --lib --tests --examples -- -D warnings`. -- `cargo check --offline --manifest-path rust/Cargo.toml -p pumas-rpc --no-default-features -p pumas-uniffi`. -- Exact changed Rust files formatted with edition 2021; Markdown relative links - and `git diff --check` passed. - -New tests cover populated legacy migration and facts/governance preservation, -transactional migration failure, FULL on the actual writer connection, read-only -legacy behavior, corrupt/future/partial schema refusal, canonical identity and -policy validation, immutable binding, UUID lifetime exclusion, separate consumer -releases, independent-connection claim races, retained claims after reopen, and -projection clearing without authority loss. -The process test pauses inside the production commit path after INSERT/readback -and before COMMIT, or after the real commit returns, then the parent forcibly -terminates the child and reopens the database. It does not mirror production SQL -in a test-only transaction. - -## Limits and next integration - -Linux process termination is the tested crash model; this does not prove -power-loss or every filesystem/platform behavior. Historical binaries ignore -these tables and do not honor retention. Downgrade with live declarations or -claims remains unsupported; the new version guard protects schema-aware code. - -M3b must integrate the [existing lifecycle owner](m3-lifecycle-design.md), the -[actual deletion/relocation paths](m3-deletion-inventory.md), pure immutable target -planning, startup reconciliation, bounded retries, and public ensure/release. -It must prove crash boundaries spanning declaration commit, acquisition admission, -and publication. M3a's store tests do not accept those cross-component guarantees. -The exact storage contract is in the [admitted design](m3-store-design.md). diff --git a/docs/plans/local-intent-api-2026-09-12/reports/m3b-deletion-contract.md b/docs/plans/local-intent-api-2026-09-12/reports/m3b-deletion-contract.md deleted file mode 100644 index 792a79100..000000000 --- a/docs/plans/local-intent-api-2026-09-12/reports/m3b-deletion-contract.md +++ /dev/null @@ -1,96 +0,0 @@ -# M3b deletion and relocation contract - -Status: admitted design record. Historical source observations below preceded implementation; current behavior and verification are recorded in [the M3b implementation report](m3b-local-desired-state.md). - -## One destructive-operation protocol - -Use the existing native root exclusion in `DownloadDestinationRoot::try_acquire_execution_grant`, together with the M3a SQLite deletion claim. These serve different purposes: the native grant excludes download filesystem effects/admission while the durable claim excludes retention and survives process death. Do not create another downloader, scheduler, or library owner. - -1. Validate every affected canonical model ID and prepare the operation without changing files. Resolve source/destination through the existing held root capability, rejecting substituted roots and symlink traversal. -2. Register the full operation with the existing runtime effect owner (the M3b extension of RuntimeTasks), before starting an effect. The owned inner future receives cloned ModelLibrary and owned inputs; caller awaits a result channel. Dropping the caller must not abort that inner future. All blocking joins stay inside it. -3. Acquire native root grants nonblocking. For a cross-library move, acquire roots in stable physical-root order and coalesce identical roots. Busy means a typed conflict; do not wait while holding a SQLite transaction. -4. Under the grants, use the existing strict download lifecycle inventory to reject unresolved custody for every affected source or destination. Include hidden admissions and dormant/paused/failed rows; a public task snapshot or an empty live queue is insufficient. Errors are conflicts/errors, never empty inventory. Reuse the recovery destination identity comparison, not untrusted persisted display paths. -5. Acquire durable claims for every affected ID, in stable order, using fresh tokens. Retained and preexisting claims reject the operation. A claim for a destination also excludes an ensure for a currently missing local model. If acquiring later claims fails before effects, explicitly settle already acquired tokens; no destructor releases claims. Across separate databases the native grants make ordered acquisitions safe; SQLite transactions are short. -6. Revalidate operation preconditions while protected, then perform the existing link/index/filesystem changes. Claims and grants remain owned until every async filesystem operation and blocking task result has been observed. -7. After a fully observed successful operation, explicitly release exact claim tokens before dropping grants. If no mutation started and preflight failed, explicit release is safe. After partial mutation, join panic, cancellation of the effect owner, ambiguous commit, or failed settlement, preserve remaining claims and report failure. Never release in Drop. A process crash leaves claims blocking. - -Startup reports unresolved claims and prevents affected ensure/bind/destructive operations. It does not expire them or infer completion from missing catalog rows/directories. M3a claims do not encode operation kind, destination, or progress, so automatically completing an interrupted relocation from them is unsupported. Explicit recovery needs evidence; ordinary startup must preserve custody. - -## Required effect-owner seam - -Direct ModelLibrary entrypoints need the same caller-drop safety as API entrypoints. Putting a guard only in PumasApi is insufficient. Reuse the M3b RuntimeTasks ownership implementation at a layer accessible to ModelLibrary and share its handle through composition/clones. If moving that utility to a common module is necessary, retain one implementation and one owner instance per composed library. Do not spawn an untracked destructive task and call it orderly shutdown. The owner closes admission, drains these effects, and only then permits HF shutdown. Standalone ModelLibrary construction needs the same ownership utility, without creating an HF client. - -Synchronous `cleanup_duplicate_repo_entries` can hold claims/grants directly for its synchronous effects; if invoked via spawn_blocking, its owning async wrapper must retain the join. API shutdown must not abort the wrapper and report a drained library. - -## Download custody integration is a concrete prerequisite - -ModelLibrary currently has no DownloadPersistence handle or configured download-store directory. Source libraries opened by LibraryMerger have the same gap. Do not guess the store directory or call DownloadPersistence::load_all (which can hide errors). - -Composition must supply a narrow existing download-authority handle/callback that checks `load_lifecycle_inventory_strict` against held destination identities while the root grant is held. The capability must cover the root's configured store, including source roots used by merge. If custody cannot be established for a destructive source, fail closed and preserve it; do not treat absence of an injected HF client as proof that no dormant download exists. An explicitly configured local-only authority may establish no managed download domain; this must be a composition decision, not inferred from an empty process map. - -HF ambient admission already inherits a protected root grant near `hf/download.rs`'s "durably admit download" block. Managed admission, restore/resume, and final mutation/import must also check persisted deletion claims for the managed model ID while holding that same root exclusion. This stops a new admission during a claim, including after a crashed deletion released its native OS lock. Do not block the downloader's own import merely because an intent declaration retains its output; only an active deletion claim blocks it. Checks outside the native grant leave a check/admit race. - -## Exact operation scopes - -| Entry point | Guard scope and behavior | -| --- | --- | -| `ModelLibrary::delete_model` | Claim before the first index/link removal. A retained model returns typed conflict regardless of cascade. Deleting an external reference removes only the registry artifact, preserving existing external-target semantics. Keep the claim through parent cleanup and observed link operations. | -| `reclassify_model` | Pure metadata changes that keep canonical ID do not require relocation claims. Before rename, claim both old and new IDs, reject retention on either, and hold through metadata publication and index changes. Do not rewrite declarations to a guessed replacement ID. Revalidate destination absence under protection. | -| `reclassify_all_models` | Delegates to guarded per-model operation and reports conflicts using existing per-model error reporting. | -| `cleanup_duplicate_repo_entries` | Claim duplicate source before removing bytes. Partial-payload merge mutates both identities: claim preferred and duplicate before merging, and preserve both if either is retained/busy. A retained duplicate remains unresolved; no declaration deletion or replacement. Projection-only cleanup of already missing rows does not remove retention. | -| `LibraryMerger::merge_single_model` | Before move/copy, protect source and destination roots and claim both IDs through copy, source removal, and destination indexing. Reject retained source or destination; do not transfer declarations implicitly. Source and target may use distinct ModelIndex authorities. | -| API links/state deletion dispatch | Delegate to guarded ModelLibrary method; no second retention check that can race. | - -LibraryMerger's current `cleanup_source` calls `remove_dir_all(source_path)` whenever the merge has no errors. This destroys skipped duplicate payloads and the source models.db, including unbound declarations or crash claims. Remove this recursive cleanup behavior in M3b. Only remove demonstrably empty payload parent directories, and preserve the source authoritative database/root. An empty payload scan is not permission to discard desired state. Also replace merge's destination-overwriting rename/copy behavior with an existing no-replace operation or fail safely on a late collision while under the protected roots. - -## Sol implementation split and evidence - -Library owner: shared guard helper, delete/reclassify/duplicate operations and typed retained/busy mapping. Merger owner: source authority plumbing, two-root/two-index protocol, no recursive source-root deletion. HF owner: claim checks under existing grants and strict custody callback; no new download inventory. Lifecycle owner: share and drain existing effect ownership down to direct library entrypoints. - -Required tests use real files and independent SQLite connections: retained direct deletion/cascade and relocation preserve bytes; a claim wins against concurrent ensure before first destructive effect; caller dropped after delete starts cannot let ensure succeed while effects remain; partial failure retains claim on reopen; downloader busy and dormant/hidden custody refuse deletion; active crash claim blocks fresh download admission; retained duplicate blocks partial merging; merge retains skipped payloads and source declarations; no late destination overwrite. Inject synchronization at actual mutation/settlement boundaries rather than relying on sleeps. Public release only removes its declaration and never invokes these operations. - -## Settled minimal composition recipe for implementation - -Proposed compatibility decision for parent admission: `ModelLibrary::new` initializes destructive authority to Unknown. This preserves read/index/import construction, but a direct destructive call must return a typed authority-unavailable error before acquiring a claim or mutating anything until trusted composition installs its authority. This is a deliberate lower-level behavior change; do not describe existing standalone deletion/merge compatibility as unchanged. - -Use a shared, install-once slot on ModelLibrary clones containing the existing runtime effect owner, held root capability, and the existing `Arc`. A concrete shape is `LibraryMutationAuthority { tasks: RuntimeTasks, root: DownloadDestinationRoot, downloads: Arc }`, behind `Arc>`. A crate-private configuration method validates that the held root is this library's physical root and installs once before public destructive work. No mutable toggle may turn a composed library back into an unguarded/no-download mode. Test-only construction can install a known local-only authority for isolated temp roots; do not expose that assertion as a public safety bypass. - -In `api/builder.rs`, move construction of its existing `DownloadPersistence` handle from inside the `enable_hf_client` branch to the configured primary composition scope. There remains exactly one handle for `launcher_root/launcher-data`, shared with both the library guard and HF if HF initializes. Configure the library with the already-created RuntimeTasks owner before scheduling reconciliation/public operations. If HF is disabled or client initialization fails, still inspect this configured store: an optional client says nothing about historical paused/download recovery custody. A strict valid missing store can establish empty inventory through the store's existing semantics. Malformed inventory remains a destructive-operation refusal. This is configuration supplied by the primary owner, not a guessed location in ModelLibrary. - -The guard helper implementation is: - -- `mutation_authority()` clones the configured handle or returns the typed unavailable error; it performs no filesystem/SQLite mutation. -- An owned async entrypoint clones that authority and library, then submits its inner future through `tasks` and awaits its result. All claim acquisition and effect execution live in the inner future. -- A synchronous protected helper acquires the held root's native grant, strictly checks lifecycle inventory for the validated affected destination identities, acquires the exact claim tokens, and returns explicit custody state to the inner operation. Claim state has no releasing Drop implementation. -- `finish_success()` releases exact tokens only after observed completion; `finish_unstarted()` releases exact tokens only when no destructive effect began. Other exit paths preserve claims. Native grants can drop on panic because claims remain authoritative and HF checks them before later effects. -- For root-only synchronous duplicate cleanup, use the same configured authority and custody helper synchronously; no nested async owner is needed for synchronous effects. The caller owning any blocking wrapper retains its join through shutdown. - -For LibraryMerger, add a crate-private `merge_from_library(source: Arc)` factoring the existing implementation; both source and destination must already have installed authority. Existing public path-only `merge(source_path)` can open its source for inspection but must reject before any destructive move because that constructor cannot establish source custody. The minimal M3b proposal intentionally does not invent a new public store-path argument. Report this path-only merge limitation explicitly. A future public composition API can admit an already configured source with a proper authority contract; internal tests exercise the crate-private seam now. - -Before configuring, ModelLibrary startup does run byte-complete partial finalization and index reconstruction. This proposal does not authorize moving destructive duplicate cleanup ahead of configuration or using startup construction to bypass claims. Any startup step found to remove/rename model payloads must use the same configured seam or be deferred until composition; pure projection reconstruction leaves authoritative declarations/claims intact. - -## Admitted HF capability seam - -Parent admitted a narrow `download_recovery.rs` change: `DownloadRecoveryDestination::assert_no_intent_deletion_claim` validates its held root, opens an existing `models.db` through `ModelIndex::open_read_only`, observes strict authoritative claims, and revalidates root/database identity. It creates no database or schema. Only a genuinely absent database at a currently valid standalone download root is treated as having no prior intent store; malformed/unreadable/substituted databases fail closed. Read-only SQLite uses the existing bounded connection behavior; no new indefinite wait is introduced. HF invokes this observation under the existing root grant before admission, resume, worker effects, recovery admission, and cancellation cleanup. Domain refusal is returned as an observed inner result, preserving lifecycle shutdown semantics. - -The admitted `DownloadInvocationContext::held_root_execution_grant` accessor clones the existing Arc grant into nested owned preparation. The library's under-grant preparation method validates that proof against its installed authority and must not reacquire the same native lock. - -## Destructive capability implementation amendment - -Parent admitted held-directory mutation helpers in `download_recovery.rs`: recursive unlink of a bound model directory, metadata-only reading, metadata publication through the existing capability-aware AtomicJsonTarget, and Linux `renameat2(RENAME_NOREPLACE)` with held parent descriptors. The rename supports distinct configured roots on the same filesystem when the caller holds both root grants and claims. It never falls back to ambient-path copying: cross-filesystem relocation is refused with source bytes preserved. Unsupported platforms likewise refuse capability relocation. Destructive operation callers retain claims after ambiguous mutation or publication outcomes. - -Payload symlinks are unlinked during deletion, never recursively followed. Capability tests cover substituted model/root/target-parent preservation, metadata substitution refusal, real cross-root rename, and no overwrite. These are targeted evidence, not a claim that arbitrary external processes cannot rename a directory they already own while Pumas holds it. - -M3b deliberately preserves incomplete duplicate groups requiring partial-file transfer; it reports them unresolved instead of invoking the existing ambient-path merge. Removing exact duplicate directories can use held recursive deletion. Optional raw-path empty-parent pruning is omitted from guarded effects unless backed by held-parent authority. This leaves empty ancestors and preserves correctness. Public path-only LibraryMerger refuses unconfigured source authority before constructing/migrating a source ModelLibrary; the internally composed-source path can use guarded same-filesystem rename. Standalone lower destructive operations require explicit trusted internal composition, as admitted above. - -## Additional migration bypass found during integration review - -Constructor startup does not execute the explicit metadata migration runner. It does invoke `auto_finalize_complete_partial_artifacts_on_startup`, which can promote `.part` files through raw paths before trusted mutation authority exists. Defer/remove that constructor mutation: configured HF restoration already owns immutable byte-complete inspection/promotion, while an unconfigured library must preserve unresolved bytes and deletion claims. - -The explicit `library/migration.rs::execute_migration_with_checkpoint` is reachable through the public migration API and state dispatcher. Its ordinary planned move uses raw directory rename; split-directory work renames individual files/marker and removes source metadata. These are retention bypasses absent from the earlier inventory and require the same owned claims/capabilities. Normal moves can reuse held rename/metadata publication; split transfer must refuse before effects until a bounded held-file transfer protocol exists. Removing old raw empty-parent cleanup helpers must also remove their migration wrapper/callers, rather than restore unsafe ambient pruning to satisfy compilation. Parent coordinates this additional narrow migration amendment and its compatibility/evidence gates. - -## Interrupted desired acquisition recovery correction - -A fresh HF owner projects persisted Queued/Downloading entries as live Paused, so treating every live Paused observation as an explicit operator pause prevented durable desired-state repair after a real crash. The admitted `resume_interrupted_download(id, expected_ref)` uses the existing owned resume path, retaining the same exact admission and destination queue position. It requires an immutable expected model/artifact reference, live managed Paused without failure/cancellation/pause evidence, and a strict current persisted Queued/Downloading snapshot matching request, revision, files, destination and confirmed admission attempt. Persisted Paused, Pausing, Error and unresolved custody are not automatic repair authority. - -Desired orchestration holds its shared declaration gate, rereads exact generation and bound target, then invokes this restricted helper. It never calls the public operator resume method for reconciliation. The final existing worker installation rechecks live identity and the pause flag. An explicit user pause on a restored dormant active entry sets that flag before asynchronous persistence and durably writes Paused, preventing an already-inspected automatic resume from overriding the user. This introduces no new writer, queue, store or scheduler. diff --git a/docs/plans/local-intent-api-2026-09-12/reports/m3b-local-desired-state.md b/docs/plans/local-intent-api-2026-09-12/reports/m3b-local-desired-state.md deleted file mode 100644 index d07f34d6f..000000000 --- a/docs/plans/local-intent-api-2026-09-12/reports/m3b-local-desired-state.md +++ /dev/null @@ -1,119 +0,0 @@ -# M3b: local durable desired-state integration - -Status: accepted within the local Linux evidence and explicit compatibility limits below. - -**Current owner-lifecycle qualification (2026-10-07):** The earlier public -crash/reopen sequence is superseded by retained primary custody. Successful -`shutdown_instance()` permits orderly restart; failed construction/shutdown and -abrupt exit do not. The current public crash fixture separately exercises real -process exit after ensure, release, and replacement/ABA acknowledgements on -independent roots. Read-only SQLite observations compare every stored declaration -column before and after exit; refused same-registry primary construction must -preserve both the declaration evidence and exact owner generation. It creates no -replacement service on a crashed root. Public generation/ABA behavior after -reopening is qualified through an explicitly orderly restart instead. These -checks do not establish automatic primary recovery, even if a component-level -store or registry-free acquisition fixture can reconstruct its own state. - -## Native contract - -The existing primary instance composes one `IntentService` over its library, -index, download client, and finite task owner. The public intent facade exposes -`ensure_model`, `release_model`, `get_ensure_status`, and `list_declarations`. -Requirements and outcomes remain transport-independent domain values. - -An accepted ensure has committed its consumer-scoped declaration. Its observed -state can still be missing, unavailable, acquiring, or blocked. Duplicate -requests reuse the declaration; release/re-ensure uses a new generation. Release -never deletes bytes or cancels a download. Status remains a read-only observation. - -Initial durable selector/policy pairs are local references with LocalOnly and -upstream repositories with AllowUpstream. First-time upstream binding requires -provider planning even when a related local artifact exists; an already-bound -available declaration can be observed offline. No source/provenance is guessed. - -## Ordering and ownership - -The store commit precedes upstream planning. Planning shares the canonical HF -metadata, selected-artifact identity, and destination calculation without -preparing an artifact directory. Immutable binding precedes download admission. -Generation reread, binding, and admission share a gate with release. Replay checks -the stored commit, artifact, and canonical target; policy changes that would -relocate the target block rather than repin it. Existing live or dormant download -custody is observed before admitting another attempt. Cold recovery resumes the -exact retained download through the existing HF owner only when durable state -proves it was queued or downloading before interruption. Deliberate pause, -pausing, error, and failed-integrity states do not authorize automatic resume. - -Finite operations are registered before effects start. Requester cancellation -leaves the admitted operation owned. The shared runtime owner observes outer and -nested blocking joins and retains exclusion through their settlement. Domain -refusals are result values; actual storage/task failures remain owner failures. -`shutdown_intent` drains local effects and then downloads through a shared, -waiter-independent shutdown sequence. It does not stop inference runtimes. - -## Reconciliation - -Startup inspects durable declarations before entering the existing coordinator; -empty legacy stores do not force a new full-library pass. Ensure completion, -existing filesystem events, and canonical reconciliation feed the same owner. -Dirty events arriving during an active snapshot receive a coalesced follow-up. -Transient work has three automatic delayed wakes per unresolved episode: -30 seconds, 120 seconds, and 600 seconds. Explicit ensure, later events, or owner -restart can trigger a further observation after that automatic budget ends. -There is no additional scheduler, daemon, or persistent retry database. - -## Destructive operations and compatibility limits - -Primary composition shares the same existing download persistence with library -mutation guards even when HF is disabled. Native root grants exclude download -execution/admission while strict inventory checks cover dormant and hidden -custody. SQLite claims atomically exclude declarations. Claims remain after a -partially failed mutation; they do not expire or disappear through Drop. -Automatic recovery of unfinished deletion claims is not provided; retained -claims require explicit repair before affected paths can be mutated again. - -Deletion and supported relocation use held directory capabilities. Metadata -publication reuses the existing atomic JSON publisher. Exact source/destination -identity checks and no-overwrite rename protect against path substitution. - -- Standalone libraries without composed mutation authority refuse destructive - work. Path-only merge refuses before opening/migrating its source. -- Composed relocation supports held, same-filesystem Linux rename. Unsupported - platforms and cross-filesystem relocation refuse rather than copy/delete. -- Partial duplicate transfer and split-file migration preserve source data and - report an unresolved/refused operation until capability transfer is supported. -- Constructor partial-file promotion is deferred to the configured download - owner. Standalone library construction does not publish a pending artifact. -- A retained target that would require moving an older unknown partial can remain - blocked by relocation retention. No acquisition-specific retention bypass is - introduced. -- Historical binaries ignore declaration tables. Downgrade with live declarations - or deletion claims remains unsupported. - -Nodes, fleets, remote discovery, new listeners, MCP, and new networking features -remain deferred. Existing local transport projections remain M4. - -## Verification - -Historical relevant verification passed **877 tests**: model-library suites 682, -intent 11, runtime task ownership 11, reconciliation 28, index 74, HF API 26, -public native intent 9, public desired state 5, public local crash 1, and relevant -operational API 30. Six ignored subprocess helpers are invoked by their parent -tests. Six unrelated runtime API cases remain excluded for the recorded I7 -baseline failures; this is not a full runtime-suite claim. - -The evidence includes real process exit after declaration commit, upstream -admission, and canonical publication; orderly restart; two-consumer retention; -manual-pause preservation; generation ABA rejection; same-pin repair after the -branch moves; root/path substitution; and absence of a duplicate payload writer. -Tests use real on-disk SQLite/filesystem state and controlled local HTTP; the -publication reopen gate works with its HTTP server stopped. No power-loss, -all-filesystem, all-platform, or general historical recovery claim is made. - -Core library/tests/examples Clippy with warnings denied passed. Existing RPC -without default features and UniFFI Cargo checks passed. Exact-file Rustfmt and -whitespace checks passed. Review/test-driven fixes restored completed-pin -local-first resolution, closed the shutdown sequencing and missed-wake gaps, -restricted cold resume to interrupted active custody, and normalized the -existing importer review-reason producer so repair preserves canonical metadata. diff --git a/docs/plans/local-intent-api-2026-09-12/reports/m3b-owner-contract.md b/docs/plans/local-intent-api-2026-09-12/reports/m3b-owner-contract.md deleted file mode 100644 index ab25fd44e..000000000 --- a/docs/plans/local-intent-api-2026-09-12/reports/m3b-owner-contract.md +++ /dev/null @@ -1,86 +0,0 @@ -# M3b existing runtime owner extension - -Status: admitted design record. Historical source observations below preceded implementation; current behavior and verification are recorded in [the M3b implementation report](m3b-local-desired-state.md). - -## Source basis - -`api/runtime_tasks.rs` currently stores a vector of `JoinHandle<()>`. `spawn` launches before taking the registry lock; `shutdown` aborts handles and has no closed flag or asynchronous observation. `PumasApi::drop` (`lib.rs:289`) calls it. This is suitable for best-effort background cancellation, not acknowledged declaration or destructive filesystem effect settlement. `api/reconciliation.rs::start_owned_reconciliation` keeps the single-flight token in its outer task, but that task is currently abortable. `api/hf.rs::shutdown_downloads` already closes and drains its independent existing download owner; it does not cover local-only declarations and should retain its documented download-specific behavior. - -The [M3 deletion inventory](m3-deletion-inventory.md) identifies additional destructive paths. M3b must admit `model_library/merge.rs` to the write set before public ensure is exposed. The durable deletion claim from M3a remains the crash authority; runtime ownership complements it and cannot replace it. - -## Proposed Rust interface - -All types below are crate-private; the public intent facade is handled separately. - -```rust -impl RuntimeTasks { - // Existing interface for best-effort, potentially long-lived background work. - pub(crate) fn spawn(&self, task: F) - where F: Future + Send + 'static; - - // Register one finite operation independently of the requesting future. - pub(crate) async fn run_owned( - &self, operation: &'static str, function: F, - ) -> crate::Result - where - T: Send + 'static, - F: FnOnce(RuntimeTaskContext) -> Fut + Send + 'static, - Fut: Future> + Send + 'static; - - pub(crate) fn close(&self); - pub(crate) async fn shutdown_owned(&self) -> crate::Result<()>; - - // Existing synchronous best-effort path: close and abort background tasks. - // Do not abort already admitted finite owned operations. - pub(crate) fn shutdown(&self); -} - -#[derive(Clone)] -pub(crate) struct RuntimeTaskContext { /* opaque operation identity and owner */ } - -impl RuntimeTaskContext { - pub(crate) async fn run_blocking( - &self, operation: &'static str, function: F, - ) -> crate::Result - where T: Send + 'static, F: FnOnce() -> T + Send + 'static; -} -``` - -`run_blocking` deliberately transports `T`; callers can return `Result` as observed domain data and explicitly handle expected conflicts. A panic or failed join is always an owner failure. For database or filesystem mutation errors, the operation must propagate failure and retain its durable claim as appropriate; do not accidentally classify expected retention conflicts as uncertain write outcomes. No typed error must be flattened into a fake successful domain outcome. - -If reconciliation needs synchronous registration before dropping its requester receiver, factor `run_owned` internally through a `start_owned` returning a receiver; no second registry is needed. An immediately dropped, never-polled `run_owned` future admits nothing, as with existing async API calls. Once admitted, dropping its receiver never aborts work. - -## Required implementation semantics - -Use one shared owner state with a closed flag, abortable background handles, admitted operation entries, and one cached drain completion. Each operation entry has a unique identity, its outer handle, and retained nested blocking joins/results. This is an extension of `RuntimeTasks`, not a new task scheduler. Keep `ReconciliationCoordinator` responsible for single-flight/dirty policy. - -- Check closed and register under the same mutex. A start barrier prevents any side effect before registration; close racing registration has exactly two outcomes: rejected with no effects, or admitted and included in drain. Also fix legacy `spawn` ordering so it cannot launch after close; after close it drops the unpolled background future. -- Run the caller closure on an owner-retained task and catch unwind. Send the result through a oneshot, but do not make completion depend on receiver survival. Preserve operation identity until its nested joins are observed. Log unclaimed domain errors; archive panic/join failure in the drain outcome. -- `RuntimeTaskContext::run_blocking` registers each blocking operation before dispatch. Its join remains owned if the requesting outer future panics while awaiting it. Closing root admission does not reject nested work belonging to an already admitted operation: that work may be necessary to commit or settle its transaction/claim. Reject stale context identities once their operation settles. -- Never prune a finished handle without observing its join. A finished outer operation can still have a live blocking effect. Catching the outer panic does not prove effects stopped. -- `shutdown_owned` starts or joins a shared drain task independent of its waiter. It closes root admission, aborts the legacy background population, and waits for every admitted operation and nested effect. Repeated/cancelled shutdown waiters observe the same terminal result. Cache a cloneable internal drain result (for example a failure summary), not the non-cloneable public error itself. -- Synchronous `shutdown`/Drop closes admission and aborts background tasks but leaves finite owned operations registered and running. Runtime/process exit can still interrupt them: durable declarations/deletion claims are the recovery evidence, not a Drop guarantee. Avoid a registry/reference cycle that survives after all entries settle; retained owner references should end with their operation/drain tasks. - -No extra queue, retry loop, periodic timer, library instance, HF client, or executor is needed. Captured Tokio `Handle` preserves existing registration from non-runtime threads where the interface supports it. - -## Integration and shutdown ordering - -Public ensure/release and mutating desired-state reconciliation run within finite owned operations. Pass `RuntimeTaskContext` through their private helpers so SQLite transactions and destructive filesystem work use owned blocking calls. Do not wrap an existing detachable `spawn_blocking` helper and assume the context sees its inner join. Where bounded filesystem work already completes inside a synchronous library helper, run that helper through the context; otherwise pass context through the actual effect boundary. - -Migrate `start_owned_reconciliation` to this finite operation population, retaining its `ReconciliationRunToken` until the scope's effects settle. Its `ReconciliationInputs` can carry the context into affected helpers without holding a borrowed API. Keep the watcher dispatcher itself abortable; it schedules finite owned work. New trigger registration after close is rejected. Nested scopes should execute within the admitted context, not attempt a new root registration during shutdown. - -For the eventual public local-intent shutdown operation, close declaration/reconciliation admission first, drain those admitted handoffs, then call the existing HF `shutdown_downloads`. This prevents a late declaration admission from creating a download after HF shutdown has been reported. Do not invoke this drain from inside one of the operations it must drain. Existing download-only shutdown remains available and keeps its narrow meaning. Parent chooses the public method name/write set; its docs must not claim unrelated inference/runtime processes are shut down. - -Deletion claims are committed before destructive effects and settled only after their owned joins complete. If a failure or process exit prevents observing completion, leave the claim durable and fail closed on ensure/bind. Concurrent release removes the declaration only; it does not clear another operation's claim or cancel a shared acquisition. - -## Minimum owner tests - -1. Registration racing close never starts an unregistered effect; post-close roots are rejected. -2. Drop an ensure-style requester after a held blocking transaction starts; the effect remains owned, commits once, and shutdown waits for it. -3. Panic the outer operation while its blocking effect is held; drain waits for the effect and reports panic/join failure. -4. Cancel one shutdown waiter, then release the effect; another waiter gets the same settled result, with no second drain. -5. Admitted work can complete necessary nested effects after root close; a stale context cannot create new effects after settlement. -6. Legacy background tasks still abort; finite operations do not. Completed panics are observed rather than silently pruned. -7. Existing reconciliation single-flight stays held until a nested cleanup settles, including requester disappearance and shutdown. - -The owner tests prove process-lifetime settlement. M3's real on-disk forced-exit tests must separately prove declaration/recipe/claim persistence and recovery at the SQLite/download admission boundaries. This proposal does not substitute for those gates. diff --git a/docs/plans/local-intent-api-2026-09-12/reports/m4-local-transports.md b/docs/plans/local-intent-api-2026-09-12/reports/m4-local-transports.md deleted file mode 100644 index cb7f93f51..000000000 --- a/docs/plans/local-intent-api-2026-09-12/reports/m4-local-transports.md +++ /dev/null @@ -1,125 +0,0 @@ -# M4 — Existing local transport projections - -Status: Accepted within the local Linux evidence and explicit compatibility limits below. - -## Scope - -Project the seven existing native intent operations through authenticated local -IPC and the existing loopback JSON-RPC server. Both delegate to the primary's -intent service. Requests express domain requirements; transport handlers do not -plan downloads, persist declarations, or implement another lifecycle owner. -The server drains the composed intent owner during its existing shutdown. - -Wire methods use the `intent_` prefix to preserve operational method names. -The first three accept `requirement`, ensure accepts `request`, release and -ensure-status accept `reference`, and declaration listing accepts an empty object. -IPC additionally carries its existing registry connection token. - -## Existing consumer inventory - -| Consumer | Existing contract | M4 treatment | -| --- | --- | --- | -| Native `PumasApi` | `get_model(&str)`, `start_hf_download(&DownloadRequest)`, model-library helpers | Retain methods; intent remains a separate borrowed facade | -| Native `PumasLocalClient` | Selector snapshots, artifact-load resolution, batch settings/facts, updates | Add a borrowed intent facade; retain existing methods and authentication | -| Standalone JSON-RPC | `get_models`, `download_model_from_hf`, download status, artifact-load resolution | Add seven closed typed commands/outcomes; retain operational routes | -| UniFFI `bindings/api_models.rs` and `api_hf.rs` | `get_model(String)` and `start_hf_download(FfiDownloadRequest)` | No binding migration or generated DTO change | -| Electron `rpc-method-registry.ts` | Explicit operational allowlist and schemas | Existing allowlist remains; desktop intent adoption is not this slice | -| Frontend `api/models.ts` and `types/api-bridge-models.ts` | Existing model/download bridge methods | Existing UI behavior remains; no new GUI dependency | - -No existing consumer needs to migrate to complete the local intent API. Native -examples and local-process integration tests are the new consumers. No node, -fleet, discovery, remote control, new production listener, or gateway feature is -introduced. Real HF process tests use the existing outbound client with a test -CONNECT proxy configured only in the child environment. - -## Behavior evidence - -- All seven operations use closed typed commands and outcomes. Receiver tests - reject unknown outer and nested fields while preserving native defaults and - semantic-invalid domain outcomes. Existing public infrastructure-error - projection remains in force. Available paths remain intentional handle data. -- A registry-backed child primary exposes authenticated IPC. Tests compare its - real local Available observation field-for-field with the native observation, - exercise missing/invalid/unsupported cases, and verify reconnect, orderly - restart after successful `shutdown_instance`, generation-aware release and - release durability. A separate hard-exit case preserves the real kill/wait - boundary, observes complete persisted declaration and registry rows read-only, - and proves that the retained generation refuses a new primary. No parent-global - registry environment is changed; forced-exit primary recovery is not qualified. -- Actual library-only RPC processes exercise all seven HTTP and IPC facade - methods, Available/Missing/Invalid/Unsupported results, persisted declarations - and orderly restart. On every platform the existing shutdown request is followed - by successful exact-child exit after owner drainage. Acknowledgement alone is - not cessation, and forced cleanup is reserved for a failed fixture. -- Both real acquisition gates passed against public repository - `ggml-org/test-model-stories260K`, immutable commit - `479896ec924af6d40fd419ab8f4d1eb2101de00d`, artifact - `stories260K-f32.gguf` (1,185,376 bytes). Each fresh owner uses a child-only - transparent CONNECT proxy to throttle the real transfer. After Acquiring, - consumer reconnection observes the same declaration generation, model pin and - download ID. Lifting the throttle reaches Available. Release preserves the - downloaded file, and graceful shutdown exits successfully. -- Existing operational RPC process checks pass after the tracked-download test - fixture explicitly supplies the current persistence revision field. - -The live tests are ignored by default because they require actual HF/CDN access; -this acceptance run invoked both explicitly. Reproduce with: - -```sh -cargo test --offline --manifest-path rust/Cargo.toml -p pumas-rpc --no-default-features --test intent_integration_tests -- --ignored --test-threads=1 -``` - -`--offline` restricts Cargo dependency resolution; the explicit live test still -uses the public upstream. The default run exercises the two independent local -process tests. The proxy, bounded log tail and process harness exist only in the -integration test file; no test endpoint or networking feature was added to core. - -## Verification - -| Suite | Passing tests | -| --- | ---: | -| Core reconciliation | 30 | -| Runtime task owner | 11 | -| Existing IPC and new protocol contracts | 37 | -| Native intent including upstream crash parents | 11 | -| Registry-backed IPC process consumers | 2 | -| RPC unit/contract/owner regressions | 159 | -| Existing operational RPC process regressions | 13 | -| Local RPC-process intent consumers | 2 | -| Explicit real HTTP/IPC acquisition consumers | 2 | - -All 267 relevant tests passed. Normal and `--no-default-features` RPC builds -passed. Core library/tests/examples and RPC library-only all-target Clippy passed -with `-D warnings`; RPC `export-contract` and UniFFI compile together without -changing generated consumers. Exact Rustfmt, whitespace and relative document -link checks passed. - -The core crash and IPC subprocess entrypoints -are ignored as standalone tests and exercised by their parent tests. Ten older -RPC tests that expect an externally running server remain ignored; the 13 -process regressions launch their own instances. A pre-existing IPC 25ms timing -assertion briefly exceeded its budget during a concurrent compile and passed -with its unchanged limit when rerun without compilation. - -Evidence is bounded to this Linux host, the supported single-file acquisition -contract and the recorded fixtures. It does not establish power-loss guarantees, -all-platform behavior or a full runtime-suite pass; I7 and I8 retain their -separate dispositions. The test harness uses forced termination on non-Unix -hosts and does not claim graceful-shutdown evidence there. - - -## Integration findings - -The real upstream process gate reached availability through both transports but -exposed a composed-shutdown failure: reconciliation racing an active download -returned expected `DownloadRootBusy`, which the finite owner archived as a -failed operation. The narrow reconciliation correction preserves dirty -work and bounded retry for opportunistic contention. Forced refresh still -returns DownloadRootBusy to its caller, carried as an expected owned result so -it does not poison drainage. Nested task failures take precedence over deferral, -and actual owner failures remain observable. Two held-root regressions and both -real upstream process tests verify the correction. - -Process fixtures also needed to preserve normalized metadata across restart and -explicitly initialize the current persisted-download revision field. Strict -production decoding and native-versus-IPC availability assertions remain intact. diff --git a/docs/plans/local-intent-api-2026-09-12/reports/managed-intent-acquisition.md b/docs/plans/local-intent-api-2026-09-12/reports/managed-intent-acquisition.md deleted file mode 100644 index 7c9730b3a..000000000 --- a/docs/plans/local-intent-api-2026-09-12/reports/managed-intent-acquisition.md +++ /dev/null @@ -1,111 +0,0 @@ -# M2: Managed native intent acquisition - -Status: accepted for the bounded native acquisition scope on 2026-09-12. - -## Behavior - -`PumasApi::intent().get_model` now admits an explicit `AllowUpstream` -repository requirement through the existing managed Hugging Face download owner. -It resolves branch/tag selectors to an immutable commit, selects a supported -artifact, and returns a pinned local requirement for subsequent status calls. -Ambiguous upstream candidates expose distinct artifact selectors; callers do not -need to construct operational download requests or coordinate import callbacks. - -Query and status remain read-only. `LocalOnly` performs no upstream access. -Progress and download IDs are advisory; the resolved requirement is the stable -correlation identity. Existing download admission, persistence, recovery, -import, and shutdown retain ownership. No desired-state store, transport method, -listener, node, fleet, or peer networking is introduced. - -Pinned execution rehydrates the exact admitted filenames from commit-specific -metadata and verifies available LFS SHA-256 and size through bound filesystem -access before promotion/import. Existing final files, completed partial files, -and restored byte-complete state receive the same checks. Unavailable or -contradictory evidence fails closed and preserves failed bytes. Pinned import -must produce canonical package facts before completion becomes observable. - -Supported acquisition is bounded to coherent single-file GGUF, ONNX, and bare -Safetensors artifacts with LFS integrity evidence. Known directory, adapter, and -sharded layouts are unsupported. Safetensors with configuration indicating an -HF directory package is rejected before transfer while I8 remains unresolved. -Availability is an observation, not a lease or inference-execution guarantee. -Auxiliary files without hash evidence are not represented as cryptographically -verified. - -## External-path evidence - -The native `intent_acquire` example successfully acquired -[`ggml-org/test-model-stories260K`](https://huggingface.co/ggml-org/test-model-stories260K) -using a fresh temporary library and registry on 2026-09-12. It returned an -available local load path and immutable revision: - -- Commit: `479896ec924af6d40fd419ab8f4d1eb2101de00d`. -- Artifact: `stories260K-f32.gguf`. -- Size: 1,185,376 bytes. -- SHA-256: `270cba1bd5109f42d03350f60406024560464db173c0e387d91f0426d3bd256d`. - -An independent local hash and size check matched the pinned upstream tree. -The indexed library contained both canonical facts records (summary and detail). -The final rebuilt example also passed with explicit `main`; a second process -reopened the same isolated library and returned the same pinned available handle. -The example awaited managed download shutdown. No model runtime was executed. -This verifies one Linux/native external acquisition, not every HF package -layout or platform. - -Reproduce with an isolated launcher root and `PUMAS_REGISTRY_DB_PATH`, then run: - -```sh -cargo run --manifest-path rust/Cargo.toml -p pumas-library --example intent_acquire -- /path/to/isolated-root ggml-org/test-model-stories260K -``` - -## Controlled verification - -Completed native and operational regression checks: - -- `intent_api_tests`: 9 passed. -- `api_tests --skip runtime --skip launch_llama_cpp`: 30 passed, 6 filtered. - -The sandbox blocks IPC/loopback sockets; these fixtures were run with local socket -access enabled. Six runtime cases were excluded because of the separately recorded baseline -failures; this does not claim that the full operational API suite passes. - -Final compiled library test binary filters passed: - -| Filter | Passed | Ignored helpers | -| --- | ---: | ---: | -| `model_library::hf::` | 233 | 0 | -| `api::hf::tests` | 25 | 0 | -| `intent::` | 7 | 0 | -| `model_library::importer::tests` | 25 | 0 | -| `model_library::download_recovery::tests` | 32 | 1 | -| `model_library::artifact_identity::` | 11 | 0 | -| `model_library::download_store::` | 61 | 2 | - -Together with the two integration suites above, **433 tests passed**, with three -ignored subprocess helpers and six excluded runtime cases. Suites ran against -`rust/target/debug/deps/pumas_library-74a3a1e3f9916b12` after -`cargo test --offline --manifest-path rust/Cargo.toml -p pumas-library --lib --no-run`. -Each named filter can also be run via Cargo with `--lib -- --quiet`. - -Static checks: - -- `cargo clippy --offline --manifest-path rust/Cargo.toml -p pumas-library --lib --tests --examples -- -D warnings`: passed. -- `cargo check --offline --manifest-path rust/Cargo.toml -p pumas-rpc --no-default-features -p pumas-uniffi`: passed. -- Native acquisition example build, exact Rustfmt edition 2021, Markdown relative - links, and `git diff --check`: passed. - -Review-driven regressions cover completed explicit-branch resolution after live -worker cleanup, exact-pin substitution refusal, active artifact-constraint -matching, selector-ID collisions, retained corrupt bytes, and canonical-facts -publication failure. Public fixtures cover coalescing, caller drop after -admission, preflight shutdown, upstream 403/503 refusal, and actionable ambiguity. -Distinct revision isolation is exercised in the real lower managed-worker -admission/persistence path; it is not a public concurrent two-revision test. - -## Boundaries - -I2 remains open for broader lifecycle/crash evidence. This milestone exercises -ordinary persisted resume and owned shutdown, without claiming general -hard-crash recovery or durable desired-state reconciliation. M3 ensure/release -and M4 existing-local-transport projections remain separate milestones. Existing -unrelated runtime-profile test failures are recorded in the execution ledger. diff --git a/docs/plans/runtime-installations-and-model-adapters/execution-ledger.md b/docs/plans/runtime-installations-and-model-adapters/execution-ledger.md index 6509a2be2..451897421 100644 --- a/docs/plans/runtime-installations-and-model-adapters/execution-ledger.md +++ b/docs/plans/runtime-installations-and-model-adapters/execution-ledger.md @@ -25,7 +25,7 @@ APIs, and reports typed missing/invalid-runtime failures. Qualified implementati `524391ecec40b9f64432e20ca0f12dfd4c27375d` and its exact tree, dependency audit, no-fetch traces, full suite results, native failure regression, compatibility contract, and outstanding SDK/platform acceptance inputs are recorded in the -[qualification report](reports/onnx-no-build-download-2026-10-05.md). +qualification report (`reports/onnx-no-build-download-2026-10-05.md`, removed; see Git history). Frozen S3 head `493b935c6a41d4d4aeca8e8a66f10b4aba114365` and its write set were preserved. Parent coordination retains PR/review/merge and downstream pin @@ -33,3 +33,7 @@ ownership. This correction adds no runtime installer/downloader and does not start R1 or change any acquisition gate readiness. R1 remains the next runtime slice after target-scoped AQ-HTTP acceptance; acquisition Q3 real-provider acceptance and Q4 shipping qualification retain their existing pending inputs. + +## 2026-11-04 — v0.8.0 documentation review + +Status unchanged: `Planned`, R1 gated by AQ-HTTP. Acquisition Q1 and Q3 are merged and ship in 0.8.0 without an accepted gate. The ONNX build-correction qualification report was removed; its durable rules live in `docs/DEVELOPMENT.md` and ADR 0001, and the report is in Git history at `78c52fcf`. Plan header base and phase lines updated. diff --git a/docs/plans/runtime-installations-and-model-adapters/plan.md b/docs/plans/runtime-installations-and-model-adapters/plan.md index 6effbea06..562683900 100644 --- a/docs/plans/runtime-installations-and-model-adapters/plan.md +++ b/docs/plans/runtime-installations-and-model-adapters/plan.md @@ -6,12 +6,13 @@ **Objective acceptance:** pending; real runtime, model, migration, native-platform, and desktop acceptance has not been performed. -**Current phase:** waiting for Acquisition Q1 to satisfy and merge AQ-HTTP; read-only preparation may continue. +**Current phase:** waiting for acceptance of AQ-HTTP; Acquisition Q1 source is merged (PR #34) and ships in 0.8.0, but the gate is not accepted. Read-only preparation may continue. -An independently authorized [2026-10-05 ONNX build correction](reports/onnx-no-build-download-2026-10-05.md) -removes build-time native SDK downloads without starting R1, adding an installer, -or advancing the acquisition gates. Its explicit SDK contract and qualification -limits are recorded separately from runtime installation implementation. +**Status review (2026-11-04, v0.8.0):** Still `Planned`; no R1–R5 source exists (no installation identity or adapter registry in `pumas-app-manager` or `pumas-core`). The Torch installer still does not consume the acquisition owner, so Q2/AQ-PACKAGES, the prerequisite for R2, has not started. The v0.8.0 "adapter" badge from model categories is a LoRA/adapter-package classification, not this plan's registered model adapter. + +The 2026-10-05 ONNX build correction (Cargo never downloads ONNX Runtime; the SDK is +loaded dynamically from an explicit path) is independent of this plan and is owned by +[Development](../../DEVELOPMENT.md) and [ADR 0001](../../adr/0001-onnx-runtime-provider-model.md). **Exactly one next runtime slice:** **R1 — shared installation identity and bound launch for Torch and llama.cpp; begin only after AQ-HTTP is accepted and merged for the target in scope.** @@ -22,7 +23,7 @@ limits are recorded separately from runtime installation implementation. **Baselines:** Pumas `04e7f1568f00693c0ef26c77e0150e5e4dd112ea`; Coding-Standards `39d55dc330d44ecf940364ceada9d2527f7c7ea0`. -**Current accepted integration base:** Pumas `e37bbf4b964a0e2aadf25f80ab71edd8fa6b3eb3`. Acquisition Q1 is active on its task branch; AQ-HTTP remains not ready. Runtime source changes must start from updated accepted `main` after that gate is merged. +**Current accepted integration base:** current Pumas `main` (0.8.0). Acquisition Q1 is merged; AQ-HTTP remains not accepted. Runtime source changes must start from updated accepted `main` after that gate is accepted. ## 1. Objective diff --git a/docs/plans/runtime-installations-and-model-adapters/reports/onnx-no-build-download-2026-10-05.md b/docs/plans/runtime-installations-and-model-adapters/reports/onnx-no-build-download-2026-10-05.md deleted file mode 100644 index dd4d969fd..000000000 --- a/docs/plans/runtime-installations-and-model-adapters/reports/onnx-no-build-download-2026-10-05.md +++ /dev/null @@ -1,149 +0,0 @@ -# Explicit ONNX Runtime provisioning qualification — 2026-10-05 - -The owner required that Cargo never download ONNX Runtime. This bounded build -correction preserves the in-process execution architecture and the existing -acquisition/runtime owners. It does not start runtime R1, advance AQ gates, add -a downloader, or change application settings into a provisioning mechanism. - -## Candidate and isolation - -| Identity | Exact value | -| --- | --- | -| Approved main base | `838eb2990905144a59830f1a16fe91b4e1105d4d` | -| Base tree | `f6d6c1d3c5ba5be0fb998a6fd157fcb31c63dc72` | -| Branch | `fix/ort-explicit-runtime-838eb299` | -| Qualified implementation commit | `524391ecec40b9f64432e20ca0f12dfd4c27375d` | -| Qualified implementation tree | `43b2ee46d8272bde323219650757ca7c149f7c3d` | -| Frozen S3 composition head | `493b935c6a41d4d4aeca8e8a66f10b4aba114365` | -| Frozen S3 tree | `ecb51f20c0740fa7d88e6d0eface06c45feb2e07` | - -The implementation commit's sole parent is the approved main base. The S3 -worktree remains clean at the frozen identity. No watcher, importer, S3 reader, -or acquisition manifest source changed. Parent coordination owns consumer pins, -PRs, review, and merges; no external reviewers were contacted. - -## Dependency and public contract - -`ort` and `ort-sys` remain at `2.0.0-rc.12`. The workspace disables defaults, -removes `download-binaries`, `copy-dylibs`, and `tls-native`, and selects -`load-dynamic`. Its resolved native binding uses `disable-linking`. Core adds -optional `libloading 0.9.0`, also selected by ORT's dynamic-loading feature. -There are ten removed lockfile packages and no retained package version changes. -The generated 0.7.0 notices/inventory were regenerated with the existing producer. - -Core's default `full` still includes `onnx-runtime`; RPC defaults still include -inference. Execution DTOs and public session signatures are unchanged. Metadata, -index, and import APIs remain outside the ONNX feature. Metadata-only consumers -can use `default-features = false` and enable only features their calls require. -Features are additive: parent consumer integration must audit the complete -resolved graph and reject another dependency enabling ORT downloading. - -Native SDK provisioning precedes application execution. The execution owner -selects an absolute `ORT_DYLIB_PATH`, or the exact platform-named library beside -the executable. Invalid explicit paths do not fall back to the packaged SDK. -There is no current-directory/system-basename discovery or network fallback. -`ORT_LIB_PATH`/`ORT_PREFER_DYNAMIC_LINK` no longer select this dynamic runtime. -The host owns ORT environment settings and selects the same process-wide SDK -before direct ORT calls; changing the SDK requires a process restart. - -Missing/invalid SDKs produce `Backend` errors with field `runtime_library`, -provisioning instructions, and an explicit no-download diagnostic. The pinned -ORT implementation can recursively initialize its native error machinery on -loader failure. Core therefore performs a narrow preflight through maintained -`libloading` and `ort-sys` ABI types before ORT adopts the library. It retains the -loader handle while checking the entry point, API base, version, and C API 24. -Unsafe operations are isolated to this private module with adjacent ABI/lifetime -proofs. A separately verified host SDK is trusted executable dependency code; -this is not a validator for arbitrary hostile libraries. - -The [development contract](../../../DEVELOPMENT.md) documents explicit SDK -verification and per-invocation loader configuration. The existing acquisition -owner handles any separately authorized setup transfer. The existing release -stager copies provisioned native files; it does not fetch them. Release operators -must record official archive/library hashes, target/version and notices, stage -the full SDK closure, and prove real inference in the extracted package. - -Primary upstream anchors: the exact `2.0.0-rc.12` tag commit -`f085e4c2516901ee606d1e10022142afa9348bf1` -[ort-sys build implementation](https://github.com/pykeio/ort/blob/f085e4c2516901ee606d1e10022142afa9348bf1/ort-sys/build/main.rs) -and Microsoft's [ONNX Runtime 1.24.2 release](https://github.com/microsoft/onnxruntime/releases/tag/v1.24.2). -The qualification SDK pin is 1.24.2/C API 24; no SDK was downloaded by this correction. - -## Verification and limits - -Local evidence is in `/workspace/scratch/ort-no-download/`; `verification.json`, -`dependency-delta.json`, `feature-inventory.json`, and `log-inventory.json` retain -commands, resolved features, source identity, trace results and log hashes. - -| Check | Result and scope | -| --- | --- | -| Feature matrix | 21 graphs passed across Linux x64, Windows x64 and macOS arm64; includes workspace defaults/all features/dev/build/bindings and explicit ONNX. Resolution evidence, not cross-platform execution. | -| Feature guard / release contract tests | 16 Node tests passed, including rejection of download feature unification and unsupported linking mode. | -| Cargo build without suppression | `cargo build --locked -p pumas-library` passed with a separate SDK-free target/cache; no `--offline` or ORT download-suppression variables. Rust crate sources had already been fetched normally. | -| Cargo ONNX tests without suppression | `cargo test --locked -p pumas-library onnx_runtime::` passed: 31 tests plus one subprocess marker ignored in the parent inventory. | -| Network trace | Both normal Cargo build and ONNX test traces exited zero with zero `AF_INET`/`AF_INET6` lines; SDK caches remained absent/empty. Resolved fingerprints have `load-dynamic`/`disable-linking` and no download capability. | -| Native failure regression | Six fresh-process cases passed within a 30-second child deadline: missing file, invalid binary, missing entry point, null API base, incompatible version, unsupported C API. Four synthetic Linux C fixtures use the installed compiler. | -| Default workspace tests | Passed: core 1767, app-manager 288, RPC 294 unit + 20 integration + 2 intent, UniFFI 17; remaining core integrations/doctests passed. Existing ignored tests and marker children are recorded in the log. Rustler host execution is outside this scope. | -| Core without defaults | 1740 unit tests and integrations/doctests passed without ONNX enabled. | -| SDK-free default RPC | Default build and health smoke passed with inference enabled; this proves startup/health, not actual inference. | -| Lint/format | Core all-target/all-feature Clippy with `-D warnings` passed. RPC equivalent passed with the existing scoped `-A dead_code` exception. Cargo formatting and whitespace checks passed. | -| Attribution | Producer emitted 365 notices; checker confirmed current inputs and pinned texts. This does not qualify a native SDK release closure. | - -Earlier failure logs are preserved as diagnosis: a loader error hung inside the -pinned ORT initialization before the preflight correction. Final logs have the -`final` names above and are distinguished in the receipt; those historical -failures are not current qualification results. Optional real-model tests lack -their fixtures locally and return early, so their harness success is not an -inference claim. - -The owner's prior separately verified official 1.24.2 installed-library success -remains valid at its earlier scope. Its SDK/archive evidence is not available in -this worktree and was not requalified against this implementation. Positive -native loading/inference on this new head needs that verified SDK, the model -fixtures and their licenses/hashes. Windows/macOS execution and extracted full -desktop package inference remain separate acceptance work. - -## Existing S3 qualification and next inputs - -The independent -[frozen S3 qualification record](https://github.com/MrScripty/Pumas-Library/blob/493b935c6a41d4d4aeca8e8a66f10b4aba114365/docs/plans/artifact-acquisition/reports/s3-composed-provider-qualification-2026-10-05.md) -retains the authenticated/anonymous fixture, signature/token, native-owner and -Linux installed RPC evidence. This branch neither replaces nor broadens it. -Real-provider and full shipping-platform acceptance remain pending: - -- MinIO needs an approved official module/dependency route or a preinstalled, - versioned official service; the previous official download route returned 403. - No alternate mirror or network bypass was used. -- AWS and a named non-AWS provider need an authorized test endpoint/region, - addressing/versioning facts, exact VersionIds and trusted hashes, and a scoped - test-owner credential/token procedure. No real credentials were obtained or - provisioned in this task. -- Actual browser/Electron flow needs a supported sandbox environment; the prior - sandbox-helper ownership failure was not bypassed. Platform shipping claims - need their actual hosts/packages and model/runtime closures. - -The next existing acquisition-plan feature is completion of **Q3 real-provider -acceptance**, including credential-expiry/provider behavior, then **Q4 installed -and shipping-platform qualification**. Runtime **R1** remains gated by its -target-scoped AQ-HTTP acceptance. This correction does not advance those gates. - -## Independent review portability successor - -Review of frozen checkpoint `10fe0bb2d92c8ef147a328803a3425672ac30bdb` -found one test portability defect: its expected tempfile path was not -canonicalized, while production intentionally returns the canonical path. -Symlinked temporary roots, including the common macOS layout, could therefore -fail the assertion despite a correct result. The narrow successor canonicalizes -the expected path and adds an explicit Unix symlink-directory regression. -Production loading, dependency features, runtime selection, and public APIs are -unchanged. The provenance anchor above now names the exact rc.12 tag commit. - -The preserved qualified implementation's test binary reproduced the original -assertion failure under an owned symlinked `TMPDIR` (expected exit 101). Both -focused native-library tests pass on the successor with ordinary and symlinked -temporary roots; Cargo formatting/whitespace checks also pass. This qualifies -the test/documentation correction on Linux. The Unix regression also targets macOS -semantics, but macOS execution is not claimed. Logs and exact successor identity -are retained at `/workspace/scratch/ort-path-review/`; parent coordination owns -Pantograph propagation and positive SDK/inference qualification. Q3 work is not -included in this successor. diff --git a/docs/plans/s3-sharded-protocol-cohort-2026-10-08.md b/docs/plans/s3-sharded-protocol-cohort-2026-10-08.md deleted file mode 100644 index b356a16ed..000000000 --- a/docs/plans/s3-sharded-protocol-cohort-2026-10-08.md +++ /dev/null @@ -1,42 +0,0 @@ -# Authenticated S3 sharded protocol cohort - -This report describes focused synthetic protocol qualification of the shared format-independent acquisition/import bridge with a supported sharded safetensors package. It exercises existing transfer, receipt and publication interfaces without adding a storage service or runtime adapter. - -## Real-service acceptance remains open - -The original [S3 brief](../breif/s3-model-fetch.md) requires AWS S3, an independent compatible service, and local MinIO. Existing controlled HTTP/TLS tests do not fulfill those provider requirements. The [earlier provider report](artifact-acquisition/reports/s3-composed-provider-qualification-2026-10-05.md) already records the MinIO official-source HTTP 403 installation blocker. - -Real-service tests were not executed because no supported local S3 service was available in the qualification environment. The recorded official MinIO source access returned HTTP 403; a separate official SeaweedFS release metadata request also failed with HTTP 403 before any service binary was downloaded. These environment blockers do not establish interoperability or a provider defect. - -## Bounded fallback - -`scripts/tests/qualify-s3-sharded-cohort.py` drives the new ignored `s3_sharded_cohort` Rust integration test. Python's standard-library TLS server is explicitly a synthetic protocol oracle. It creates owned real safetensors bytes (two named FLOAT32 tensors), config, tokenizer, and weight index files. It independently checks every production AWS SDK SigV4 signature using standard-library HMAC/SHA-256, an RFC 4231 known answer, and a wrong-secret negative check. Its fixed access/secret/session strings are synthetic and never sent outside literal loopback. - -The complete case performs bounded two-object pages, conditional latest HEAD pins, explicit versioned HEAD selection, conditional range reads, a deliberately truncated first shard body, and retry at exactly retained offset 4096. Every resumed request retains the selected version and ETag. Supplied independent SHA-256 values become verified file receipts before the shared importer qualifies the package. The index names both present shards; config and tokenizer members are present. Atomic publication is checked by exact installed bytes, Ready import state, adopted acquisition, exact consumer receipt, and cold-open receipt equality. This proves import qualification and publication, not inference or backend compatibility. - -The missing-shard case transfers and verifies every selected member, then rejects the index's absent required shard without a registered model or adopted acquisition. The arbitrary `.dat` case similarly verifies arbitrary bytes while refusing model publication. The cancellation case waits for actual shard-body progress before requesting cancellation, checks terminal Cancelled, incomplete verified membership, no completion receipt, and no registered model, and awaits owned shutdown. - -Receipt checks bind acquisition ID, use lease, owner, demand operation, workspace, complete manifest, verified membership, and exact import specification. Refusals require the specific shared qualification Validation error and retained Using custody with the issued receipt. Successful publication requires a confirmed metadata identity and the matching Confirmed version-2 publication document containing the exact acquisition receipt. The actual import future is dropped, then the old API is shut down and dropped before reopening; cold metadata identity, receipt, and publication-document bytes must match. - -TLS verification remains enabled. The existing repository test CA is trusted only by the Cargo child through its environment; global trust and network configuration are unchanged. The private fixture key is extracted into a temporary owned directory and removed with the fixture. Credentials, Authorization headers, and the private key are excluded from request evidence. The isolated registry uses the test's own directory. - -## Reproduce - -With official Rust dependencies already available and Python 3/OpenSSL installed: - -```sh -ORT_SKIP_DOWNLOAD=1 CARGO_INCREMENTAL=0 CARGO_BUILD_JOBS=2 \ - python3 scripts/tests/qualify-s3-sharded-cohort.py --output /tmp/pumas-s3-cohort-evidence -``` - -The runner uses locked offline Cargo with `--no-default-features --features s3`. The Rust test is ignored in ordinary test discovery because it requires this external owned fixture and isolated CA trust. The runner executes it explicitly with `--ignored`; successful output includes the exact Cargo command, sanitized request transcript, object digests, independent fixture failures, and evidence classification. The runner records scoped command output and fixture classifications for reproduction. - -## Executed checks - -The explicit ignored integration test passed all four cases across 61 independently signed requests. Resume used offset 4096, the oracle recorded no failures, and a wrong-secret check rejected every request. All four existing `s3_model_bridge` integration tests passed. Targeted strict Clippy, Cargo formatting, Python byte compilation and whitespace checks passed. This qualification changes no production code or dependencies; no new full-suite or real-provider run is claimed. Scoped checks had no baseline failures. - -## Remaining production gaps - -Actual AWS/non-AWS/MinIO interoperability, real version creation/storage, provider pagination/error behavior, and provider process loss are still unqualified here. The Python fixture does not implement a storage service. Listing plus conditional pinning is an observation, not an atomic multi-object snapshot; caller-authorized exact members and SHA-256 evidence remain required. The composed cohort covers a supported Transformers safetensors package and refusal cases, not every supported format. No unknown format is declared runnable, no downloaded custom code is executed, and no inference is performed. Existing shared receipt/recovery owners retain failed or interrupted custody; this work introduces no cleanup or recovery policy. - -Run the Python driver explicitly to count the ignored cohort as executed. Its package cases require the shared safetensors importer, descriptor/receipt handoff and existing S3 selection/transfer interfaces. Keep real-provider acceptance open until supported service dependencies and actual provider tests are available. diff --git a/docs/plans/torch-cross-platform-runtime-management/execution-ledger.md b/docs/plans/torch-cross-platform-runtime-management/execution-ledger.md index ef79e99f7..d275e3a8e 100644 --- a/docs/plans/torch-cross-platform-runtime-management/execution-ledger.md +++ b/docs/plans/torch-cross-platform-runtime-management/execution-ledger.md @@ -471,7 +471,9 @@ stopped by its owned generation; and RPC shutdown and process exit succeeded. - Retained `runtime.json`, exact `resolution.json`, `pip-resolution.json`, `probe-results.json`, `acceptance.json`, and `rpc.log` in - [the v2.14.0 evidence directory](reports/v2.14.0-linux-cpu-rpc-acceptance/). + `reports/v2.14.0-linux-cpu-rpc-acceptance/` (superseded by the restart and + current-source acceptance runs; removed in the v0.8.0 cleanup and available + in Git history at `78c52fcf`). The temporary runtime root was deleted after those files were collected. - Added an opt-in `torch-native-e2e` CI matrix for Ubuntu 24.04, Windows 2025, and macOS 15, gated to manual dispatch or version-tag builds. It builds native diff --git a/docs/plans/torch-cross-platform-runtime-management/plan.md b/docs/plans/torch-cross-platform-runtime-management/plan.md index 57ef1200f..7c042035d 100644 --- a/docs/plans/torch-cross-platform-runtime-management/plan.md +++ b/docs/plans/torch-cross-platform-runtime-management/plan.md @@ -9,6 +9,28 @@ runtime management on 2026-09-24, retaining the existing Linux support. On 2026-09-25, the owner authorized Pumas-managed CPython provisioning and removed the requirement for a host-installed Python interpreter or a user Python choice. +**Status review (2026-11-04, v0.8.0):** Still `Active`; no slice of this plan +has landed since 2026-09-29, and every remaining gate below is still open. The +v0.8.0 desktop packages contain this manager source, but v0.8.0 qualification +does not exercise Torch installation: `torch-native-e2e` is not a dependency of +the `release-candidate` job, and candidate builds omit it (see +[Releasing](../../../RELEASING.md)). v0.8.0 therefore accepts none of X1–X8. +The [missing declared CPython license references](reports/managed-python-license-collection/missing-declared-license-references.md) +blocker is also still open: the hosted `torch-native-e2e` runs recorded in the +artifact-acquisition ledger (Builds 36934392505 through 36995870643) failed on +all three targets during CPython 3.14.7 full-archive license collection +(declared `LICENSE.zstd.txt` absent everywhere, `LICENSE.zlib-ng.txt` also +absent on Linux and macOS). The superseded Linux +`torch-upstream-version-management` plan, the completed +`torch-diffusion-serving` (Tuldok image) plan, and the accepted +`torch-image-provider-contract` plan were removed from the working tree in the +v0.8.0 documentation cleanup; their evidence remains in Git history at +`78c52fcf`. Their durable decisions live in +[ADR 0002](../../adr/0002-torch-image-provider-protocol.md), +[generation lifetime](../../contracts/generation-lifetime.md), +[image generation](../../contracts/image-generation.md), and the +[Torch sidecar README](../../../torch-server/README.md). + **Current acceptance:** Manual native run [36229508586](https://github.com/MrScripty/Pumas-Library/actions/runs/36229508586) on runtime commit `21041697` passed the current v2.14.0 CPU/Core RPC installation @@ -131,8 +153,9 @@ update the public toolbar-linked package. **Next slice:** Verify the rebuilt Linux direct-install candidate, then run packaged install acceptance on Windows and macOS and close provider cancellation/tamper gates. Keep Tuldok qualification limited to its recorded -exact image-generation tuple; publish a new toolbar-linked release only after -the PR is merged and a new version is tagged. +exact image-generation tuple. v0.8.0 ships this source without these gates; +a later release may claim packaged Torch installation only after they pass on +its exact candidate. ## Objective and scope @@ -162,9 +185,13 @@ stable standard-CPython wheel, and complete dependency resolution exist. It does not promise a wheel for every release or every supported host. Source builds and unqualified adapters remain outside this objective. -The current accepted Linux contract remains the regression baseline in the -[upstream version-management plan](../torch-upstream-version-management/plan.md) -and its [runtime inventory](../torch-diffusion-serving/reports/upstream-version-manager-progress.md). +The accepted Linux upstream version-management contract (U1–U6: complete +stable-tag discovery within a 20-page / 120-second listing budget, exact +official-wheel resolution, staged install, explicit selection/start/stop) is +the regression baseline. Its plan and runtime inventory were removed in the +v0.8.0 cleanup and remain in Git history at `78c52fcf` +(`docs/plans/torch-upstream-version-management/plan.md` and +`docs/plans/torch-diffusion-serving/reports/upstream-version-manager-progress.md`). Native RPC acceptance now proves the v2.14.0 CPU/Core managed install and restart path on Windows x64 and macOS arm64 as well as Linux x86_64. Broader platform acceptance remains gated on the incomplete X2–X7 checks below, @@ -478,9 +505,11 @@ and unit fixtures do not substitute for the Windows/macOS runtime claims. - **Goal:** Collect target-native resolver/install/lifecycle/packaged desktop evidence for managed Python and update the existing Torch inventory without broadening Tuldok claims. -- **Write set:** New plan evidence/report; relevant sections of - `docs/plans/torch-diffusion-serving/reports/upstream-version-manager-progress.md`; - execution ledger. Existing historical model reports remain unchanged. +- **Write set:** New plan evidence/report under this plan's `reports/`; + execution ledger. The former Torch runtime inventory in + `docs/plans/torch-diffusion-serving/reports/` was removed in the v0.8.0 + cleanup (Git history at `78c52fcf`); record new inventory here instead. + Historical model reports remain unchanged in history. - **Verification:** Every X1–X7 claim has an evidence environment, execution mode, result, and link. Reuse read-only review for any lifecycle/security repair. diff --git a/docs/plans/torch-cross-platform-runtime-management/reports/v2.14.0-linux-cpu-rpc-acceptance/acceptance.json b/docs/plans/torch-cross-platform-runtime-management/reports/v2.14.0-linux-cpu-rpc-acceptance/acceptance.json deleted file mode 100644 index da76db543..000000000 --- a/docs/plans/torch-cross-platform-runtime-management/reports/v2.14.0-linux-cpu-rpc-acceptance/acceptance.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "architecture": "x86_64", - "artifact_count": 25, - "build": "cpu", - "cleanup_safe": true, - "cpython_version": "3.14.7", - "platform": "linux", - "probe": "passed", - "provider": "uv", - "provider_archive_sha256": "89eadd7c76fc063887959510d5ba0ab1264dfd5f1143b925ddb73021a40acf16", - "provider_version": "0.12.18", - "python": "python3.14", - "release": "v2.14.0", - "sidecar_generation": "1", - "sidecar_protocol": 3, - "stop_result": true, - "stopped": true, - "success": true, - "target": "x86_64-unknown-linux-gnu", - "trial": "passed" -} diff --git a/docs/plans/torch-cross-platform-runtime-management/reports/v2.14.0-linux-cpu-rpc-acceptance/pip-resolution.json b/docs/plans/torch-cross-platform-runtime-management/reports/v2.14.0-linux-cpu-rpc-acceptance/pip-resolution.json deleted file mode 100644 index 01a28e8e2..000000000 --- a/docs/plans/torch-cross-platform-runtime-management/reports/v2.14.0-linux-cpu-rpc-acceptance/pip-resolution.json +++ /dev/null @@ -1,2057 +0,0 @@ -{ - "version": "1", - "pip_version": "26.2.1", - "install": [ - { - "download_info": { - "url": "https://download-r2.pytorch.org/whl/cpu/torch-2.14.0%2Bcpu-cp314-cp314-manylinux_2_28_x86_64.whl", - "archive_info": { - "hashes": { - "sha256": "f152f41dc5dc462afe0de780e451ebb47ea8b4451f8f919f9537aa8e2cbe1d7e" - }, - "hash": "sha256=f152f41dc5dc462afe0de780e451ebb47ea8b4451f8f919f9537aa8e2cbe1d7e" - } - }, - "is_direct": false, - "is_yanked": false, - "requested": true, - "metadata": { - "metadata_version": "2.4", - "name": "torch", - "version": "2.14.0+cpu", - "summary": "Tensors and Dynamic neural networks in Python with strong GPU acceleration", - "description": "\n \n \n \"PyTorch\n\n\n--------------------------------------------------------------------------------\n\nPyTorch is a Python package that provides two high-level features:\n- Tensor computation (like NumPy) with strong GPU acceleration\n- Deep neural networks built on a tape-based autograd system\n\nYou can reuse your favorite Python packages such as NumPy, SciPy, and Cython to extend PyTorch when needed.\n\nOur trunk health (Continuous Integration signals) can be found at [hud.pytorch.org](https://hud.pytorch.org/ci/pytorch/pytorch/main).\n\n\n\n- [More About PyTorch](#more-about-pytorch)\n - [A GPU-Ready Tensor Library](#a-gpu-ready-tensor-library)\n - [Dynamic Neural Networks: Tape-Based Autograd](#dynamic-neural-networks-tape-based-autograd)\n - [Python First](#python-first)\n - [Imperative Experiences](#imperative-experiences)\n - [Fast and Lean](#fast-and-lean)\n - [Extensions Without Pain](#extensions-without-pain)\n- [Installation](#installation)\n - [Binaries](#binaries)\n - [NVIDIA Jetson Platforms](#nvidia-jetson-platforms)\n - [From Source](#from-source)\n - [Prerequisites](#prerequisites)\n - [NVIDIA CUDA Support](#nvidia-cuda-support)\n - [AMD ROCm Support](#amd-rocm-support)\n - [Intel GPU Support](#intel-gpu-support)\n - [Get the PyTorch Source](#get-the-pytorch-source)\n - [Install Dependencies](#install-dependencies)\n - [Install PyTorch](#install-pytorch)\n - [Adjust Build Options (Optional)](#adjust-build-options-optional)\n - [Docker Image](#docker-image)\n - [Using pre-built images](#using-pre-built-images)\n - [Building the image yourself](#building-the-image-yourself)\n - [Building the Documentation](#building-the-documentation)\n - [Troubleshooting CI Errors](#troubleshooting-ci-errors)\n - [Building a PDF](#building-a-pdf)\n - [Previous Versions](#previous-versions)\n- [Getting Started](#getting-started)\n- [Resources](#resources)\n- [Communication](#communication)\n- [Releases and Contributing](#releases-and-contributing)\n- [The Team](#the-team)\n- [License](#license)\n\n\n\n## More About PyTorch\n\n[Learn the basics of PyTorch](https://pytorch.org/tutorials/beginner/basics/intro.html)\n\nAt a granular level, PyTorch is a library that consists of the following components:\n\n| Component | Description |\n| ---- | --- |\n| [**torch**](https://pytorch.org/docs/stable/torch.html) | A Tensor library like NumPy, with strong GPU support |\n| [**torch.autograd**](https://pytorch.org/docs/stable/autograd.html) | A tape-based automatic differentiation library that supports all differentiable Tensor operations in torch |\n| [**torch.jit**](https://pytorch.org/docs/stable/jit.html) | A compilation stack (TorchScript) to create serializable and optimizable models from PyTorch code |\n| [**torch.nn**](https://pytorch.org/docs/stable/nn.html) | A neural networks library deeply integrated with autograd designed for maximum flexibility |\n| [**torch.multiprocessing**](https://pytorch.org/docs/stable/multiprocessing.html) | Python multiprocessing, but with magical memory sharing of torch Tensors across processes. Useful for data loading and Hogwild training |\n| [**torch.utils**](https://pytorch.org/docs/stable/data.html) | DataLoader and other utility functions for convenience |\n\nUsually, PyTorch is used either as:\n\n- A replacement for NumPy to use the power of GPUs.\n- A deep learning research platform that provides maximum flexibility and speed.\n\nElaborating Further:\n\n### A GPU-Ready Tensor Library\n\nIf you use NumPy, then you have used Tensors (a.k.a. ndarray).\n\n![Tensor illustration](https://github.com/pytorch/pytorch/raw/main/docs/source/_static/img/tensor_illustration.png)\n\nPyTorch provides Tensors that can live either on the CPU or the GPU and accelerates the\ncomputation by a huge amount.\n\nWe provide a wide variety of tensor routines to accelerate and fit your scientific computation needs\nsuch as slicing, indexing, mathematical operations, linear algebra, reductions.\nAnd they are fast!\n\n### Dynamic Neural Networks: Tape-Based Autograd\n\nPyTorch has a unique way of building neural networks: using and replaying a tape recorder.\n\nMost frameworks such as TensorFlow, Theano, Caffe, and CNTK have a static view of the world.\nOne has to build a neural network and reuse the same structure again and again.\nChanging the way the network behaves means that one has to start from scratch.\n\nWith PyTorch, we use a technique called reverse-mode auto-differentiation, which allows you to\nchange the way your network behaves arbitrarily with zero lag or overhead. Our inspiration comes\nfrom several research papers on this topic, as well as current and past work such as\n[torch-autograd](https://github.com/twitter/torch-autograd),\n[autograd](https://github.com/HIPS/autograd),\n[Chainer](https://chainer.org), etc.\n\nWhile this technique is not unique to PyTorch, it's one of the fastest implementations of it to date.\nYou get the best of speed and flexibility for your crazy research.\n\n![Dynamic graph](https://github.com/pytorch/pytorch/raw/main/docs/source/_static/img/dynamic_graph.gif)\n\n### Python First\n\nPyTorch is not a Python binding into a monolithic C++ framework.\nIt is built to be deeply integrated into Python.\nYou can use it naturally like you would use [NumPy](https://www.numpy.org/) / [SciPy](https://www.scipy.org/) / [scikit-learn](https://scikit-learn.org) etc.\nYou can write your new neural network layers in Python itself, using your favorite libraries\nand use packages such as [Cython](https://cython.org/) and [Numba](https://numba.pydata.org/).\nOur goal is to not reinvent the wheel where appropriate.\n\n### Imperative Experiences\n\nPyTorch is designed to be intuitive, linear in thought, and easy to use.\nWhen you execute a line of code, it gets executed. There isn't an asynchronous view of the world.\nWhen you drop into a debugger or receive error messages and stack traces, understanding them is straightforward.\nThe stack trace points to exactly where your code was defined.\nWe hope you never spend hours debugging your code because of bad stack traces or asynchronous and opaque execution engines.\n\n### Fast and Lean\n\nPyTorch has minimal framework overhead. We integrate acceleration libraries\nsuch as [Intel MKL](https://software.intel.com/mkl) and NVIDIA ([cuDNN](https://developer.nvidia.com/cudnn), [NCCL](https://developer.nvidia.com/nccl)) to maximize speed.\nAt the core, its CPU and GPU Tensor and neural network backends\nare mature and have been tested for years.\n\nHence, PyTorch is quite fast — whether you run small or large neural networks.\n\nThe memory usage in PyTorch is extremely efficient compared to Torch or some of the alternatives.\nWe've written custom memory allocators for the GPU to make sure that\nyour deep learning models are maximally memory efficient.\nThis enables you to train bigger deep learning models than before.\n\n### Extensions Without Pain\n\nWriting new neural network modules, or interfacing with PyTorch's Tensor API, was designed to be straightforward\nand with minimal abstractions.\n\nYou can write new neural network layers in Python using the torch API\n[or your favorite NumPy-based libraries such as SciPy](https://pytorch.org/tutorials/advanced/numpy_extensions_tutorial.html).\n\nIf you want to write your layers in C/C++, we provide a convenient extension API that is efficient and with minimal boilerplate.\nNo wrapper code needs to be written. You can see [a tutorial here](https://pytorch.org/tutorials/advanced/cpp_extension.html) and [an example here](https://github.com/pytorch/extension-cpp).\n\n\n## Installation\n\n### Binaries\nCommands to install binaries via Conda or pip wheels are on our website: [https://pytorch.org/get-started/locally/](https://pytorch.org/get-started/locally/)\n\n\n#### NVIDIA Jetson Platforms\n\nPython wheels for NVIDIA's Jetson Nano, Jetson TX1/TX2, Jetson Xavier NX/AGX, and Jetson AGX Orin are provided [here](https://forums.developer.nvidia.com/t/pytorch-for-jetson-version-1-10-now-available/72048) and the L4T container is published [here](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/l4t-pytorch)\n\nThey require JetPack 4.2 and above, and [@dusty-nv](https://github.com/dusty-nv) and [@ptrblck](https://github.com/ptrblck) are maintaining them.\n\n\n### From Source\n\n#### Prerequisites\nIf you are installing from source, you will need:\n- Python 3.10 or later\n- A compiler that fully supports C++20, such as clang or gcc (gcc 11.3.0 or newer is required, on Linux)\n- Visual Studio or Visual Studio Build Tool (Windows only)\n- At least 10 GB of free disk space\n- 30-60 minutes for the initial build (subsequent rebuilds are much faster)\n\n\\* PyTorch CI uses Visual C++ BuildTools, which come with Visual Studio Enterprise,\nProfessional, or Community Editions. You can also install the build tools from\nhttps://visualstudio.microsoft.com/visual-cpp-build-tools/. The build tools *do not*\ncome with Visual Studio Code by default.\n\nAn example of environment setup is shown below:\n\n* Linux:\n\n```bash\n$ source /bin/activate\n$ conda create -y -n \n$ conda activate \n```\n* Windows:\n\n```bash\n$ source \\Scripts\\activate.bat\n$ conda create -y -n \n$ conda activate \n$ call \"C:\\Program Files\\Microsoft Visual Studio\\\\Community\\VC\\Auxiliary\\Build\\vcvarsall.bat\" x64\n```\n\nA conda environment is not required. You can also do a PyTorch build in a\nstandard virtual environment, e.g., created with tools like `uv`, provided\nyour system has installed all the necessary dependencies unavailable as pip\npackages (e.g., CUDA, MKL.)\n\n##### NVIDIA CUDA Support\nIf you want to compile with CUDA support, [select a supported version of CUDA from our support matrix](https://pytorch.org/get-started/locally/), then install the following:\n- [NVIDIA CUDA](https://developer.nvidia.com/cuda-downloads)\n- [NVIDIA cuDNN](https://developer.nvidia.com/cudnn) v9.0 or above\n- [Compiler](https://gist.github.com/ax3l/9489132) compatible with CUDA\n\nNote: You could refer to the [cuDNN Support Matrix](https://docs.nvidia.com/deeplearning/cudnn/backend/latest/reference/support-matrix.html) for cuDNN versions with the various supported CUDA, CUDA driver, and NVIDIA hardware.\n\nIf you want to disable CUDA support, export the environment variable `USE_CUDA=0`.\nOther potentially useful environment variables are documented in `cmake/EnvVarForwarding.cmake`. If\nCUDA is installed in a non-standard location, set PATH so that the nvcc you\nwant to use can be found (e.g., `export PATH=/usr/local/cuda-12.8/bin:$PATH`).\n\nIf you are building for NVIDIA's Jetson platforms (Jetson Nano, TX1, TX2, AGX Xavier), Instructions to install PyTorch for Jetson Nano are [available here](https://devtalk.nvidia.com/default/topic/1049071/jetson-nano/pytorch-for-jetson-nano/)\n\n##### AMD ROCm Support\nIf you want to compile with ROCm support, install\n- [AMD ROCm](https://rocm.docs.amd.com/en/latest/deploy/linux/quick_start.html) 4.0 and above installation\n- ROCm is currently supported only for Linux systems.\n\nBy default the build system expects ROCm to be installed in `/opt/rocm`. If ROCm is installed in a different directory, the `ROCM_PATH` environment variable must be set to the ROCm installation directory. The build system automatically detects the AMD GPU architecture. Optionally, the AMD GPU architecture can be explicitly set with the `PYTORCH_ROCM_ARCH` environment variable [AMD GPU architecture](https://rocm.docs.amd.com/projects/install-on-linux/en/latest/reference/system-requirements.html#supported-gpus)\n\nIf you want to disable ROCm support, export the environment variable `USE_ROCM=0`.\nOther potentially useful environment variables are documented in `cmake/EnvVarForwarding.cmake`.\n\n##### Intel GPU Support\nIf you want to compile with Intel GPU support, follow these\n- [PyTorch Prerequisites for Intel GPUs](https://www.intel.com/content/www/us/en/developer/articles/tool/pytorch-prerequisites-for-intel-gpu.html) instructions.\n- Intel GPU is supported for Linux and Windows.\n\nIf you want to disable Intel GPU support, export the environment variable `USE_XPU=0`.\nOther potentially useful environment variables are documented in `cmake/EnvVarForwarding.cmake`.\n\n#### Get the PyTorch Source\n\n```bash\ngit clone https://github.com/pytorch/pytorch\ncd pytorch\n# if you are updating an existing checkout\ngit submodule sync\ngit submodule update --init --recursive\n```\n\n#### Install Dependencies\n\n**Common**\n\n```bash\n# Run this command from the PyTorch directory after cloning the source code using the “Get the PyTorch Source“ section above\npip install --group dev\n```\n\n**On Linux**\n\n```bash\npip install mkl-static mkl-include\n# CUDA only: Add LAPACK support for the GPU if needed\n# magma installation: run with active conda environment. specify CUDA version to install\n.ci/docker/common/install_magma_conda.sh 12.4\n\n# (optional) If using torch.compile with inductor/triton, install the matching version of triton\n# Run from the pytorch directory after cloning\n# For Intel GPU support, please explicitly `export USE_XPU=1` before running command.\nmake triton\n```\n\n**On Windows**\n\n```bash\npip install mkl-static mkl-include\n# Add these packages if torch.distributed is needed.\n# Distributed package support on Windows is a prototype feature and is subject to changes.\nconda install -c conda-forge libuv=1.51\n```\n\n#### Install PyTorch\n\n**On Linux**\n\nIf you're compiling for AMD ROCm then first run this command:\n\n```bash\n# Only run this if you're compiling for ROCm\npython tools/amd_build/build_amd.py\n```\n\nInstall PyTorch\n\n```bash\n# the CMake prefix for conda environment\nexport CMAKE_PREFIX_PATH=\"${CONDA_PREFIX:-'$(dirname $(which conda))/../'}:${CMAKE_PREFIX_PATH}\"\npython -m pip install --no-build-isolation -v -e .\n\n# the CMake prefix for non-conda environment, e.g. Python venv\n# call following after activating the venv\nexport CMAKE_PREFIX_PATH=\"${VIRTUAL_ENV}:${CMAKE_PREFIX_PATH}\"\n```\n\n**On macOS**\n\n```bash\npython -m pip install --no-build-isolation -v -e .\n```\n\n**On Windows**\n\nIf you want to build legacy python code, please refer to [Building on legacy code and CUDA](https://github.com/pytorch/pytorch/blob/main/CONTRIBUTING.md#building-on-legacy-code-and-cuda)\n\n**CPU-only builds**\n\nIn this mode PyTorch computations will run on your CPU, not your GPU.\n\n```cmd\npython -m pip install --no-build-isolation -v -e .\n```\n\nNote on OpenMP: The desired OpenMP implementation is Intel OpenMP (iomp). In order to link against iomp, you'll need to manually download the library and set up the building environment by tweaking `CMAKE_INCLUDE_PATH` and `LIB`. The instruction [here](https://docs.pytorch.org/docs/main/notes/windows.html#building-from-source) is an example for setting up both MKL and Intel OpenMP. Without these configurations for CMake, Microsoft Visual C OpenMP runtime (vcomp) will be used.\n\n**CUDA based build**\n\nIn this mode PyTorch computations will leverage your GPU via CUDA for faster number crunching\n\n[NVTX](https://docs.nvidia.com/gameworks/content/gameworkslibrary/nvtx/nvidia_tools_extension_library_nvtx.htm) is needed to build PyTorch with CUDA.\nNVTX is a part of CUDA distributive, where it is called \"Nsight Compute\". To install it onto an already installed CUDA run CUDA installation once again and check the corresponding checkbox.\nMake sure that CUDA with Nsight Compute is installed after Visual Studio.\n\nCurrently, VS 2017 / 2019, and Ninja are supported as the generator of CMake. If `ninja.exe` is detected in `PATH`, then Ninja will be used as the default generator, otherwise, it will use VS 2017 / 2019.\n
If Ninja is selected as the generator, the latest MSVC will get selected as the underlying toolchain.\n\nAdditional libraries such as\n[Magma](https://developer.nvidia.com/magma), [oneDNN, a.k.a. MKLDNN or DNNL](https://github.com/oneapi-src/oneDNN), and [Sccache](https://github.com/mozilla/sccache) are often needed. Please refer to the [installation-helper](https://github.com/pytorch/pytorch/tree/main/.ci/pytorch/win-test-helpers/installation-helpers) to install them.\n\nYou can refer to the [build_pytorch.bat](https://github.com/pytorch/pytorch/blob/main/.ci/pytorch/win-test-helpers/build_pytorch.bat) script for some other environment variables configurations\n\n```cmd\ncmd\n\n:: Set the environment variables after you have downloaded and unzipped the mkl package,\n:: else CMake would throw an error as `Could NOT find OpenMP`.\nset CMAKE_INCLUDE_PATH={Your directory}\\mkl\\include\nset LIB={Your directory}\\mkl\\lib;%LIB%\n\n:: Read the content in the previous section carefully before you proceed.\n:: [Optional] If you want to override the underlying toolset used by Ninja and Visual Studio with CUDA, please run the following script block.\n:: \"Visual Studio 2019 Developer Command Prompt\" will be run automatically.\n:: Make sure you have CMake >= 3.12 before you do this when you use the Visual Studio generator.\nset CMAKE_GENERATOR_TOOLSET_VERSION=14.27\nset DISTUTILS_USE_SDK=1\nfor /f \"usebackq tokens=*\" %i in (`\"%ProgramFiles(x86)%\\Microsoft Visual Studio\\Installer\\vswhere.exe\" -version [15^,17^) -products * -latest -property installationPath`) do call \"%i\\VC\\Auxiliary\\Build\\vcvarsall.bat\" x64 -vcvars_ver=%CMAKE_GENERATOR_TOOLSET_VERSION%\n\n:: [Optional] If you want to override the CUDA host compiler\nset CUDAHOSTCXX=C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.27.29110\\bin\\HostX64\\x64\\cl.exe\n\npython -m pip install --no-build-isolation -v -e .\n```\n\n**Intel GPU builds**\n\nIn this mode PyTorch with Intel GPU support will be built.\n\nPlease make sure [the common prerequisites](#prerequisites) as well as [the prerequisites for Intel GPU](#intel-gpu-support) are properly installed and the environment variables are configured prior to starting the build. For build tool support, `Visual Studio 2022` is required.\n\nThen PyTorch can be built with the command:\n\n```cmd\n:: CMD Commands:\n:: Set the CMAKE_PREFIX_PATH to help find corresponding packages\n:: %CONDA_PREFIX% only works after `conda activate custom_env`\n\nif defined CMAKE_PREFIX_PATH (\n set \"CMAKE_PREFIX_PATH=%CONDA_PREFIX%\\Library;%CMAKE_PREFIX_PATH%\"\n) else (\n set \"CMAKE_PREFIX_PATH=%CONDA_PREFIX%\\Library\"\n)\n\npython -m pip install --no-build-isolation -v -e .\n```\n\n##### Adjust Build Options (Optional)\n\nYou can adjust the configuration of CMake variables through environment variables, which the\nbuild forwards to CMake (see [`cmake/EnvVarForwarding.cmake`](./cmake/EnvVarForwarding.cmake) for\nthe full list). For example, pointing the build at a specific Conda prefix, CuDNN, or BLAS:\n\nOn Linux\n\n```bash\nexport CMAKE_PREFIX_PATH=\"${CONDA_PREFIX:-'$(dirname $(which conda))/../'}:${CMAKE_PREFIX_PATH}\"\nspin develop\n```\n\nOn macOS\n\n```bash\nexport CMAKE_PREFIX_PATH=\"${CONDA_PREFIX:-'$(dirname $(which conda))/../'}:${CMAKE_PREFIX_PATH}\"\nMACOSX_DEPLOYMENT_TARGET=11.0 spin develop\n```\n\nAfter a first `spin develop`, you can inspect or adjust the CMake cache interactively with\n`ccmake build` (or `cmake-gui build`) and rebuild with `spin develop`; your edits persist, because\nreconfiguration does not use `--fresh` and environment variables only seed cache entries that are\nnot already set. The corollary: once a variable is in the cache, changing its environment variable\nno longer affects it -- edit the cache directly (or delete `build/CMakeCache.txt`) to change it.\nThe build type and compiler are the exception; the build always re-applies them.\n\n### Docker Image\n\n#### Using pre-built images\n\nYou can also pull a pre-built docker image from Docker Hub and run with docker v23.0+\n\n```bash\ndocker run --gpus all --rm -ti --ipc=host pytorch/pytorch:latest\n```\n\nPlease note that PyTorch uses shared memory to share data between processes, so if torch multiprocessing is used (e.g.\nfor multithreaded data loaders) the default shared memory segment size that container runs with is not enough, and you\nshould increase shared memory size either with `--ipc=host` or `--shm-size` command line options to `nvidia-docker run`.\n\n#### Building the image yourself\n\n**NOTE:** Must be built with a Docker version >= 23.0\n\nThe Dockerfile is supplied to build images with CUDA 12.6 support and cuDNN v9.\nYou can pass `PYTHON_VERSION=x.y` make variable to specify which Python version is to be used by Miniconda, or leave it\nunset to use the default, as the Dockerfile uses system Python.\n\n```bash\nmake -f docker.Makefile\n# images are tagged as docker.io/${your_docker_username}/pytorch\n```\n\nYou can also pass the `CMAKE_VARS=\"...\"` environment variable to specify additional CMake variables to be passed to CMake during the build.\nSee [`cmake/EnvVarForwarding.cmake`](./cmake/EnvVarForwarding.cmake) for the list of available variables.\n\n```bash\nmake -f docker.Makefile\n```\n\n### Building the Documentation\n\nTo build documentation in various formats, you will need [Sphinx](https://www.sphinx-doc.org)\nand the `pytorch_sphinx_theme2`.\n\nBefore you build the documentation locally, ensure `torch` is\ninstalled in your environment. For small fixes, you can install the\nnightly version as described in [Getting Started](https://pytorch.org/get-started/locally/).\n\nFor more complex fixes, such as adding a new module and docstrings for\nthe new module, you might need to install torch [from source](#from-source).\nSee [Docstring Guidelines](https://github.com/pytorch/pytorch/wiki/Docstring-Guidelines)\nfor docstring conventions.\n\n```bash\ncd docs/\npip install -r requirements.txt\nmake html\nmake serve\n```\n\nRun `make` to get a list of all available output formats.\n\nIf you get a katex error run `npm install katex`. If it persists, try\n`npm install -g katex`\n\n> [!NOTE]\n> If you see a numpy incompatibility error, run:\n> ```\n> pip install 'numpy<2'\n> ```\n\n\n#### Troubleshooting CI Errors\nYour build may show errors you didn't have locally - here's how to find the errors relevant to the docs.\n\nIf the build has any errors, you will see something like this on the PR:\n\n\"Monosnap\n\nAny doc-related errors will occur in jobs that include \"doc\" somewhere in the title. It doesn't look like any of these jobs are relevant to our docs.\n\n\nLet's take a look anyway. Click on the job to see the logs:\n\n\"Monosnap\n\nAnd we can be sure that this job does not involve docs.\n\nLooking at this build, we can see these jobs are relevant to our docs - and they didn't have any errors:\n\n\"Check\n\nYou might also see a comment on the PR like this:\n\n\"PR\n\nWe can see that some of these issues are relevant to our docs.\n\nOpen the logs by clicking on the `gh` link:\n\n\"View\n\nAnd here we can see there is a doc-related error:\n\n\"Doc\n\nYou can always find the relevant doc builds by going to the `Checks` tab on your PR, and scrolling down to `pull`.\n\n\"checks\"\n\nYou can either click through or toggle the accordion to see all of the jobs here, where you can see the docs jobs highlighted:\n\n\"jobs\"\n\nIf you click through, you'll see the doc jobs at the bottom, like this:\n\n\"View\n\n\n#### Building a PDF\n\nTo compile a PDF of all PyTorch documentation, ensure you have\n`texlive` and LaTeX installed. On macOS, you can install them using:\n\n```\nbrew install --cask mactex\n```\n\nTo create the PDF:\n\n1. Run:\n\n ```\n make latexpdf\n ```\n\n This will generate the necessary files in the `build/latex` directory.\n\n2. Navigate to this directory and execute:\n\n ```\n make LATEXOPTS=\"-interaction=nonstopmode\"\n ```\n\n This will produce a `pytorch.pdf` with the desired content. Run this\n command one more time so that it generates the correct table\n of contents and index.\n\n> [!NOTE]\n> To view the Table of Contents, switch to the **Table of Contents**\n> view in your PDF viewer.\n\n\n### Previous Versions\n\nInstallation instructions and binaries for previous PyTorch versions may be found\non [our website](https://pytorch.org/get-started/previous-versions).\n\n\n## Getting Started\n\nPointers to get you started:\n- [Tutorials: get you started with understanding and using PyTorch](https://pytorch.org/tutorials/)\n- [Examples: easy to understand PyTorch code across all domains](https://github.com/pytorch/examples)\n- [The API Reference](https://pytorch.org/docs/)\n- [Glossary](https://github.com/pytorch/pytorch/blob/main/GLOSSARY.md)\n\n## Resources\n\n* [PyTorch.org](https://pytorch.org/)\n* [PyTorch Tutorials](https://pytorch.org/tutorials/)\n* [PyTorch Examples](https://github.com/pytorch/examples)\n* [PyTorch Models](https://pytorch.org/hub/)\n* [Intro to Deep Learning with PyTorch from Udacity](https://www.udacity.com/course/deep-learning-pytorch--ud188)\n* [Intro to Machine Learning with PyTorch from Udacity](https://www.udacity.com/course/intro-to-machine-learning-nanodegree--nd229)\n* [Deep Neural Networks with PyTorch from Coursera](https://www.coursera.org/learn/deep-neural-networks-with-pytorch)\n* [PyTorch Twitter](https://twitter.com/PyTorch)\n* [PyTorch Blog](https://pytorch.org/blog/)\n* [PyTorch YouTube](https://www.youtube.com/channel/UCWXI5YeOsh03QvJ59PMaXFw)\n\n## Communication\n* Forums: Discuss implementations, research, etc. https://discuss.pytorch.org\n* GitHub Issues: Bug reports, feature requests, install issues, RFCs, thoughts, etc.\n* Slack: The [PyTorch Slack](https://pytorch.slack.com/) hosts a primary audience of moderate to experienced PyTorch users and developers for general chat, online discussions, collaboration, etc. If you are a beginner looking for help, the primary medium is [PyTorch Forums](https://discuss.pytorch.org). If you need a slack invite, please fill this form: https://goo.gl/forms/PP1AGvNHpSaJP8to1\n* Newsletter: No-noise, a one-way email newsletter with important announcements about PyTorch. You can sign-up here: https://eepurl.com/cbG0rv\n* Facebook Page: Important announcements about PyTorch. https://www.facebook.com/pytorch\n* For brand guidelines, please visit our website at [pytorch.org](https://pytorch.org/)\n\n## Releases and Contributing\n\nTypically, PyTorch has three minor releases a year. Please let us know if you encounter a bug by [filing an issue](https://github.com/pytorch/pytorch/issues).\n\nWe appreciate all contributions. If you are planning to contribute back bug-fixes, please do so without any further discussion.\n\nIf you plan to contribute new features, utility functions, or extensions to the core, please first open an issue and discuss the feature with us.\nSending a PR without discussion might end up resulting in a rejected PR because we might be taking the core in a different direction than you might be aware of.\n\nTo learn more about making a contribution to PyTorch, please see our [Contribution page](CONTRIBUTING.md). For more information about PyTorch releases, see [Release page](RELEASE.md).\n\n## The Team\n\nPyTorch is a community-driven project with several skillful engineers and researchers contributing to it.\n\nPyTorch is currently maintained by [Soumith Chintala](https://soumith.ch), [Gregory Chanan](https://github.com/gchanan), [Dmytro Dzhulgakov](https://github.com/dzhulgakov), [Edward Yang](https://github.com/ezyang), [Alban Desmaison](https://github.com/albanD), [Piotr Bialecki](https://github.com/ptrblck) and [Nikita Shulga](https://github.com/malfet) with major contributions coming from hundreds of talented individuals in various forms and means.\nA non-exhaustive but growing list needs to mention: [Trevor Killeen](https://github.com/killeent), [Sasank Chilamkurthy](https://github.com/chsasank), [Sergey Zagoruyko](https://github.com/szagoruyko), [Adam Lerer](https://github.com/adamlerer), [Francisco Massa](https://github.com/fmassa), [Alykhan Tejani](https://github.com/alykhantejani), [Luca Antiga](https://github.com/lantiga), [Alban Desmaison](https://github.com/albanD), [Andreas Koepf](https://github.com/andreaskoepf), [James Bradbury](https://github.com/jekbradbury), [Zeming Lin](https://github.com/ebetica), [Yuandong Tian](https://github.com/yuandong-tian), [Guillaume Lample](https://github.com/glample), [Marat Dukhan](https://github.com/Maratyszcza), [Natalia Gimelshein](https://github.com/ngimel), [Christian Sarofeen](https://github.com/csarofeen), [Martin Raison](https://github.com/martinraison), [Edward Yang](https://github.com/ezyang), [Zachary Devito](https://github.com/zdevito). \n\nNote: This project is unrelated to [hughperkins/pytorch](https://github.com/hughperkins/pytorch) with the same name. Hugh is a valuable contributor to the Torch community and has helped with many things Torch and PyTorch.\n\n## License\n\nPyTorch has a BSD-style license, as found in the [LICENSE](LICENSE) file.\n", - "description_content_type": "text/markdown", - "keywords": [ - "pytorch", - "machine learning" - ], - "author_email": "PyTorch Team ", - "license_expression": "Apache-2.0 AND Apache-2.0 WITH LLVM-exception AND BSD-2-Clause AND BSD-3-Clause AND BSL-1.0 AND MIT", - "license_file": [ - "LICENSE", - "third_party/FP16/LICENSE", - "third_party/FXdiv/LICENSE", - "third_party/NNPACK/LICENSE", - "third_party/NVTX/LICENSE.txt", - "third_party/NVTX/docs/LICENSE.txt", - "third_party/NVTX/python/LICENSE.txt", - "third_party/NVTX/rust/LICENSE", - "third_party/VulkanMemoryAllocator/LICENSE.txt", - "third_party/XNNPACK/LICENSE", - "third_party/aiter/3rdparty/composable_kernel/LICENSE", - "third_party/aiter/LICENSE", - "third_party/benchmark/LICENSE", - "third_party/composable_kernel/LICENSE", - "third_party/cpp-httplib/LICENSE", - "third_party/cpuinfo/LICENSE", - "third_party/cpuinfo/deps/clog/LICENSE", - "third_party/cudnn_frontend/LICENSE.txt", - "third_party/cutlass/LICENSE.txt", - "third_party/cutlass/python/LICENSE.txt", - "third_party/fbgemm/LICENSE", - "third_party/fbgemm/external/composable_kernel/LICENSE", - "third_party/fbgemm/external/cpuinfo/LICENSE", - "third_party/fbgemm/external/cpuinfo/deps/clog/LICENSE", - "third_party/fbgemm/external/cutlass/LICENSE.txt", - "third_party/fbgemm/external/cutlass/python/LICENSE.txt", - "third_party/fbgemm/external/googletest/LICENSE", - "third_party/fbgemm/external/hipify_torch/LICENSE.txt", - "third_party/fbgemm/fbgemm_gpu/experimental/hstu/LICENSE", - "third_party/fbgemm/fbgemm_gpu/src/quantize_ops/mx/LICENSE", - "third_party/fbgemm/fbgemm_gpu/test/quantize/mx/LICENSE", - "third_party/flash-attention/LICENSE", - "third_party/flash-attention/csrc/composable_kernel/LICENSE", - "third_party/flash-attention/csrc/cutlass/LICENSE.txt", - "third_party/flash-attention/csrc/cutlass/python/LICENSE.txt", - "third_party/flash-attention/flash_attn/cute/LICENSE", - "third_party/flash-attention/third_party/aiter/3rdparty/composable_kernel/LICENSE", - "third_party/flash-attention/third_party/aiter/LICENSE", - "third_party/flatbuffers/LICENSE", - "third_party/flatbuffers/dart/LICENSE", - "third_party/flatbuffers/swift/LICENSE", - "third_party/fmt/LICENSE", - "third_party/gemmlowp/gemmlowp/LICENSE", - "third_party/gloo/LICENSE", - "third_party/googletest/LICENSE", - "third_party/ideep/LICENSE", - "third_party/ideep/mkl-dnn/LICENSE", - "third_party/ideep/mkl-dnn/third_party/gtest/LICENSE", - "third_party/ideep/mkl-dnn/third_party/opencl/LICENSE", - "third_party/kineto/LICENSE", - "third_party/kineto/libkineto/third_party/dynolog_headers/LICENSE", - "third_party/kineto/libkineto/third_party/fmt/LICENSE", - "third_party/kineto/libkineto/third_party/googletest/LICENSE", - "third_party/llvm-openmp/LICENSE.txt", - "third_party/mimalloc/LICENSE", - "third_party/miniz-3.0.2/LICENSE", - "third_party/mslk/LICENSE", - "third_party/mslk/external/composable_kernel/LICENSE", - "third_party/mslk/external/cutlass/LICENSE.txt", - "third_party/mslk/external/cutlass/python/LICENSE.txt", - "third_party/mslk/external/googletest/LICENSE", - "third_party/mslk/external/hipify_torch/LICENSE.txt", - "third_party/mslk/mslk/attention/flash_attn/LICENSE", - "third_party/onnx/LICENSE", - "third_party/onnx/third_party/pybind11/LICENSE", - "third_party/perfetto/LICENSE", - "third_party/protobuf/LICENSE", - "third_party/protobuf/third_party/benchmark/LICENSE", - "third_party/protobuf/third_party/googletest/LICENSE", - "third_party/protobuf/third_party/googletest/googlemock/LICENSE", - "third_party/protobuf/third_party/googletest/googlemock/scripts/generator/LICENSE", - "third_party/protobuf/third_party/googletest/googletest/LICENSE", - "third_party/protobuf/third_party/utf8_range/LICENSE", - "third_party/psimd/LICENSE", - "third_party/pthreadpool/LICENSE", - "third_party/pybind11/LICENSE", - "third_party/python-peachpy/LICENSE.rst", - "third_party/sleef/LICENSE.txt", - "third_party/tensorpipe/LICENSE.txt", - "third_party/tensorpipe/third_party/googletest/LICENSE", - "third_party/tensorpipe/third_party/googletest/googlemock/LICENSE", - "third_party/tensorpipe/third_party/googletest/googlemock/scripts/generator/LICENSE", - "third_party/tensorpipe/third_party/googletest/googletest/LICENSE", - "third_party/tensorpipe/third_party/libnop/LICENSE", - "third_party/tensorpipe/third_party/libuv/LICENSE", - "third_party/tensorpipe/third_party/pybind11/LICENSE" - ], - "classifier": [ - "Development Status :: 5 - Production/Stable", - "Intended Audience :: Developers", - "Intended Audience :: Education", - "Intended Audience :: Science/Research", - "Topic :: Scientific/Engineering", - "Topic :: Scientific/Engineering :: Mathematics", - "Topic :: Scientific/Engineering :: Artificial Intelligence", - "Topic :: Software Development", - "Topic :: Software Development :: Libraries", - "Topic :: Software Development :: Libraries :: Python Modules", - "Programming Language :: C++", - "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - "Programming Language :: Python :: 3.14", - "Programming Language :: Python :: 3.15" - ], - "requires_dist": [ - "filelock", - "typing-extensions>=4.10.0", - "setuptools>=77.0.3", - "sympy>=1.13.3", - "networkx>=2.5.1", - "jinja2", - "fsspec>=0.8.5", - "optree>=0.13.0; extra == \"optree\"", - "opt-einsum>=3.3; extra == \"opt-einsum\"", - "pyyaml; extra == \"pyyaml\"" - ], - "requires_python": ">=3.10", - "project_url": [ - "Homepage, https://pytorch.org", - "Repository, https://github.com/pytorch/pytorch", - "Documentation, https://pytorch.org/docs", - "Issue Tracker, https://github.com/pytorch/pytorch/issues", - "Forum, https://discuss.pytorch.org" - ], - "provides_extra": [ - "optree", - "opt-einsum", - "pyyaml" - ] - } - }, - { - "download_info": { - "url": "https://files.pythonhosted.org/packages/cb/03/10388a42375ee7e4ac9b94eb2c5c569c8b5795e377e701c9ac3ad63de890/fastapi-0.141.1-py3-none-any.whl", - "archive_info": { - "hashes": { - "sha256": "bfb91aa2d334c61cb35ba9a116fc123b3d3df31640b801cf57a7a78ec3f603b3" - }, - "hash": "sha256=bfb91aa2d334c61cb35ba9a116fc123b3d3df31640b801cf57a7a78ec3f603b3" - } - }, - "is_direct": false, - "is_yanked": false, - "requested": true, - "metadata": { - "metadata_version": "2.4", - "name": "fastapi", - "version": "0.141.1", - "summary": "FastAPI framework, high performance, easy to learn, fast to code, ready for production", - "description": "

\n \"FastAPI\"\n

\n

\n FastAPI framework, high performance, easy to learn, fast to code, ready for production\n

\n

\n\n \"Test\"\n\n\n \"Coverage\"\n\n\n \"Package\n\n\n \"Supported\n\n

\n\n---\n\n**Documentation**: [https://fastapi.tiangolo.com](https://fastapi.tiangolo.com)\n\n**Source Code**: [https://github.com/fastapi/fastapi](https://github.com/fastapi/fastapi)\n\n---\n\nFastAPI is a modern, fast (high-performance), web framework for building APIs with Python based on standard Python type hints.\n\nThe key features are:\n\n* **Fast**: Very high performance, on par with **NodeJS** and **Go** (thanks to Starlette and Pydantic). [One of the fastest Python frameworks available](#performance).\n* **Fast to code**: Increase the speed to develop features by about 200% to 300%. *\n* **Fewer bugs**: Reduce about 40% of human (developer) induced errors. *\n* **Intuitive**: Great editor support. Completion everywhere. Less time debugging.\n* **Easy**: Designed to be easy to use and learn. Less time reading docs.\n* **Short**: Minimize code duplication. Multiple features from each parameter declaration. Fewer bugs.\n* **Robust**: Get production-ready code. With automatic interactive documentation.\n* **Standards-based**: Based on (and fully compatible with) the open standards for APIs: [OpenAPI](https://github.com/OAI/OpenAPI-Specification) (previously known as Swagger) and [JSON Schema](https://json-schema.org/).\n\n* estimation based on tests conducted by an internal development team, building production applications.\n\n## Sponsors\n\n\n### Keystone Sponsor\n\n\n\n### Gold Sponsors\n\n\n\n\n\n\n\n\n\n\n### Silver Sponsors\n\n\n\n\n\n\n\n\n\n\n[Other sponsors](https://fastapi.tiangolo.com/fastapi-people/#sponsors)\n\n## Opinions\n\n\n\n
\n\n\"_[...] I'm using **FastAPI** a ton these days. [...] I'm actually planning to use it for all of my team's **ML services at Microsoft**. Some of them are getting integrated into the core **Windows** product and some **Office** products._\"\n\n
Kabir Khan - Microsoft (ref)
\n\n---\n\n\"_We adopted the **FastAPI** library to spawn a **REST** server that can be queried to obtain **predictions**. [for Ludwig]_\"\n\n
Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - Uber (ref)
\n\n---\n\n\"_**Netflix** is pleased to announce the open-source release of our **crisis management** orchestration framework: **Dispatch**! [built with **FastAPI**]_\"\n\n
Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix (ref)
\n\n---\n\n\"_If anyone is looking to build a production Python API, I would highly recommend **FastAPI**. It is **beautifully designed**, **simple to use** and **highly scalable**, it has become a **key component** in our API first development strategy and is driving many automations and services such as our Virtual TAC Engineer._\"\n\n
Deon Pillsbury - Cisco (ref)
\n\n---\n\n
\n\n## FastAPI Conf\n\n[**FastAPI Conf '26**](https://fastapiconf.com) is happening on **October 28, 2026** in **Amsterdam, NL**. All about FastAPI, right from the source. 🎤\n\n\"FastAPI\n\n## FastAPI mini documentary\n\nThere's a [FastAPI mini documentary](https://www.youtube.com/watch?v=mpR8ngthqiE) released at the end of 2025, you can watch it online:\n\n\"FastAPI\n\n## **Typer**, the FastAPI of CLIs\n\n\n\nIf you are building a CLI app to be used in the terminal instead of a web API, check out [**Typer**](https://typer.tiangolo.com/).\n\n**Typer** is FastAPI's little sibling. And it's intended to be the **FastAPI of CLIs**. ⌨️ 🚀\n\n## Requirements\n\nFastAPI stands on the shoulders of giants:\n\n* [Starlette](https://starlette.dev/) for the web parts.\n* [Pydantic](https://pydantic.dev/docs/) for the data parts.\n\n## Installation\n\nFirst, [install `uv`](https://docs.astral.sh/uv/getting-started/installation/), and then add FastAPI to your project:\n\n
\n\n```console\n$ uv add \"fastapi[standard]\"\n\n---> 100%\n```\n\n
\n\n**Note**: Make sure you put `\"fastapi[standard]\"` in quotes to ensure it works in all terminals.\n\nIf you prefer to use `pip`, install `fastapi[standard]` inside a virtual environment. See the [installation guide](tutorial/#install-fastapi) for the alternative steps.\n\n## Example\n\n### Create it\n\nCreate a file `main.py` with:\n\n```Python\nfrom fastapi import FastAPI\n\napp = FastAPI()\n\n\n@app.get(\"/\")\ndef read_root():\n return {\"Hello\": \"World\"}\n\n\n@app.get(\"/items/{item_id}\")\ndef read_item(item_id: int, q: str | None = None):\n return {\"item_id\": item_id, \"q\": q}\n```\n\n
\nOr use async def...\n\nIf your code uses `async` / `await`, use `async def`:\n\n```Python hl_lines=\"7 12\"\nfrom fastapi import FastAPI\n\napp = FastAPI()\n\n\n@app.get(\"/\")\nasync def read_root():\n return {\"Hello\": \"World\"}\n\n\n@app.get(\"/items/{item_id}\")\nasync def read_item(item_id: int, q: str | None = None):\n return {\"item_id\": item_id, \"q\": q}\n```\n\n**Note**:\n\nIf you don't know, check the _\"In a hurry?\"_ section about [`async` and `await` in the docs](https://fastapi.tiangolo.com/async/#in-a-hurry).\n\n
\n\n### Run it\n\nRun the server with:\n\n
\n\n```console\n$ uv run fastapi dev\n\n ╭────────── FastAPI CLI - Development mode ───────────╮\n │ │\n │ Serving at: http://127.0.0.1:8000 │\n │ │\n │ API docs: http://127.0.0.1:8000/docs │\n │ │\n │ Running in development mode, for production use: │\n │ │\n │ fastapi run │\n │ │\n ╰─────────────────────────────────────────────────────╯\n\nINFO: Will watch for changes in these directories: ['/home/user/code/awesomeapp']\nINFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)\nINFO: Started reloader process [2248755] using WatchFiles\nINFO: Started server process [2248757]\nINFO: Waiting for application startup.\nINFO: Application startup complete.\n```\n\n
\n\n
\nAbout the command fastapi dev...\n\nThe command `fastapi dev` reads your `main.py` file automatically, detects the **FastAPI** app in it, and starts a server using [Uvicorn](https://uvicorn.dev).\n\nBy default, `fastapi dev` will start with auto-reload enabled for local development.\n\nYou can read more about it in the [FastAPI CLI docs](https://fastapi.tiangolo.com/fastapi-cli/).\n\n
\n\n### Check it\n\nOpen your browser at [http://127.0.0.1:8000/items/5?q=somequery](http://127.0.0.1:8000/items/5?q=somequery).\n\nYou will see the JSON response as:\n\n```JSON\n{\"item_id\": 5, \"q\": \"somequery\"}\n```\n\nYou already created an API that:\n\n* Receives HTTP requests in the _paths_ `/` and `/items/{item_id}`.\n* Both _paths_ take `GET` operations (also known as HTTP _methods_).\n* The _path_ `/items/{item_id}` has a _path parameter_ `item_id` that should be an `int`.\n* The _path_ `/items/{item_id}` has an optional `str` _query parameter_ `q`.\n\n### Interactive API docs\n\nNow go to [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).\n\nYou will see the automatic interactive API documentation (provided by [Swagger UI](https://github.com/swagger-api/swagger-ui)):\n\n![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png)\n\n### Alternative API docs\n\nAnd now, go to [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc).\n\nYou will see the alternative automatic documentation (provided by [ReDoc](https://github.com/Redocly/redoc)):\n\n![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png)\n\n## Example upgrade\n\nNow modify the file `main.py` to receive a body from a `PUT` request.\n\nDeclare the body using standard Python types, thanks to Pydantic.\n\n```Python hl_lines=\"2 7-10 23-25\"\nfrom fastapi import FastAPI\nfrom pydantic import BaseModel\n\napp = FastAPI()\n\n\nclass Item(BaseModel):\n name: str\n price: float\n is_offer: bool | None = None\n\n\n@app.get(\"/\")\ndef read_root():\n return {\"Hello\": \"World\"}\n\n\n@app.get(\"/items/{item_id}\")\ndef read_item(item_id: int, q: str | None = None):\n return {\"item_id\": item_id, \"q\": q}\n\n\n@app.put(\"/items/{item_id}\")\ndef update_item(item_id: int, item: Item):\n return {\"item_name\": item.name, \"item_id\": item_id}\n```\n\nThe `fastapi dev` server should reload automatically.\n\n### Interactive API docs upgrade\n\nNow go to [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs).\n\n* The interactive API documentation will be automatically updated, including the new body:\n\n![Swagger UI](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png)\n\n* Click on the button \"Try it out\", it allows you to fill the parameters and directly interact with the API:\n\n![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-04-swagger-03.png)\n\n* Then click on the \"Execute\" button, the user interface will communicate with your API, send the parameters, get the results and show them on the screen:\n\n![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-05-swagger-04.png)\n\n### Alternative API docs upgrade\n\nAnd now, go to [http://127.0.0.1:8000/redoc](http://127.0.0.1:8000/redoc).\n\n* The alternative documentation will also reflect the new query parameter and body:\n\n![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png)\n\n### Recap\n\nIn summary, you declare **once** the types of parameters, body, etc. as function parameters.\n\nYou do that with standard modern Python types.\n\nYou don't have to learn a new syntax, the methods or classes of a specific library, etc.\n\nJust standard **Python**.\n\nFor example, for an `int`:\n\n```Python\nitem_id: int\n```\n\nor for a more complex `Item` model:\n\n```Python\nitem: Item\n```\n\n...and with that single declaration you get:\n\n* Editor support, including:\n * Completion.\n * Type checks.\n* Validation of data:\n * Automatic and clear errors when the data is invalid.\n * Validation even for deeply nested JSON objects.\n* Conversion of input data: coming from the network to Python data and types. Reading from:\n * JSON.\n * Path parameters.\n * Query parameters.\n * Cookies.\n * Headers.\n * Forms.\n * Files.\n* Conversion of output data: converting from Python data and types to network data (as JSON):\n * Convert Python types (`str`, `int`, `float`, `bool`, `list`, etc).\n * `datetime` objects.\n * `UUID` objects.\n * Database models.\n * ...and many more.\n* Automatic interactive API documentation, including 2 alternative user interfaces:\n * Swagger UI.\n * ReDoc.\n\n---\n\nComing back to the previous code example, **FastAPI** will:\n\n* Validate that there is an `item_id` in the path for `GET` and `PUT` requests.\n* Validate that the `item_id` is of type `int` for `GET` and `PUT` requests.\n * If it is not, the client will see a useful, clear error.\n* Check if there is an optional query parameter named `q` (as in `http://127.0.0.1:8000/items/foo?q=somequery`) for `GET` requests.\n * As the `q` parameter is declared with `= None`, it is optional.\n * Without the `None` it would be required (as is the body in the case with `PUT`).\n* For `PUT` requests to `/items/{item_id}`, read the body as JSON:\n * Check that it has a required attribute `name` that should be a `str`.\n * Check that it has a required attribute `price` that has to be a `float`.\n * Check that it has an optional attribute `is_offer`, that should be a `bool`, if present.\n * All this would also work for deeply nested JSON objects.\n* Convert from and to JSON automatically.\n* Document everything with OpenAPI, that can be used by:\n * Interactive documentation systems.\n * Automatic client code generation systems, for many languages.\n* Provide 2 interactive documentation web interfaces directly.\n\n---\n\nWe just scratched the surface, but you already get the idea of how it all works.\n\nTry changing the line with:\n\n```Python\n return {\"item_name\": item.name, \"item_id\": item_id}\n```\n\n...from:\n\n```Python\n ... \"item_name\": item.name ...\n```\n\n...to:\n\n```Python\n ... \"item_price\": item.price ...\n```\n\n...and see how your editor will auto-complete the attributes and know their types:\n\n![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png)\n\nFor a more complete example including more features, see the Tutorial - User Guide.\n\n**Spoiler alert**: the tutorial - user guide includes:\n\n* Declaration of **parameters** from other different places such as: **headers**, **cookies**, **form fields** and **files**.\n* How to set **validation constraints** such as `maximum_length` or `regex`.\n* A very powerful and easy to use **Dependency Injection** system.\n* Security and authentication, including support for **OAuth2** with **JWT tokens** and **HTTP Basic** auth.\n* More advanced (but equally easy) techniques for declaring **deeply nested JSON models** (thanks to Pydantic).\n* **GraphQL** integration with [Strawberry](https://strawberry.rocks) and other libraries.\n* Many extra features (thanks to Starlette) such as:\n * **WebSockets**\n * extremely easy tests based on HTTPX and `pytest`\n * **CORS**\n * **Cookie Sessions**\n * ...and more.\n\n### Deploy your app (optional)\n\nYou can optionally deploy your FastAPI app to [FastAPI Cloud](https://fastapicloud.com) with a single command. 🚀\n\n
\n\n```console\n$ uv run fastapi deploy\n\nDeploying to FastAPI Cloud...\n\n✅ Deployment successful!\n\n🐔 Ready the chicken! Your app is ready at https://myapp.fastapicloud.dev\n```\n\n
\n\nThe CLI will automatically detect your FastAPI application and deploy it to the cloud. If you are not logged in, your browser will open to complete the authentication process.\n\nThat's it! Now you can access your app at that URL. ✨\n\n#### About FastAPI Cloud\n\n**[FastAPI Cloud](https://fastapicloud.com)** is built by the same author and team behind **FastAPI**.\n\nIt streamlines the process of **building**, **deploying**, and **accessing** an API with minimal effort.\n\nIt brings the same **developer experience** of building apps with FastAPI to **deploying** them to the cloud. 🎉\n\nFastAPI Cloud is the primary sponsor and funding provider for the *FastAPI and friends* open source projects. ✨\n\n#### Deploy to other cloud providers\n\nFastAPI is open source and based on standards. You can deploy FastAPI apps to any cloud provider you choose.\n\nFollow your cloud provider's guides to deploy FastAPI apps with them. 🤓\n\n## Performance\n\nIndependent TechEmpower benchmarks show **FastAPI** applications running under Uvicorn as [one of the fastest Python frameworks available](https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7), only below Starlette and Uvicorn themselves (used internally by FastAPI). (*)\n\nTo understand more about it, see the section [Benchmarks](https://fastapi.tiangolo.com/benchmarks/).\n\n## Dependencies\n\nFastAPI depends on Pydantic and Starlette.\n\n### `standard` Dependencies\n\nWhen you install FastAPI with `uv add \"fastapi[standard]\"` it comes with the `standard` group of optional dependencies:\n\nUsed by Pydantic:\n\n* [`email-validator`](https://github.com/JoshData/python-email-validator) - for email validation.\n\nUsed by Starlette:\n\n* [`httpx`](https://www.python-httpx.org) - Required if you want to use the `TestClient`.\n* [`jinja2`](https://jinja.palletsprojects.com) - Required if you want to use the default template configuration.\n* [`python-multipart`](https://github.com/Kludex/python-multipart) - Required if you want to support form \"parsing\", with `request.form()`.\n\nUsed by FastAPI:\n\n* [`uvicorn`](https://uvicorn.dev) - for the server that loads and serves your application. This includes `uvicorn[standard]`, which includes some dependencies (e.g. `uvloop`) needed for high performance serving.\n* `fastapi-cli[standard]` - to provide the `fastapi` command.\n * This includes `fastapi-cloud-cli`, which allows you to deploy your FastAPI application to [FastAPI Cloud](https://fastapicloud.com).\n\n### Without `standard` Dependencies\n\nIf you don't want to include the `standard` optional dependencies, you can install with `uv add fastapi` instead of `uv add \"fastapi[standard]\"`.\n\n### Without `fastapi-cloud-cli`\n\nIf you want to install FastAPI with the standard dependencies but without the `fastapi-cloud-cli`, you can install with `uv add \"fastapi[standard-no-fastapi-cloud-cli]\"`.\n\n### Additional Optional Dependencies\n\nThere are some additional dependencies you might want to install.\n\nAdditional optional Pydantic dependencies:\n\n* [`pydantic-settings`](https://pydantic.dev/docs/validation/latest/concepts/pydantic_settings/) - for settings management.\n* [`pydantic-extra-types`](https://github.com/pydantic/pydantic-extra-types) - for extra types to be used with Pydantic.\n\nAdditional optional FastAPI dependencies:\n\n* [`orjson`](https://github.com/ijl/orjson) - Required if you want to use `ORJSONResponse`.\n* [`ujson`](https://github.com/ultrajson/ultrajson) - Required if you want to use `UJSONResponse`.\n\n## License\n\nThis project is licensed under the terms of the MIT license.\n", - "description_content_type": "text/markdown", - "author_email": "=?utf-8?q?Sebasti=C3=A1n_Ram=C3=ADrez?= ", - "license_expression": "MIT", - "license_file": [ - "LICENSE" - ], - "classifier": [ - "Intended Audience :: Information Technology", - "Intended Audience :: System Administrators", - "Operating System :: OS Independent", - "Programming Language :: Python :: 3", - "Programming Language :: Python", - "Topic :: Internet", - "Topic :: Software Development :: Libraries :: Application Frameworks", - "Topic :: Software Development :: Libraries :: Python Modules", - "Topic :: Software Development :: Libraries", - "Topic :: Software Development", - "Typing :: Typed", - "Development Status :: 4 - Beta", - "Environment :: Web Environment", - "Framework :: AsyncIO", - "Framework :: FastAPI", - "Framework :: Pydantic", - "Framework :: Pydantic :: 2", - "Intended Audience :: Developers", - "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - "Programming Language :: Python :: 3.14", - "Topic :: Internet :: WWW/HTTP :: HTTP Servers", - "Topic :: Internet :: WWW/HTTP" - ], - "requires_dist": [ - "starlette>=0.46.0", - "pydantic>=2.9.0", - "typing-extensions>=4.8.0", - "typing-inspection>=0.4.2", - "annotated-doc>=0.0.2", - "fastapi-cli[standard]>=0.0.32; extra == \"standard\"", - "fastar>=0.9.0; extra == \"standard\"", - "httpx<1.0.0,>=0.23.0; extra == \"standard\"", - "jinja2>=3.1.5; extra == \"standard\"", - "python-multipart>=0.0.18; extra == \"standard\"", - "email-validator>=2.0.0; extra == \"standard\"", - "uvicorn[standard]>=0.12.0; extra == \"standard\"", - "pydantic-settings>=2.0.0; extra == \"standard\"", - "pydantic-extra-types>=2.0.0; extra == \"standard\"", - "fastapi-cli[standard-no-fastapi-cloud-cli]>=0.0.32; extra == \"standard-no-fastapi-cloud-cli\"", - "httpx<1.0.0,>=0.23.0; extra == \"standard-no-fastapi-cloud-cli\"", - "jinja2>=3.1.5; extra == \"standard-no-fastapi-cloud-cli\"", - "python-multipart>=0.0.18; extra == \"standard-no-fastapi-cloud-cli\"", - "email-validator>=2.0.0; extra == \"standard-no-fastapi-cloud-cli\"", - "uvicorn[standard]>=0.12.0; extra == \"standard-no-fastapi-cloud-cli\"", - "pydantic-settings>=2.0.0; extra == \"standard-no-fastapi-cloud-cli\"", - "pydantic-extra-types>=2.0.0; extra == \"standard-no-fastapi-cloud-cli\"", - "fastapi-cli[standard]>=0.0.32; extra == \"all\"", - "httpx<1.0.0,>=0.23.0; extra == \"all\"", - "jinja2>=3.1.5; extra == \"all\"", - "python-multipart>=0.0.18; extra == \"all\"", - "itsdangerous>=1.1.0; extra == \"all\"", - "pyyaml>=5.3.1; extra == \"all\"", - "email-validator>=2.0.0; extra == \"all\"", - "uvicorn[standard]>=0.12.0; extra == \"all\"", - "pydantic-settings>=2.0.0; extra == \"all\"", - "pydantic-extra-types>=2.0.0; extra == \"all\"" - ], - "requires_python": ">=3.10", - "project_url": [ - "Homepage, https://github.com/fastapi/fastapi", - "Documentation, https://fastapi.tiangolo.com/", - "Repository, https://github.com/fastapi/fastapi", - "Issues, https://github.com/fastapi/fastapi/issues", - "Changelog, https://fastapi.tiangolo.com/release-notes/" - ], - "provides_extra": [ - "standard", - "standard-no-fastapi-cloud-cli", - "all" - ] - } - }, - { - "download_info": { - "url": "https://files.pythonhosted.org/packages/38/0c/b54a4fdd7f90a3af8b02ebc9ce6712c2c208b7926a2f7bad95c33ebbe943/uvicorn-0.54.0-py3-none-any.whl", - "archive_info": { - "hashes": { - "sha256": "505bdb0f318731d45f1f712071fc781a8981f6847a31c902c9f5e652d4f67faf" - }, - "hash": "sha256=505bdb0f318731d45f1f712071fc781a8981f6847a31c902c9f5e652d4f67faf" - } - }, - "is_direct": false, - "is_yanked": false, - "requested": true, - "metadata": { - "metadata_version": "2.5", - "name": "uvicorn", - "version": "0.54.0", - "summary": "The lightning-fast ASGI server.", - "description": "

\n uvicorn\n

\n\n

\nAn ASGI web server, for Python.\n

\n\n---\n\n[![Build Status](https://github.com/Kludex/uvicorn/workflows/Test%20Suite/badge.svg)](https://github.com/Kludex/uvicorn/actions)\n[![Package version](https://badge.fury.io/py/uvicorn.svg)](https://pypi.python.org/pypi/uvicorn)\n[![Supported Python Version](https://img.shields.io/pypi/pyversions/uvicorn.svg?color=%2334D058)](https://pypi.org/project/uvicorn)\n[![Discord](https://img.shields.io/discord/1051468649518616576?logo=discord&logoColor=ffffff&color=7389D8&labelColor=6A7EC2)](https://discord.gg/RxKUF5JuHs)\n\n---\n\n**Documentation**: [https://uvicorn.dev](https://uvicorn.dev)\n\n**Source Code**: [https://www.github.com/Kludex/uvicorn](https://www.github.com/Kludex/uvicorn)\n\n---\n\nUvicorn is an ASGI web server implementation for Python.\n\nUntil recently Python has lacked a minimal low-level server/application interface for\nasync frameworks. The [ASGI specification][asgi] fills this gap, and means we're now able to\nstart building a common set of tooling usable across all async frameworks.\n\nUvicorn currently supports HTTP/1.1, HTTP/2 and WebSockets.\n\n## Quickstart\n\nInstall using `pip`:\n\n```shell\n$ pip install uvicorn\n```\n\nThis will install uvicorn with minimal (pure Python) dependencies.\n\n```shell\n$ pip install 'uvicorn[standard]'\n```\n\nThis will install uvicorn with \"Cython-based\" dependencies (where possible) and other \"optional extras\".\n\nIn this context, \"Cython-based\" means the following:\n\n- the event loop `uvloop` will be installed and used if possible.\n- the http protocol will be handled by `httptools` if possible.\n\nMoreover, \"optional extras\" means that:\n\n- the websocket protocol will be handled by `websockets` (should you want to use `wsproto` you'd need to install it manually) if possible.\n- the `--reload` flag in development mode will use `watchfiles`.\n- `python-dotenv` will be installed should you want to use the `--env-file` option.\n- `PyYAML` will be installed to allow you to provide a `.yaml` file to `--log-config`, if desired.\n\nCreate an application, in `example.py`:\n\n```python\nasync def app(scope, receive, send):\n assert scope['type'] == 'http'\n\n await send({\n 'type': 'http.response.start',\n 'status': 200,\n 'headers': [\n (b'content-type', b'text/plain'),\n ],\n })\n await send({\n 'type': 'http.response.body',\n 'body': b'Hello, world!',\n })\n```\n\nRun the server:\n\n```shell\n$ uvicorn example:app\n```\n\n---\n\n## Why ASGI?\n\nMost well established Python Web frameworks started out as WSGI-based frameworks.\n\nWSGI applications are a single, synchronous callable that takes a request and returns a response.\nThis doesn’t allow for long-lived connections, like you get with long-poll HTTP or WebSocket connections,\nwhich WSGI doesn't support well.\n\nHaving an async concurrency model also allows for options such as lightweight background tasks,\nand can be less of a limiting factor for endpoints that have long periods being blocked on network\nI/O such as dealing with slow HTTP requests.\n\n---\n\n## Alternative ASGI servers\n\nA strength of the ASGI protocol is that it decouples the server implementation\nfrom the application framework. This allows for an ecosystem of interoperating\nwebservers and application frameworks.\n\n### Daphne\n\nThe first ASGI server implementation, originally developed to power Django Channels, is [the Daphne webserver][daphne].\n\nIt is run widely in production, and supports HTTP/1.1, HTTP/2, and WebSockets.\n\nAny of the example applications given here can equally well be run using `daphne` instead.\n\n```\n$ pip install daphne\n$ daphne app:App\n```\n\n### Hypercorn\n\n[Hypercorn][hypercorn] was initially part of the Quart web framework, before\nbeing separated out into a standalone ASGI server.\n\nHypercorn supports HTTP/1.1, HTTP/2, and WebSockets.\n\nIt also supports [the excellent `trio` async framework][trio], as an alternative to `asyncio`.\n\n```\n$ pip install hypercorn\n$ hypercorn app:App\n```\n\n### Mangum\n\n[Mangum][mangum] is an adapter for using ASGI applications with AWS Lambda & API Gateway.\n\n### Granian\n\n[Granian][granian] is an ASGI compatible Rust HTTP server which supports HTTP/2, TLS and WebSockets.\n\n---\n\n

Uvicorn is BSD licensed code.
Designed & crafted with care.

— 🦄 —

\n\n[asgi]: https://asgi.readthedocs.io/en/latest/\n[daphne]: https://github.com/django/daphne\n[hypercorn]: https://github.com/pgjones/hypercorn\n[trio]: https://trio.readthedocs.io\n[mangum]: https://github.com/jordaneremieff/mangum\n[granian]: https://github.com/emmett-framework/granian\n", - "description_content_type": "text/markdown", - "author_email": "Tom Christie ", - "maintainer_email": "Marcelo Trylesinski ", - "license_expression": "BSD-3-Clause", - "license_file": [ - "LICENSE.md" - ], - "classifier": [ - "Development Status :: 4 - Beta", - "Environment :: Web Environment", - "Intended Audience :: Developers", - "Operating System :: OS Independent", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - "Programming Language :: Python :: 3.14", - "Programming Language :: Python :: Implementation :: CPython", - "Programming Language :: Python :: Implementation :: PyPy", - "Topic :: Internet :: WWW/HTTP" - ], - "requires_dist": [ - "click>=7.0", - "h11>=0.8", - "typing-extensions>=4.0; python_version < '3.11'", - "httptools>=0.8.0; extra == 'standard'", - "python-dotenv>=0.13; extra == 'standard'", - "pyyaml>=5.1; extra == 'standard'", - "uvloop>=0.15.1; (sys_platform != 'win32' and (sys_platform != 'cygwin' and platform_python_implementation != 'PyPy')) and extra == 'standard'", - "watchfiles>=0.20; extra == 'standard'", - "websockets>=13.0; extra == 'standard'" - ], - "requires_python": ">=3.10", - "project_url": [ - "Changelog, https://uvicorn.dev/release-notes", - "Funding, https://github.com/sponsors/Kludex", - "Homepage, https://uvicorn.dev/", - "Source, https://github.com/Kludex/uvicorn" - ], - "provides_extra": [ - "standard" - ] - } - }, - { - "download_info": { - "url": "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", - "archive_info": { - "hashes": { - "sha256": "076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9" - }, - "hash": "sha256=076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9" - } - }, - "is_direct": false, - "is_yanked": false, - "requested": true, - "metadata": { - "metadata_version": "2.1", - "name": "psutil", - "version": "7.2.2", - "platform": [ - "Platform Independent" - ], - "summary": "Cross-platform lib for process and system monitoring.", - "description": "| |downloads| |stars| |forks| |contributors| |packages|\n| |version| |license| |stackoverflow| |twitter| |tidelift|\n| |github-actions-wheels| |github-actions-bsd|\n\n.. |downloads| image:: https://img.shields.io/pypi/dm/psutil.svg\n :target: https://clickpy.clickhouse.com/dashboard/psutil\n :alt: Downloads\n\n.. |stars| image:: https://img.shields.io/github/stars/giampaolo/psutil.svg\n :target: https://github.com/giampaolo/psutil/stargazers\n :alt: Github stars\n\n.. |forks| image:: https://img.shields.io/github/forks/giampaolo/psutil.svg\n :target: https://github.com/giampaolo/psutil/network/members\n :alt: Github forks\n\n.. |contributors| image:: https://img.shields.io/github/contributors/giampaolo/psutil.svg\n :target: https://github.com/giampaolo/psutil/graphs/contributors\n :alt: Contributors\n\n.. |stackoverflow| image:: https://img.shields.io/badge/stackoverflow-Ask%20questions-blue.svg\n :target: https://stackoverflow.com/questions/tagged/psutil\n :alt: Stackoverflow\n\n.. |github-actions-wheels| image:: https://img.shields.io/github/actions/workflow/status/giampaolo/psutil/.github/workflows/build.yml.svg?label=Linux%2C%20macOS%2C%20Windows\n :target: https://github.com/giampaolo/psutil/actions?query=workflow%3Abuild\n :alt: Linux, macOS, Windows\n\n.. |github-actions-bsd| image:: https://img.shields.io/github/actions/workflow/status/giampaolo/psutil/.github/workflows/bsd.yml.svg?label=FreeBSD,%20NetBSD,%20OpenBSD\n :target: https://github.com/giampaolo/psutil/actions?query=workflow%3Absd-tests\n :alt: FreeBSD, NetBSD, OpenBSD\n\n.. |version| image:: https://img.shields.io/pypi/v/psutil.svg?label=pypi\n :target: https://pypi.org/project/psutil\n :alt: Latest version\n\n.. |packages| image:: https://repology.org/badge/tiny-repos/python:psutil.svg\n :target: https://repology.org/metapackage/python:psutil/versions\n :alt: Binary packages\n\n.. |license| image:: https://img.shields.io/pypi/l/psutil.svg\n :target: https://github.com/giampaolo/psutil/blob/master/LICENSE\n :alt: License\n\n.. |twitter| image:: https://img.shields.io/twitter/follow/grodola?style=flat\n :target: https://twitter.com/grodola\n :alt: Twitter Follow\n\n.. |tidelift| image:: https://tidelift.com/badges/github/giampaolo/psutil?style=flat\n :target: https://tidelift.com/subscription/pkg/pypi-psutil?utm_source=pypi-psutil&utm_medium=referral&utm_campaign=readme\n :alt: Tidelift\n\n-----\n\nQuick links\n===========\n\n- `Home page `_\n- `Install `_\n- `Documentation `_\n- `Download `_\n- `Forum `_\n- `StackOverflow `_\n- `Blog `_\n- `What's new `_\n\n\nSummary\n=======\n\npsutil (process and system utilities) is a cross-platform library for\nretrieving information on **running processes** and **system utilization**\n(CPU, memory, disks, network, sensors) in Python.\nIt is useful mainly for **system monitoring**, **profiling and limiting process\nresources** and **management of running processes**.\nIt implements many functionalities offered by classic UNIX command line tools\nsuch as *ps, top, iotop, lsof, netstat, ifconfig, free* and others.\npsutil currently supports the following platforms:\n\n- **Linux**\n- **Windows**\n- **macOS**\n- **FreeBSD, OpenBSD**, **NetBSD**\n- **Sun Solaris**\n- **AIX**\n\nSupported Python versions are cPython 3.6+ and `PyPy `__.\nLatest psutil version supporting Python 2.7 is\n`psutil 6.1.1 `__.\n\nExample usages\n==============\n\nThis represents pretty much the whole psutil API.\n\nCPU\n---\n\n.. code-block:: python\n\n >>> import psutil\n >>>\n >>> psutil.cpu_times()\n scputimes(user=3961.46, nice=169.729, system=2150.659, idle=16900.540, iowait=629.59, irq=0.0, softirq=19.42, steal=0.0, guest=0, guest_nice=0.0)\n >>>\n >>> for x in range(3):\n ... psutil.cpu_percent(interval=1)\n ...\n 4.0\n 5.9\n 3.8\n >>>\n >>> for x in range(3):\n ... psutil.cpu_percent(interval=1, percpu=True)\n ...\n [4.0, 6.9, 3.7, 9.2]\n [7.0, 8.5, 2.4, 2.1]\n [1.2, 9.0, 9.9, 7.2]\n >>>\n >>> for x in range(3):\n ... psutil.cpu_times_percent(interval=1, percpu=False)\n ...\n scputimes(user=1.5, nice=0.0, system=0.5, idle=96.5, iowait=1.5, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0)\n scputimes(user=1.0, nice=0.0, system=0.0, idle=99.0, iowait=0.0, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0)\n scputimes(user=2.0, nice=0.0, system=0.0, idle=98.0, iowait=0.0, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0)\n >>>\n >>> psutil.cpu_count()\n 4\n >>> psutil.cpu_count(logical=False)\n 2\n >>>\n >>> psutil.cpu_stats()\n scpustats(ctx_switches=20455687, interrupts=6598984, soft_interrupts=2134212, syscalls=0)\n >>>\n >>> psutil.cpu_freq()\n scpufreq(current=931.42925, min=800.0, max=3500.0)\n >>>\n >>> psutil.getloadavg() # also on Windows (emulated)\n (3.14, 3.89, 4.67)\n\nMemory\n------\n\n.. code-block:: python\n\n >>> psutil.virtual_memory()\n svmem(total=10367352832, available=6472179712, percent=37.6, used=8186245120, free=2181107712, active=4748992512, inactive=2758115328, buffers=790724608, cached=3500347392, shared=787554304)\n >>> psutil.swap_memory()\n sswap(total=2097147904, used=296128512, free=1801019392, percent=14.1, sin=304193536, sout=677842944)\n >>>\n\nDisks\n-----\n\n.. code-block:: python\n\n >>> psutil.disk_partitions()\n [sdiskpart(device='/dev/sda1', mountpoint='/', fstype='ext4', opts='rw,nosuid'),\n sdiskpart(device='/dev/sda2', mountpoint='/home', fstype='ext', opts='rw')]\n >>>\n >>> psutil.disk_usage('/')\n sdiskusage(total=21378641920, used=4809781248, free=15482871808, percent=22.5)\n >>>\n >>> psutil.disk_io_counters(perdisk=False)\n sdiskio(read_count=719566, write_count=1082197, read_bytes=18626220032, write_bytes=24081764352, read_time=5023392, write_time=63199568, read_merged_count=619166, write_merged_count=812396, busy_time=4523412)\n >>>\n\nNetwork\n-------\n\n.. code-block:: python\n\n >>> psutil.net_io_counters(pernic=True)\n {'eth0': netio(bytes_sent=485291293, bytes_recv=6004858642, packets_sent=3251564, packets_recv=4787798, errin=0, errout=0, dropin=0, dropout=0),\n 'lo': netio(bytes_sent=2838627, bytes_recv=2838627, packets_sent=30567, packets_recv=30567, errin=0, errout=0, dropin=0, dropout=0)}\n >>>\n >>> psutil.net_connections(kind='tcp')\n [sconn(fd=115, family=, type=, laddr=addr(ip='10.0.0.1', port=48776), raddr=addr(ip='93.186.135.91', port=80), status='ESTABLISHED', pid=1254),\n sconn(fd=117, family=, type=, laddr=addr(ip='10.0.0.1', port=43761), raddr=addr(ip='72.14.234.100', port=80), status='CLOSING', pid=2987),\n ...]\n >>>\n >>> psutil.net_if_addrs()\n {'lo': [snicaddr(family=, address='127.0.0.1', netmask='255.0.0.0', broadcast='127.0.0.1', ptp=None),\n snicaddr(family=, address='::1', netmask='ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', broadcast=None, ptp=None),\n snicaddr(family=, address='00:00:00:00:00:00', netmask=None, broadcast='00:00:00:00:00:00', ptp=None)],\n 'wlan0': [snicaddr(family=, address='192.168.1.3', netmask='255.255.255.0', broadcast='192.168.1.255', ptp=None),\n snicaddr(family=, address='fe80::c685:8ff:fe45:641%wlan0', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None),\n snicaddr(family=, address='c4:85:08:45:06:41', netmask=None, broadcast='ff:ff:ff:ff:ff:ff', ptp=None)]}\n >>>\n >>> psutil.net_if_stats()\n {'lo': snicstats(isup=True, duplex=, speed=0, mtu=65536, flags='up,loopback,running'),\n 'wlan0': snicstats(isup=True, duplex=, speed=100, mtu=1500, flags='up,broadcast,running,multicast')}\n >>>\n\nSensors\n-------\n\n.. code-block:: python\n\n >>> import psutil\n >>> psutil.sensors_temperatures()\n {'acpitz': [shwtemp(label='', current=47.0, high=103.0, critical=103.0)],\n 'asus': [shwtemp(label='', current=47.0, high=None, critical=None)],\n 'coretemp': [shwtemp(label='Physical id 0', current=52.0, high=100.0, critical=100.0),\n shwtemp(label='Core 0', current=45.0, high=100.0, critical=100.0)]}\n >>>\n >>> psutil.sensors_fans()\n {'asus': [sfan(label='cpu_fan', current=3200)]}\n >>>\n >>> psutil.sensors_battery()\n sbattery(percent=93, secsleft=16628, power_plugged=False)\n >>>\n\nOther system info\n-----------------\n\n.. code-block:: python\n\n >>> import psutil\n >>> psutil.users()\n [suser(name='giampaolo', terminal='pts/2', host='localhost', started=1340737536.0, pid=1352),\n suser(name='giampaolo', terminal='pts/3', host='localhost', started=1340737792.0, pid=1788)]\n >>>\n >>> psutil.boot_time()\n 1365519115.0\n >>>\n\nProcess management\n------------------\n\n.. code-block:: python\n\n >>> import psutil\n >>> psutil.pids()\n [1, 2, 3, 4, 5, 6, 7, 46, 48, 50, 51, 178, 182, 222, 223, 224, 268, 1215,\n 1216, 1220, 1221, 1243, 1244, 1301, 1601, 2237, 2355, 2637, 2774, 3932,\n 4176, 4177, 4185, 4187, 4189, 4225, 4243, 4245, 4263, 4282, 4306, 4311,\n 4312, 4313, 4314, 4337, 4339, 4357, 4358, 4363, 4383, 4395, 4408, 4433,\n 4443, 4445, 4446, 5167, 5234, 5235, 5252, 5318, 5424, 5644, 6987, 7054,\n 7055, 7071]\n >>>\n >>> p = psutil.Process(7055)\n >>> p\n psutil.Process(pid=7055, name='python3', status='running', started='09:04:44')\n >>> p.pid\n 7055\n >>> p.name()\n 'python3'\n >>> p.exe()\n '/usr/bin/python3'\n >>> p.cwd()\n '/home/giampaolo'\n >>> p.cmdline()\n ['/usr/bin/python3', 'main.py']\n >>>\n >>> p.ppid()\n 7054\n >>> p.parent()\n psutil.Process(pid=4699, name='bash', status='sleeping', started='09:06:44')\n >>> p.parents()\n [psutil.Process(pid=4699, name='bash', started='09:06:44'),\n psutil.Process(pid=4689, name='gnome-terminal-server', status='sleeping', started='0:06:44'),\n psutil.Process(pid=1, name='systemd', status='sleeping', started='05:56:55')]\n >>> p.children(recursive=True)\n [psutil.Process(pid=29835, name='python3', status='sleeping', started='11:45:38'),\n psutil.Process(pid=29836, name='python3', status='waking', started='11:43:39')]\n >>>\n >>> p.status()\n 'running'\n >>> p.create_time()\n 1267551141.5019531\n >>> p.terminal()\n '/dev/pts/0'\n >>>\n >>> p.username()\n 'giampaolo'\n >>> p.uids()\n puids(real=1000, effective=1000, saved=1000)\n >>> p.gids()\n pgids(real=1000, effective=1000, saved=1000)\n >>>\n >>> p.cpu_times()\n pcputimes(user=1.02, system=0.31, children_user=0.32, children_system=0.1, iowait=0.0)\n >>> p.cpu_percent(interval=1.0)\n 12.1\n >>> p.cpu_affinity()\n [0, 1, 2, 3]\n >>> p.cpu_affinity([0, 1]) # set\n >>> p.cpu_num()\n 1\n >>>\n >>> p.memory_info()\n pmem(rss=10915840, vms=67608576, shared=3313664, text=2310144, lib=0, data=7262208, dirty=0)\n >>> p.memory_full_info() # \"real\" USS memory usage (Linux, macOS, Win only)\n pfullmem(rss=10199040, vms=52133888, shared=3887104, text=2867200, lib=0, data=5967872, dirty=0, uss=6545408, pss=6872064, swap=0)\n >>> p.memory_percent()\n 0.7823\n >>> p.memory_maps()\n [pmmap_grouped(path='/lib/x8664-linux-gnu/libutil-2.15.so', rss=32768, size=2125824, pss=32768, shared_clean=0, shared_dirty=0, private_clean=20480, private_dirty=12288, referenced=32768, anonymous=12288, swap=0),\n pmmap_grouped(path='/lib/x8664-linux-gnu/libc-2.15.so', rss=3821568, size=3842048, pss=3821568, shared_clean=0, shared_dirty=0, private_clean=0, private_dirty=3821568, referenced=3575808, anonymous=3821568, swap=0),\n pmmap_grouped(path='[heap]', rss=32768, size=139264, pss=32768, shared_clean=0, shared_dirty=0, private_clean=0, private_dirty=32768, referenced=32768, anonymous=32768, swap=0),\n pmmap_grouped(path='[stack]', rss=2465792, size=2494464, pss=2465792, shared_clean=0, shared_dirty=0, private_clean=0, private_dirty=2465792, referenced=2277376, anonymous=2465792, swap=0),\n ...]\n >>>\n >>> p.io_counters()\n pio(read_count=478001, write_count=59371, read_bytes=700416, write_bytes=69632, read_chars=456232, write_chars=517543)\n >>>\n >>> p.open_files()\n [popenfile(path='/home/giampaolo/monit.py', fd=3, position=0, mode='r', flags=32768),\n popenfile(path='/var/log/monit.log', fd=4, position=235542, mode='a', flags=33793)]\n >>>\n >>> p.net_connections(kind='tcp')\n [pconn(fd=115, family=, type=, laddr=addr(ip='10.0.0.1', port=48776), raddr=addr(ip='93.186.135.91', port=80), status='ESTABLISHED'),\n pconn(fd=117, family=, type=, laddr=addr(ip='10.0.0.1', port=43761), raddr=addr(ip='72.14.234.100', port=80), status='CLOSING')]\n >>>\n >>> p.threads()\n [pthread(id=5234, user_time=22.5, system_time=9.2891),\n pthread(id=5237, user_time=0.0707, system_time=1.1)]\n >>>\n >>> p.num_threads()\n 4\n >>> p.num_fds()\n 8\n >>> p.num_ctx_switches()\n pctxsw(voluntary=78, involuntary=19)\n >>>\n >>> p.nice()\n 0\n >>> p.nice(10) # set\n >>>\n >>> p.ionice(psutil.IOPRIO_CLASS_IDLE) # IO priority (Win and Linux only)\n >>> p.ionice()\n pionice(ioclass=, value=0)\n >>>\n >>> p.rlimit(psutil.RLIMIT_NOFILE, (5, 5)) # set resource limits (Linux only)\n >>> p.rlimit(psutil.RLIMIT_NOFILE)\n (5, 5)\n >>>\n >>> p.environ()\n {'LC_PAPER': 'it_IT.UTF-8', 'SHELL': '/bin/bash', 'GREP_OPTIONS': '--color=auto',\n 'XDG_CONFIG_DIRS': '/etc/xdg/xdg-ubuntu:/usr/share/upstart/xdg:/etc/xdg',\n ...}\n >>>\n >>> p.as_dict()\n {'status': 'running', 'num_ctx_switches': pctxsw(voluntary=63, involuntary=1), 'pid': 5457, ...}\n >>> p.is_running()\n True\n >>> p.suspend()\n >>> p.resume()\n >>>\n >>> p.terminate()\n >>> p.kill()\n >>> p.wait(timeout=3)\n \n >>>\n >>> psutil.test()\n USER PID %CPU %MEM VSZ RSS TTY START TIME COMMAND\n root 1 0.0 0.0 24584 2240 Jun17 00:00 init\n root 2 0.0 0.0 0 0 Jun17 00:00 kthreadd\n ...\n giampaolo 31475 0.0 0.0 20760 3024 /dev/pts/0 Jun19 00:00 python2.4\n giampaolo 31721 0.0 2.2 773060 181896 00:04 10:30 chrome\n root 31763 0.0 0.0 0 0 00:05 00:00 kworker/0:1\n >>>\n\nFurther process APIs\n--------------------\n\n.. code-block:: python\n\n >>> import psutil\n >>> for proc in psutil.process_iter(['pid', 'name']):\n ... print(proc.info)\n ...\n {'pid': 1, 'name': 'systemd'}\n {'pid': 2, 'name': 'kthreadd'}\n {'pid': 3, 'name': 'ksoftirqd/0'}\n ...\n >>>\n >>> psutil.pid_exists(3)\n True\n >>>\n >>> def on_terminate(proc):\n ... print(\"process {} terminated\".format(proc))\n ...\n >>> # waits for multiple processes to terminate\n >>> gone, alive = psutil.wait_procs(procs_list, timeout=3, callback=on_terminate)\n >>>\n\nHeap info\n---------\n\n.. code-block:: python\n\n >>> import psutil\n >>> psutil.heap_info()\n pheap(heap_used=5177792, mmap_used=819200)\n >>> psutil.heap_trim()\n\nSee also `psleak `__\n\nWindows services\n----------------\n\n.. code-block:: python\n\n >>> list(psutil.win_service_iter())\n [,\n ,\n ,\n ,\n ...]\n >>> s = psutil.win_service_get('alg')\n >>> s.as_dict()\n {'binpath': 'C:\\\\Windows\\\\System32\\\\alg.exe',\n 'description': 'Provides support for 3rd party protocol plug-ins for Internet Connection Sharing',\n 'display_name': 'Application Layer Gateway Service',\n 'name': 'alg',\n 'pid': None,\n 'start_type': 'manual',\n 'status': 'stopped',\n 'username': 'NT AUTHORITY\\\\LocalService'}\n\nProjects using psutil\n=====================\n\nHere's some I find particularly interesting:\n\n- https://github.com/giampaolo/psleak\n- https://github.com/google/grr\n- https://github.com/facebook/osquery/\n- https://github.com/nicolargo/glances\n- https://github.com/aristocratos/bpytop\n- https://github.com/Jahaja/psdash\n- https://github.com/ajenti/ajenti\n- https://github.com/home-assistant/home-assistant/\n\nPortings\n========\n\n- Go: https://github.com/shirou/gopsutil\n- C: https://github.com/hamon-in/cpslib\n- Rust: https://github.com/rust-psutil/rust-psutil\n- Nim: https://github.com/johnscillieri/psutil-nim\n\n\n\n", - "description_content_type": "text/x-rst", - "keywords": [ - "ps", - "top", - "kill", - "free", - "lsof", - "netstat", - "nice", - "tty", - "ionice", - "uptime", - "taskmgr", - "process", - "df", - "iotop", - "iostat", - "ifconfig", - "taskset", - "who", - "pidof", - "pmap", - "smem", - "pstree", - "monitoring", - "ulimit", - "prlimit", - "smem", - "performance", - "metrics", - "agent", - "observability" - ], - "home_page": "https://github.com/giampaolo/psutil", - "author": "Giampaolo Rodola", - "author_email": "g.rodola@gmail.com", - "license": "BSD-3-Clause", - "license_file": [ - "LICENSE" - ], - "classifier": [ - "Development Status :: 5 - Production/Stable", - "Environment :: Console", - "Intended Audience :: Developers", - "Intended Audience :: Information Technology", - "Intended Audience :: System Administrators", - "Operating System :: MacOS :: MacOS X", - "Operating System :: Microsoft :: Windows :: Windows 10", - "Operating System :: Microsoft :: Windows :: Windows 11", - "Operating System :: Microsoft :: Windows :: Windows 7", - "Operating System :: Microsoft :: Windows :: Windows 8", - "Operating System :: Microsoft :: Windows :: Windows 8.1", - "Operating System :: Microsoft :: Windows :: Windows Server 2003", - "Operating System :: Microsoft :: Windows :: Windows Server 2008", - "Operating System :: Microsoft :: Windows :: Windows Vista", - "Operating System :: Microsoft :: Windows", - "Operating System :: Microsoft", - "Operating System :: OS Independent", - "Operating System :: POSIX :: AIX", - "Operating System :: POSIX :: BSD :: FreeBSD", - "Operating System :: POSIX :: BSD :: NetBSD", - "Operating System :: POSIX :: BSD :: OpenBSD", - "Operating System :: POSIX :: BSD", - "Operating System :: POSIX :: Linux", - "Operating System :: POSIX :: SunOS/Solaris", - "Operating System :: POSIX", - "Programming Language :: C", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: Implementation :: CPython", - "Programming Language :: Python :: Implementation :: PyPy", - "Programming Language :: Python", - "Topic :: Software Development :: Libraries :: Python Modules", - "Topic :: Software Development :: Libraries", - "Topic :: System :: Benchmark", - "Topic :: System :: Hardware", - "Topic :: System :: Monitoring", - "Topic :: System :: Networking :: Monitoring :: Hardware Watchdog", - "Topic :: System :: Networking :: Monitoring", - "Topic :: System :: Networking", - "Topic :: System :: Operating System", - "Topic :: System :: Systems Administration", - "Topic :: Utilities" - ], - "requires_dist": [ - "psleak ; extra == 'dev'", - "pytest ; extra == 'dev'", - "pytest-instafail ; extra == 'dev'", - "pytest-xdist ; extra == 'dev'", - "setuptools ; extra == 'dev'", - "abi3audit ; extra == 'dev'", - "black ; extra == 'dev'", - "check-manifest ; extra == 'dev'", - "coverage ; extra == 'dev'", - "packaging ; extra == 'dev'", - "pylint ; extra == 'dev'", - "pyperf ; extra == 'dev'", - "pypinfo ; extra == 'dev'", - "pytest-cov ; extra == 'dev'", - "requests ; extra == 'dev'", - "rstcheck ; extra == 'dev'", - "ruff ; extra == 'dev'", - "sphinx ; extra == 'dev'", - "sphinx-rtd-theme ; extra == 'dev'", - "toml-sort ; extra == 'dev'", - "twine ; extra == 'dev'", - "validate-pyproject[all] ; extra == 'dev'", - "virtualenv ; extra == 'dev'", - "vulture ; extra == 'dev'", - "wheel ; extra == 'dev'", - "colorama ; (os_name == \"nt\") and extra == 'dev'", - "pyreadline3 ; (os_name == \"nt\") and extra == 'dev'", - "pywin32 ; (os_name == \"nt\" and implementation_name != \"pypy\") and extra == 'dev'", - "wheel ; (os_name == \"nt\" and implementation_name != \"pypy\") and extra == 'dev'", - "wmi ; (os_name == \"nt\" and implementation_name != \"pypy\") and extra == 'dev'", - "psleak ; extra == 'test'", - "pytest ; extra == 'test'", - "pytest-instafail ; extra == 'test'", - "pytest-xdist ; extra == 'test'", - "setuptools ; extra == 'test'", - "pywin32 ; (os_name == \"nt\" and implementation_name != \"pypy\") and extra == 'test'", - "wheel ; (os_name == \"nt\" and implementation_name != \"pypy\") and extra == 'test'", - "wmi ; (os_name == \"nt\" and implementation_name != \"pypy\") and extra == 'test'" - ], - "requires_python": ">=3.6", - "provides_extra": [ - "dev", - "test" - ] - } - }, - { - "download_info": { - "url": "https://files.pythonhosted.org/packages/5c/44/c85361f65dbe00eea8576ee467c768d25129989efb76e94f205e9ca9bb46/pillow-12.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", - "archive_info": { - "hashes": { - "sha256": "251bf95b67017e27b13d82f5b326234ca62d70f9cf4c2b9032de2358a3b12c7b" - }, - "hash": "sha256=251bf95b67017e27b13d82f5b326234ca62d70f9cf4c2b9032de2358a3b12c7b" - } - }, - "is_direct": false, - "is_yanked": false, - "requested": true, - "metadata": { - "metadata_version": "2.4", - "name": "pillow", - "version": "12.3.0", - "dynamic": [ - "license-file" - ], - "summary": "Python Imaging Library (fork)", - "description": "

\n \"Pillow\n

\n\n# Pillow\n\n## Python Imaging Library (Fork)\n\nPillow is the friendly PIL fork by [Jeffrey 'Alex' Clark and\ncontributors](https://github.com/python-pillow/Pillow/graphs/contributors).\nPIL is the Python Imaging Library by Fredrik Lundh and contributors.\nDevelopment is supported by:\n- [Tidelift](https://tidelift.com/subscription/pkg/pypi-pillow?utm_source=pypi-pillow&utm_medium=readme&utm_campaign=enterprise) (since 2018)\n- [Thanks.dev](https://thanks.dev) (since 2023)\n- [GitHub Sponsors](https://github.com/sponsors/python-pillow) (since 2026)\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
docs\n \n
tests\n \n \n \n \n \n \n \n \n
package\n \n \n \n \n \n
social\n \n \n
\n\n## Overview\n\nThe Python Imaging Library adds image processing capabilities to your Python interpreter.\n\nThis library provides extensive file format support, an efficient internal representation, and fairly powerful image processing capabilities.\n\nThe core image library is designed for fast access to data stored in a few basic pixel formats. It should provide a solid foundation for a general image processing tool.\n\n## More information\n\n- [Documentation](https://pillow.readthedocs.io/)\n - [Installation](https://pillow.readthedocs.io/en/latest/installation/basic-installation.html)\n - [Handbook](https://pillow.readthedocs.io/en/latest/handbook/index.html)\n- [Contribute](https://github.com/python-pillow/Pillow/blob/main/.github/CONTRIBUTING.md)\n - [Issues](https://github.com/python-pillow/Pillow/issues)\n - [Pull requests](https://github.com/python-pillow/Pillow/pulls)\n- [Release notes](https://pillow.readthedocs.io/en/stable/releasenotes/index.html)\n- [Changelog](https://github.com/python-pillow/Pillow/releases)\n - [Pre-fork](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst#pre-fork)\n\n## Report a vulnerability\n\nTo report sensitive vulnerability information, report it [privately on GitHub](https://github.com/python-pillow/Pillow/security/advisories/new).\n\nIf you cannot use GitHub, use the [Tidelift security contact](https://tidelift.com/security). Tidelift will coordinate the fix and disclosure.\n\nDO NOT report sensitive vulnerability information in public.\n", - "description_content_type": "text/markdown", - "keywords": [ - "Imaging" - ], - "author_email": "Jeffrey 'Alex' Clark ", - "license_expression": "MIT-CMU", - "license_file": [ - "LICENSE" - ], - "classifier": [ - "Development Status :: 6 - Mature", - "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - "Programming Language :: Python :: 3.14", - "Programming Language :: Python :: Implementation :: CPython", - "Programming Language :: Python :: Implementation :: PyPy", - "Topic :: Multimedia :: Graphics", - "Topic :: Multimedia :: Graphics :: Capture :: Digital Camera", - "Topic :: Multimedia :: Graphics :: Capture :: Screen Capture", - "Topic :: Multimedia :: Graphics :: Graphics Conversion", - "Topic :: Multimedia :: Graphics :: Viewers", - "Typing :: Typed" - ], - "requires_dist": [ - "furo; extra == \"docs\"", - "olefile; extra == \"docs\"", - "sphinx>=8.2; extra == \"docs\"", - "sphinx-autobuild; extra == \"docs\"", - "sphinx-copybutton; extra == \"docs\"", - "sphinx-inline-tabs; extra == \"docs\"", - "sphinxext-opengraph; extra == \"docs\"", - "olefile; extra == \"fpx\"", - "olefile; extra == \"mic\"", - "arro3-compute; extra == \"test-arrow\"", - "arro3-core; extra == \"test-arrow\"", - "nanoarrow; extra == \"test-arrow\"", - "pyarrow; extra == \"test-arrow\"", - "coverage>=7.4.2; extra == \"tests\"", - "defusedxml; extra == \"tests\"", - "markdown2; extra == \"tests\"", - "olefile; extra == \"tests\"", - "packaging; extra == \"tests\"", - "pytest; extra == \"tests\"", - "pytest-cov; extra == \"tests\"", - "pytest-timeout; extra == \"tests\"", - "pytest-xdist; extra == \"tests\"", - "setuptools; extra == \"tests\"", - "trove-classifiers>=2024.10.12; extra == \"tests\"", - "defusedxml; extra == \"xmp\"" - ], - "requires_python": ">=3.10", - "project_url": [ - "Release notes, https://pillow.readthedocs.io/en/stable/releasenotes/index.html", - "Changelog, https://github.com/python-pillow/Pillow/releases", - "Documentation, https://pillow.readthedocs.io", - "Funding, https://tidelift.com/subscription/pkg/pypi-pillow?utm_source=pypi-pillow&utm_medium=pypi", - "Homepage, https://python-pillow.github.io", - "Mastodon, https://fosstodon.org/@pillow", - "Source, https://github.com/python-pillow/Pillow" - ], - "provides_extra": [ - "docs", - "fpx", - "mic", - "test-arrow", - "tests", - "xmp" - ] - } - }, - { - "download_info": { - "url": "https://files.pythonhosted.org/packages/28/50/f203ff3a3ddfe19308efc83c5a3a29ed02bf786732ec35e68bf9162f3365/safetensors-0.8.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "archive_info": { - "hashes": { - "sha256": "fd6f3f93c9a0a7cc2788ee63fb763353d4bd2e89b0751bc78fcf7dda00bea774" - }, - "hash": "sha256=fd6f3f93c9a0a7cc2788ee63fb763353d4bd2e89b0751bc78fcf7dda00bea774" - } - }, - "is_direct": false, - "is_yanked": false, - "requested": true, - "metadata": { - "metadata_version": "2.4", - "name": "safetensors", - "version": "0.8.0", - "description": "## Installation\n\n```\npip install safetensors\n```\n\n\n## Usage\n\n### Numpy\n\n```python\nfrom safetensors.numpy import save_file, load_file\nimport numpy as np\n\ntensors = {\n \"a\": np.zeros((2, 2)),\n \"b\": np.zeros((2, 3), dtype=np.uint8)\n}\n\nsave_file(tensors, \"./model.safetensors\")\n\n\n# Now loading\nloaded = load_file(\"./model.safetensors\")\n```\n\n### Torch\n\n```python\nfrom safetensors.torch import save_file, load_file\nimport torch\n\ntensors = {\n \"a\": torch.zeros((2, 2)),\n \"b\": torch.zeros((2, 3), dtype=torch.uint8)\n}\n\nsave_file(tensors, \"./model.safetensors\")\n\n\n# Now loading\nloaded = load_file(\"./model.safetensors\")\n```\n\n### Developing\n\n```\n# inside ./safetensors/bindings/python\npip install .[dev]\n```\nShould be enough to install this library locally.\n\n### Testing\n\n```\n# inside ./safetensors/bindings/python\npip install .[dev]\npytest -sv tests/\n```\n\n", - "description_content_type": "text/markdown; charset=UTF-8; variant=GFM", - "author_email": "Nicolas Patry , Luc Georges , Daniël De Kok ", - "license_file": [ - "LICENSE" - ], - "classifier": [ - "Development Status :: 5 - Production/Stable", - "Intended Audience :: Developers", - "Intended Audience :: Education", - "Intended Audience :: Science/Research", - "License :: OSI Approved :: Apache Software License", - "Operating System :: OS Independent", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - "Programming Language :: Python :: 3.14", - "Topic :: Scientific/Engineering :: Artificial Intelligence", - "Typing :: Typed" - ], - "requires_dist": [ - "safetensors[torch] ; extra == 'all'", - "safetensors[numpy] ; extra == 'all'", - "safetensors[jax] ; extra == 'all'", - "safetensors[paddlepaddle] ; extra == 'all'", - "safetensors[convert] ; extra == 'all'", - "safetensors[quality] ; extra == 'all'", - "safetensors[testing] ; extra == 'all'", - "safetensors[torch] ; extra == 'convert'", - "huggingface-hub>=1.4 ; extra == 'convert'", - "safetensors[all] ; extra == 'dev'", - "safetensors[pinned-tf] ; extra == 'dev'", - "safetensors[numpy] ; extra == 'jax'", - "flax>=0.6.3 ; extra == 'jax'", - "jax>=0.3.25 ; extra == 'jax'", - "jaxlib>=0.3.25 ; extra == 'jax'", - "mlx>=0.0.9 ; extra == 'mlx'", - "numpy>=1.24.6 ; extra == 'numpy'", - "safetensors[numpy] ; extra == 'paddlepaddle'", - "paddlepaddle>=2.4.1 ; extra == 'paddlepaddle'", - "safetensors[numpy] ; extra == 'pinned-tf'", - "tensorflow==2.18.0 ; extra == 'pinned-tf'", - "ruff ; extra == 'quality'", - "safetensors[numpy] ; extra == 'tensorflow'", - "tensorflow>=2.11.0 ; extra == 'tensorflow'", - "safetensors[numpy] ; extra == 'testing'", - "h5py>=3.7.0 ; extra == 'testing'", - "setuptools-rust>=1.12.0 ; extra == 'testing'", - "pytest>=9.0 ; extra == 'testing'", - "pytest-benchmark>=5.2 ; extra == 'testing'", - "hypothesis>=6.70.2 ; extra == 'testing'", - "fsspec>=2024.6.0 ; extra == 'testing'", - "s3fs>=2024.6.0 ; extra == 'testing'", - "safetensors[numpy] ; extra == 'tf-nightly'", - "tf-nightly ; extra == 'tf-nightly'", - "safetensors[numpy] ; extra == 'torch'", - "torch>=2.4 ; extra == 'torch'" - ], - "requires_python": ">=3.10", - "project_url": [ - "Homepage, https://github.com/huggingface/safetensors", - "Source, https://github.com/huggingface/safetensors" - ], - "provides_extra": [ - "all", - "convert", - "dev", - "jax", - "mlx", - "numpy", - "paddlepaddle", - "pinned-tf", - "quality", - "tensorflow", - "testing", - "tf-nightly", - "torch" - ] - } - }, - { - "download_info": { - "url": "https://files.pythonhosted.org/packages/3e/30/e900b21425a860e195f32e37657aa1f7c7f2b1bfb26f03ca209b90933c06/annotated_doc-0.0.5-py3-none-any.whl", - "archive_info": { - "hashes": { - "sha256": "117bac03a25ede5df5440e855b32d556049ca169ead221505badf432fed4b101" - }, - "hash": "sha256=117bac03a25ede5df5440e855b32d556049ca169ead221505badf432fed4b101" - } - }, - "is_direct": false, - "is_yanked": false, - "requested": false, - "metadata": { - "metadata_version": "2.4", - "name": "annotated-doc", - "version": "0.0.5", - "summary": "Document parameters, class attributes, return types, and variables inline, with Annotated.", - "description": "# Annotated Doc\n\nDocument parameters, class attributes, return types, and variables inline, with `Annotated`.\n\n\n \"Test\"\n\n\n \"Coverage\"\n\n\n \"Package\n\n\n \"Supported\n\n\n## Installation\n\n```bash\npip install annotated-doc\n```\n\nOr with `uv`:\n\n```Python\nuv add annotated-doc\n```\n\n## Usage\n\nImport `Doc` and pass a single literal string with the documentation for the specific parameter, class attribute, return type, or variable.\n\nFor example, to document a parameter `name` in a function `hi` you could do:\n\n```Python\nfrom typing import Annotated\n\nfrom annotated_doc import Doc\n\ndef hi(name: Annotated[str, Doc(\"Who to say hi to\")]) -> None:\n print(f\"Hi, {name}!\")\n```\n\nYou can also use it to document class attributes:\n\n```Python\nfrom typing import Annotated\n\nfrom annotated_doc import Doc\n\nclass User:\n name: Annotated[str, Doc(\"The user's name\")]\n age: Annotated[int, Doc(\"The user's age\")]\n```\n\nThe same way, you could document return types and variables, or anything that could have a type annotation with `Annotated`.\n\n## Who Uses This\n\n`annotated-doc` was made for:\n\n* [FastAPI](https://fastapi.tiangolo.com/)\n* [Typer](https://typer.tiangolo.com/)\n* [SQLModel](https://sqlmodel.tiangolo.com/)\n* [Asyncer](https://asyncer.tiangolo.com/)\n\n`annotated-doc` is supported by [griffe-typingdoc](https://github.com/mkdocstrings/griffe-typingdoc), which powers reference documentation like the one in the [FastAPI Reference](https://fastapi.tiangolo.com/reference/).\n\n## Reasons not to use `annotated-doc`\n\nYou are already comfortable with one of the existing docstring formats, like:\n\n* Sphinx\n* numpydoc\n* Google\n* Keras\n\nYour team is already comfortable using them.\n\nYou prefer having the documentation about parameters all together in a docstring, separated from the code defining them.\n\nYou care about a specific set of users, using one specific editor, and that editor already has support for the specific docstring format you use.\n\n## Reasons to use `annotated-doc`\n\n* No micro-syntax to learn for newcomers, it’s **just Python** syntax.\n* **Editing** would be already fully supported by default by any editor (current or future) supporting Python syntax, including syntax errors, syntax highlighting, etc.\n* **Rendering** would be relatively straightforward to implement by static tools (tools that don't need runtime execution), as the information can be extracted from the AST they normally already create.\n* **Deduplication of information**: the name of a parameter would be defined in a single place, not duplicated inside of a docstring.\n* **Elimination** of the possibility of having **inconsistencies** when removing a parameter or class variable and **forgetting to remove** its documentation.\n* **Minimization** of the probability of adding a new parameter or class variable and **forgetting to add its documentation**.\n* **Elimination** of the possibility of having **inconsistencies** between the **name** of a parameter in the **signature** and the name in the docstring when it is renamed.\n* **Access** to the documentation string for each symbol at **runtime**, including existing (older) Python versions.\n* A more formalized way to document other symbols, like type aliases, that could use Annotated.\n* **Support** for apps using FastAPI, Typer and others.\n* **AI Accessibility**: AI tools will have an easier way understanding each parameter as the distance from documentation to parameter is much closer.\n\n## History\n\nI ([@tiangolo](https://github.com/tiangolo)) originally wanted for this to be part of the Python standard library (in [PEP 727](https://peps.python.org/pep-0727/)), but the proposal was withdrawn as there was a fair amount of negative feedback and opposition.\n\nThe conclusion was that this was better done as an external effort, in a third-party library.\n\nSo, here it is, with a simpler approach, as a third-party library, in a way that can be used by others, starting with FastAPI and friends.\n\n## License\n\nThis project is licensed under the terms of the MIT license.\n", - "description_content_type": "text/markdown", - "author_email": "=?utf-8?q?Sebasti=C3=A1n_Ram=C3=ADrez?= ", - "license_expression": "MIT", - "license_file": [ - "LICENSE" - ], - "classifier": [ - "Intended Audience :: Information Technology", - "Intended Audience :: System Administrators", - "Operating System :: OS Independent", - "Programming Language :: Python :: 3", - "Programming Language :: Python", - "Topic :: Internet", - "Topic :: Software Development :: Libraries :: Application Frameworks", - "Topic :: Software Development :: Libraries :: Python Modules", - "Topic :: Software Development :: Libraries", - "Topic :: Software Development", - "Typing :: Typed", - "Development Status :: 4 - Beta", - "Intended Audience :: Developers", - "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - "Programming Language :: Python :: 3.14" - ], - "requires_python": ">=3.9", - "project_url": [ - "Homepage, https://github.com/fastapi/annotated-doc", - "Documentation, https://github.com/fastapi/annotated-doc", - "Repository, https://github.com/fastapi/annotated-doc", - "Issues, https://github.com/fastapi/annotated-doc/issues", - "Changelog, https://github.com/fastapi/annotated-doc/release-notes.md" - ] - } - }, - { - "download_info": { - "url": "https://files.pythonhosted.org/packages/58/50/6c0d534c5f134586a8e1ba4e330569e32f057e33372ae556463212fb4cd3/click-8.5.0-py3-none-any.whl", - "archive_info": { - "hashes": { - "sha256": "255bc9599cf7748b4b1a446ccc735421bd08a2ae529a8b88597d3de5664ee360" - }, - "hash": "sha256=255bc9599cf7748b4b1a446ccc735421bd08a2ae529a8b88597d3de5664ee360" - } - }, - "is_direct": false, - "is_yanked": false, - "requested": false, - "metadata": { - "metadata_version": "2.4", - "name": "click", - "version": "8.5.0", - "summary": "Composable command line interface toolkit", - "description": "
\"\"
\n\n# Click\n\nClick is a Python package for creating beautiful command line interfaces\nin a composable way with as little code as necessary. It's the \"Command\nLine Interface Creation Kit\". It's highly configurable but comes with\nsensible defaults out of the box.\n\nIt aims to make the process of writing command line tools quick and fun\nwhile also preventing any frustration caused by the inability to\nimplement an intended CLI API.\n\nClick in three points:\n\n- Arbitrary nesting of commands\n- Automatic help page generation\n- Supports lazy loading of subcommands at runtime\n\n\n## A Simple Example\n\n```python\nimport click\n\n@click.command()\n@click.option(\"--count\", default=1, help=\"Number of greetings.\")\n@click.option(\"--name\", prompt=\"Your name\", help=\"The person to greet.\")\ndef hello(count, name):\n \"\"\"Simple program that greets NAME for a total of COUNT times.\"\"\"\n for _ in range(count):\n click.echo(f\"Hello, {name}!\")\n\nif __name__ == '__main__':\n hello()\n```\n\n```\n$ python hello.py --count=3\nYour name: Click\nHello, Click!\nHello, Click!\nHello, Click!\n```\n\n\n## Donate\n\nThe Pallets organization develops and supports Click and other popular\npackages. In order to grow the community of contributors and users, and\nallow the maintainers to devote more time to the projects, [please\ndonate today][].\n\n[please donate today]: https://palletsprojects.com/donate\n\n## Contributing\n\nSee our [detailed contributing documentation][contrib] for many ways to\ncontribute, including reporting issues, requesting features, asking or answering\nquestions, and making PRs.\n\n[contrib]: https://palletsprojects.com/contributing/\n\n", - "description_content_type": "text/markdown", - "maintainer_email": "Pallets ", - "license_expression": "BSD-3-Clause", - "license_file": [ - "LICENSE.txt" - ], - "classifier": [ - "Development Status :: 5 - Production/Stable", - "Intended Audience :: Developers", - "Operating System :: OS Independent", - "Programming Language :: Python", - "Typing :: Typed" - ], - "requires_python": ">=3.10", - "project_url": [ - "Changes, https://click.palletsprojects.com/page/changes/", - "Chat, https://discord.gg/pallets", - "Documentation, https://click.palletsprojects.com/", - "Donate, https://palletsprojects.com/donate", - "Source, https://github.com/pallets/click/" - ] - } - }, - { - "download_info": { - "url": "https://files.pythonhosted.org/packages/6c/c0/a98505f18594f1bce828bb159cec0fcf9860562f1a2c85913409fc8f3d9e/fsspec-2026.9.0-py3-none-any.whl", - "archive_info": { - "hashes": { - "sha256": "8dd6e646e99ea382bd85f97a45e6b526a442d79423a7dc673f1e2756d05fcb5f" - }, - "hash": "sha256=8dd6e646e99ea382bd85f97a45e6b526a442d79423a7dc673f1e2756d05fcb5f" - } - }, - "is_direct": false, - "is_yanked": false, - "requested": false, - "metadata": { - "metadata_version": "2.5", - "name": "fsspec", - "version": "2026.9.0", - "summary": "File-system specification", - "description": "# filesystem_spec\n\n[![PyPI version](https://badge.fury.io/py/fsspec.svg)](https://pypi.python.org/pypi/fsspec/)\n[![Anaconda-Server Badge](https://anaconda.org/conda-forge/fsspec/badges/version.svg)](https://anaconda.org/conda-forge/fsspec)\n![Build](https://github.com/fsspec/filesystem_spec/workflows/CI/badge.svg)\n[![Docs](https://readthedocs.org/projects/filesystem-spec/badge/?version=latest)](https://filesystem-spec.readthedocs.io/en/latest/?badge=latest)\n\nA specification for pythonic filesystems.\n\n## Install\n\n```bash\npip install fsspec\n```\n\nwould install the base fsspec. Various optionally supported features might require specification of custom\nextra require, e.g. `pip install fsspec[ssh]` will install dependencies for `ssh` backends support.\nUse `pip install fsspec[full]` for installation of all known extra dependencies.\n\nUp-to-date package also provided through conda-forge distribution:\n\n```bash\nconda install -c conda-forge fsspec\n```\n\n\n## Purpose\n\nTo produce a template or specification for a file-system interface, that specific implementations should follow,\nso that applications making use of them can rely on a common behaviour and not have to worry about the specific\ninternal implementation decisions with any given backend. Many such implementations are included in this package,\nor in sister projects such as `s3fs` and `gcsfs`.\n\nIn addition, if this is well-designed, then additional functionality, such as a key-value store or FUSE\nmounting of the file-system implementation may be available for all implementations \"for free\".\n\n## Documentation\n\nPlease refer to [RTD](https://filesystem-spec.readthedocs.io/en/latest/?badge=latest)\n\n## Develop\n\nfsspec uses GitHub Actions for CI. Environment files can be found\nin the \"ci/\" directory. Note that the main environment is called \"py38\",\nbut it is expected that the version of python installed be adjustable at\nCI runtime. For local use, pick a version suitable for you.\n\n```bash\n# For a new environment (mamba / conda).\nmamba create -n fsspec -c conda-forge python=3.10 -y\nconda activate fsspec\n\n# Standard dev install with docs and tests.\npip install -e \".[dev,doc,test]\"\n\n# Full tests except for downstream\npip install s3fs\npip uninstall s3fs\npip install -e .[dev,doc,test_full]\npip install s3fs --no-deps\npytest -v\n\n# Downstream tests.\nsh install_s3fs.sh\n# Windows powershell.\ninstall_s3fs.sh\n```\n\n### Testing\n\nTests can be run in the dev environment, if activated, via ``pytest fsspec``.\n\nThe full fsspec suite requires a system-level docker, docker-compose, and fuse\ninstallation. If only making changes to one backend implementation, it is\nnot generally necessary to run all tests locally.\n\nIt is expected that contributors ensure that any change to fsspec does not\ncause issues or regressions for either other fsspec-related packages such\nas gcsfs and s3fs, nor for downstream users of fsspec. The \"downstream\" CI\nrun and corresponding environment file run a set of tests from the dask\ntest suite, and very minimal tests against pandas and zarr from the\ntest_downstream.py module in this repo.\n\n### Code Formatting\n\nfsspec uses [Black](https://black.readthedocs.io/en/stable) to ensure\na consistent code format throughout the project.\nRun ``black fsspec`` from the root of the filesystem_spec repository to\nauto-format your code. Additionally, many editors have plugins that will apply\n``black`` as you edit files. ``black`` is included in the ``tox`` environments.\n\nOptionally, you may wish to setup [pre-commit hooks](https://pre-commit.com) to\nautomatically run ``black`` when you make a git commit.\nRun ``pre-commit install --install-hooks`` from the root of the\nfilesystem_spec repository to setup pre-commit hooks. ``black`` will now be run\nbefore you commit, reformatting any changed files. You can format without\ncommitting via ``pre-commit run`` or skip these checks with ``git commit\n--no-verify``.\n\n## Support\n\nWork on this repository is supported in part by:\n\n\"Anaconda, Inc. - Advancing AI through open source.\"\n\n\"anaconda\n", - "description_content_type": "text/markdown", - "keywords": [ - "file" - ], - "maintainer_email": "Martin Durant ", - "license_expression": "BSD-3-Clause", - "license_file": [ - "LICENSE" - ], - "classifier": [ - "Development Status :: 4 - Beta", - "Intended Audience :: Developers", - "Operating System :: OS Independent", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - "Programming Language :: Python :: 3.14" - ], - "requires_dist": [ - "adlfs; extra == 'abfs'", - "adlfs; extra == 'adl'", - "pyarrow>=1; extra == 'arrow'", - "dask; extra == 'dask'", - "distributed; extra == 'dask'", - "pre-commit; extra == 'dev'", - "ruff>=0.5; extra == 'dev'", - "numpydoc; extra == 'doc'", - "sphinx; extra == 'doc'", - "sphinx-design; extra == 'doc'", - "sphinx-rtd-theme; extra == 'doc'", - "yarl; extra == 'doc'", - "dropbox; extra == 'dropbox'", - "dropboxdrivefs; extra == 'dropbox'", - "requests; extra == 'dropbox'", - "adlfs; extra == 'full'", - "aiohttp!=4.0.0a0,!=4.0.0a1; extra == 'full'", - "dask; extra == 'full'", - "distributed; extra == 'full'", - "dropbox; extra == 'full'", - "dropboxdrivefs; extra == 'full'", - "fusepy; extra == 'full'", - "gcsfs>=2026.4.0; extra == 'full'", - "libarchive-c; extra == 'full'", - "ocifs; extra == 'full'", - "panel; extra == 'full'", - "paramiko; extra == 'full'", - "pyarrow>=1; extra == 'full'", - "pygit2; extra == 'full'", - "requests; extra == 'full'", - "s3fs>=2026.6.0; extra == 'full'", - "smbprotocol; extra == 'full'", - "tqdm; extra == 'full'", - "fusepy; extra == 'fuse'", - "gcsfs>=2026.4.0; extra == 'gcs'", - "pygit2; extra == 'git'", - "requests; extra == 'github'", - "gcsfs>=2026.4.0; extra == 'gs'", - "panel; extra == 'gui'", - "pyarrow>=1; extra == 'hdfs'", - "aiohttp!=4.0.0a0,!=4.0.0a1; extra == 'http'", - "libarchive-c; extra == 'libarchive'", - "ocifs; extra == 'oci'", - "s3fs>=2026.6.0; extra == 's3'", - "paramiko; extra == 'sftp'", - "smbprotocol; extra == 'smb'", - "paramiko; extra == 'ssh'", - "aiohttp!=4.0.0a0,!=4.0.0a1; extra == 'test'", - "numpy; extra == 'test'", - "pytest; extra == 'test'", - "pytest-asyncio!=0.22.0; extra == 'test'", - "pytest-benchmark; extra == 'test'", - "pytest-cov; extra == 'test'", - "pytest-mock; extra == 'test'", - "pytest-recording; extra == 'test'", - "pytest-rerunfailures; extra == 'test'", - "requests; extra == 'test'", - "aiobotocore<3.0.0,>=2.5.4; extra == 'test-downstream'", - "dask[dataframe,test]; extra == 'test-downstream'", - "moto[server]<5,>4; extra == 'test-downstream'", - "pytest-timeout; extra == 'test-downstream'", - "xarray; extra == 'test-downstream'", - "zarr; extra == 'test-downstream'", - "adlfs; extra == 'test-full'", - "aiohttp!=4.0.0a0,!=4.0.0a1; extra == 'test-full'", - "backports-zstd; (python_version < '3.14') and extra == 'test-full'", - "cloudpickle; extra == 'test-full'", - "dask; extra == 'test-full'", - "distributed; extra == 'test-full'", - "dropbox; extra == 'test-full'", - "dropboxdrivefs; extra == 'test-full'", - "fastparquet; extra == 'test-full'", - "fusepy; extra == 'test-full'", - "gcsfs>=2026.4.0; extra == 'test-full'", - "jinja2; extra == 'test-full'", - "kerchunk; extra == 'test-full'", - "libarchive-c; extra == 'test-full'", - "lz4; extra == 'test-full'", - "notebook; extra == 'test-full'", - "numpy; extra == 'test-full'", - "ocifs; extra == 'test-full'", - "pandas<3.0.0; extra == 'test-full'", - "panel; extra == 'test-full'", - "paramiko; extra == 'test-full'", - "pyarrow>=1; extra == 'test-full'", - "pyftpdlib; extra == 'test-full'", - "pygit2; extra == 'test-full'", - "pytest; extra == 'test-full'", - "pytest-asyncio!=0.22.0; extra == 'test-full'", - "pytest-benchmark; extra == 'test-full'", - "pytest-cov; extra == 'test-full'", - "pytest-mock; extra == 'test-full'", - "pytest-recording; extra == 'test-full'", - "pytest-rerunfailures; extra == 'test-full'", - "python-snappy; extra == 'test-full'", - "requests; extra == 'test-full'", - "s3fs>=2026.6.0; extra == 'test-full'", - "smbprotocol; extra == 'test-full'", - "tqdm; extra == 'test-full'", - "urllib3; extra == 'test-full'", - "zarr<3.2.0; extra == 'test-full'", - "zstandard; (python_version < '3.14') and extra == 'test-full'", - "tqdm; extra == 'tqdm'" - ], - "requires_python": ">=3.10", - "project_url": [ - "Changelog, https://filesystem-spec.readthedocs.io/en/latest/changelog.html", - "Documentation, https://filesystem-spec.readthedocs.io/en/latest/", - "Homepage, https://github.com/fsspec/filesystem_spec" - ], - "provides_extra": [ - "abfs", - "adl", - "arrow", - "dask", - "dev", - "doc", - "dropbox", - "entrypoints", - "full", - "fuse", - "gcs", - "git", - "github", - "gs", - "gui", - "hdfs", - "http", - "libarchive", - "oci", - "s3", - "sftp", - "smb", - "ssh", - "test", - "test-downstream", - "test-full", - "tqdm" - ] - } - }, - { - "download_info": { - "url": "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", - "archive_info": { - "hashes": { - "sha256": "63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86" - }, - "hash": "sha256=63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86" - } - }, - "is_direct": false, - "is_yanked": false, - "requested": false, - "metadata": { - "metadata_version": "2.4", - "name": "h11", - "version": "0.16.0", - "dynamic": [ - "author", - "author-email", - "classifier", - "description", - "home-page", - "license", - "license-file", - "requires-python", - "summary" - ], - "summary": "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1", - "description": "h11\n===\n\n.. image:: https://travis-ci.org/python-hyper/h11.svg?branch=master\n :target: https://travis-ci.org/python-hyper/h11\n :alt: Automated test status\n\n.. image:: https://codecov.io/gh/python-hyper/h11/branch/master/graph/badge.svg\n :target: https://codecov.io/gh/python-hyper/h11\n :alt: Test coverage\n\n.. image:: https://readthedocs.org/projects/h11/badge/?version=latest\n :target: http://h11.readthedocs.io/en/latest/?badge=latest\n :alt: Documentation Status\n\nThis is a little HTTP/1.1 library written from scratch in Python,\nheavily inspired by `hyper-h2 `_.\n\nIt's a \"bring-your-own-I/O\" library; h11 contains no IO code\nwhatsoever. This means you can hook h11 up to your favorite network\nAPI, and that could be anything you want: synchronous, threaded,\nasynchronous, or your own implementation of `RFC 6214\n`_ -- h11 won't judge you.\n(Compare this to the current state of the art, where every time a `new\nnetwork API `_ comes along then someone\ngets to start over reimplementing the entire HTTP protocol from\nscratch.) Cory Benfield made an `excellent blog post describing the\nbenefits of this approach\n`_, or if you like video\nthen here's his `PyCon 2016 talk on the same theme\n`_.\n\nThis also means that h11 is not immediately useful out of the box:\nit's a toolkit for building programs that speak HTTP, not something\nthat could directly replace ``requests`` or ``twisted.web`` or\nwhatever. But h11 makes it much easier to implement something like\n``requests`` or ``twisted.web``.\n\nAt a high level, working with h11 goes like this:\n\n1) First, create an ``h11.Connection`` object to track the state of a\n single HTTP/1.1 connection.\n\n2) When you read data off the network, pass it to\n ``conn.receive_data(...)``; you'll get back a list of objects\n representing high-level HTTP \"events\".\n\n3) When you want to send a high-level HTTP event, create the\n corresponding \"event\" object and pass it to ``conn.send(...)``;\n this will give you back some bytes that you can then push out\n through the network.\n\nFor example, a client might instantiate and then send a\n``h11.Request`` object, then zero or more ``h11.Data`` objects for the\nrequest body (e.g., if this is a POST), and then a\n``h11.EndOfMessage`` to indicate the end of the message. Then the\nserver would then send back a ``h11.Response``, some ``h11.Data``, and\nits own ``h11.EndOfMessage``. If either side violates the protocol,\nyou'll get a ``h11.ProtocolError`` exception.\n\nh11 is suitable for implementing both servers and clients, and has a\npleasantly symmetric API: the events you send as a client are exactly\nthe ones that you receive as a server and vice-versa.\n\n`Here's an example of a tiny HTTP client\n`_\n\nIt also has `a fine manual `_.\n\nFAQ\n---\n\n*Whyyyyy?*\n\nI wanted to play with HTTP in `Curio\n`__ and `Trio\n`__, which at the time didn't have any\nHTTP libraries. So I thought, no big deal, Python has, like, a dozen\ndifferent implementations of HTTP, surely I can find one that's\nreusable. I didn't find one, but I did find Cory's call-to-arms\nblog-post. So I figured, well, fine, if I have to implement HTTP from\nscratch, at least I can make sure no-one *else* has to ever again.\n\n*Should I use it?*\n\nMaybe. You should be aware that it's a very young project. But, it's\nfeature complete and has an exhaustive test-suite and complete docs,\nso the next step is for people to try using it and see how it goes\n:-). If you do then please let us know -- if nothing else we'll want\nto talk to you before making any incompatible changes!\n\n*What are the features/limitations?*\n\nRoughly speaking, it's trying to be a robust, complete, and non-hacky\nimplementation of the first \"chapter\" of the HTTP/1.1 spec: `RFC 7230:\nHTTP/1.1 Message Syntax and Routing\n`_. That is, it mostly focuses on\nimplementing HTTP at the level of taking bytes on and off the wire,\nand the headers related to that, and tries to be anal about spec\nconformance. It doesn't know about higher-level concerns like URL\nrouting, conditional GETs, cross-origin cookie policies, or content\nnegotiation. But it does know how to take care of framing,\ncross-version differences in keep-alive handling, and the \"obsolete\nline folding\" rule, so you can focus your energies on the hard /\ninteresting parts for your application, and it tries to support the\nfull specification in the sense that any useful HTTP/1.1 conformant\napplication should be able to use h11.\n\nIt's pure Python, and has no dependencies outside of the standard\nlibrary.\n\nIt has a test suite with 100.0% coverage for both statements and\nbranches.\n\nCurrently it supports Python 3 (testing on 3.8-3.12) and PyPy 3.\nThe last Python 2-compatible version was h11 0.11.x.\n(Originally it had a Cython wrapper for `http-parser\n`_ and a beautiful nested state\nmachine implemented with ``yield from`` to postprocess the output. But\nI had to take these out -- the new *parser* needs fewer lines-of-code\nthan the old *parser wrapper*, is written in pure Python, uses no\nexotic language syntax, and has more features. It's sad, really; that\nold state machine was really slick. I just need a few sentences here\nto mourn that.)\n\nI don't know how fast it is. I haven't benchmarked or profiled it yet,\nso it's probably got a few pointless hot spots, and I've been trying\nto err on the side of simplicity and robustness instead of\nmicro-optimization. But at the architectural level I tried hard to\navoid fundamentally bad decisions, e.g., I believe that all the\nparsing algorithms remain linear-time even in the face of pathological\ninput like slowloris, and there are no byte-by-byte loops. (I also\nbelieve that it maintains bounded memory usage in the face of\narbitrary/pathological input.)\n\nThe whole library is ~800 lines-of-code. You can read and understand\nthe whole thing in less than an hour. Most of the energy invested in\nthis so far has been spent on trying to keep things simple by\nminimizing special-cases and ad hoc state manipulation; even though it\nis now quite small and simple, I'm still annoyed that I haven't\nfigured out how to make it even smaller and simpler. (Unfortunately,\nHTTP does not lend itself to simplicity.)\n\nThe API is ~feature complete and I don't expect the general outlines\nto change much, but you can't judge an API's ergonomics until you\nactually document and use it, so I'd expect some changes in the\ndetails.\n\n*How do I try it?*\n\n.. code-block:: sh\n\n $ pip install h11\n $ git clone git@github.com:python-hyper/h11\n $ cd h11/examples\n $ python basic-client.py\n\nand go from there.\n\n*License?*\n\nMIT\n\n*Code of conduct?*\n\nContributors are requested to follow our `code of conduct\n`_ in\nall project spaces.\n", - "home_page": "https://github.com/python-hyper/h11", - "author": "Nathaniel J. Smith", - "author_email": "njs@pobox.com", - "license": "MIT", - "license_file": [ - "LICENSE.txt" - ], - "classifier": [ - "Development Status :: 3 - Alpha", - "Intended Audience :: Developers", - "License :: OSI Approved :: MIT License", - "Programming Language :: Python :: Implementation :: CPython", - "Programming Language :: Python :: Implementation :: PyPy", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Topic :: Internet :: WWW/HTTP", - "Topic :: System :: Networking" - ], - "requires_python": ">=3.8" - } - }, - { - "download_info": { - "url": "https://files.pythonhosted.org/packages/7e/cd/fe58041e9011f307c490e3e17dd48cc516448f7c698a3f2d9d9d65d7e6a8/networkx-3.7-py3-none-any.whl", - "archive_info": { - "hashes": { - "sha256": "e3fd2c13a7814cee3746340d8d7f8598a67f16a58bf47fb7f8793fab6efca1b0" - }, - "hash": "sha256=e3fd2c13a7814cee3746340d8d7f8598a67f16a58bf47fb7f8793fab6efca1b0" - } - }, - "is_direct": false, - "is_yanked": false, - "requested": false, - "metadata": { - "metadata_version": "2.4", - "name": "networkx", - "version": "3.7", - "dynamic": [ - "license-file" - ], - "platform": [ - "Linux", - "Mac OSX", - "Windows", - "Unix" - ], - "summary": "Python package for creating and manipulating graphs and networks", - "description": "NetworkX\n========\n\n\n.. image::\n https://github.com/networkx/networkx/actions/workflows/test.yml/badge.svg?branch=main\n :target: https://github.com/networkx/networkx/actions/workflows/test.yml\n\n.. image::\n https://img.shields.io/pypi/v/networkx.svg?\n :target: https://pypi.python.org/pypi/networkx\n\n.. image::\n https://img.shields.io/pypi/l/networkx.svg?\n :target: https://github.com/networkx/networkx/blob/main/LICENSE.txt\n\n.. image::\n https://img.shields.io/pypi/pyversions/networkx.svg?\n :target: https://pypi.python.org/pypi/networkx\n\n.. image::\n https://insights.linuxfoundation.org/api/badge/health-score?project=networkx\n :target: https://insights.linuxfoundation.org/project/networkx\n\n\nNetworkX is a Python package for the creation, manipulation,\nand study of the structure, dynamics, and functions\nof complex networks.\n\n- **Website (including documentation):** https://networkx.org\n- **Mailing list:** https://groups.google.com/forum/#!forum/networkx-discuss\n- **Source:** https://github.com/networkx/networkx\n- **Bug reports:** https://github.com/networkx/networkx/issues\n- **Report a security vulnerability:** https://tidelift.com/security\n- **Tutorial:** https://networkx.org/documentation/latest/tutorial.html\n- **GitHub Discussions:** https://github.com/networkx/networkx/discussions\n- **Discord (Scientific Python) invite link:** https://discord.com/invite/vur45CbwMz\n- **NetworkX meetings calendar (open to all):** https://scientific-python.org/calendars/networkx.ics\n\nSimple example\n--------------\n\nFind the shortest path between two nodes in an undirected graph:\n\n.. code:: pycon\n\n >>> import networkx as nx\n >>> G = nx.Graph()\n >>> G.add_edge(\"A\", \"B\", weight=4)\n >>> G.add_edge(\"B\", \"D\", weight=2)\n >>> G.add_edge(\"A\", \"C\", weight=3)\n >>> G.add_edge(\"C\", \"D\", weight=4)\n >>> nx.shortest_path(G, \"A\", \"D\", weight=\"weight\")\n ['A', 'B', 'D']\n\nInstall\n-------\n\nInstall the latest released version of NetworkX:\n\n.. code:: shell\n\n $ pip install networkx\n\nInstall with all optional dependencies:\n\n.. code:: shell\n\n $ pip install networkx[default]\n\nFor additional details,\nplease see the `installation guide `_.\n\nBugs\n----\n\nPlease report any bugs that you find `here `_.\nOr, even better, fork the repository on `GitHub `_\nand create a pull request (PR). We welcome all changes, big or small, and we\nwill help you make the PR if you are new to `git` (just ask on the issue and/or\nsee the `contributor guide `_).\n\nLicense\n-------\n\nReleased under the `3-clause BSD license `_::\n\n Copyright (c) 2004-2026, NetworkX Developers\n Aric Hagberg \n Dan Schult \n Pieter Swart \n", - "description_content_type": "text/x-rst", - "keywords": [ - "Networks", - "Graph Theory", - "Mathematics", - "network", - "graph", - "discrete mathematics", - "math" - ], - "author_email": "Aric Hagberg ", - "maintainer_email": "NetworkX Developers ", - "license_expression": "BSD-3-Clause", - "license_file": [ - "LICENSE.txt" - ], - "classifier": [ - "Development Status :: 5 - Production/Stable", - "Intended Audience :: Developers", - "Intended Audience :: Science/Research", - "Operating System :: OS Independent", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - "Programming Language :: Python :: 3.14", - "Programming Language :: Python :: 3.15", - "Programming Language :: Python :: 3 :: Only", - "Topic :: Software Development :: Libraries :: Python Modules", - "Topic :: Scientific/Engineering :: Bio-Informatics", - "Topic :: Scientific/Engineering :: Information Analysis", - "Topic :: Scientific/Engineering :: Mathematics", - "Topic :: Scientific/Engineering :: Physics" - ], - "requires_dist": [ - "asv>=0.6.5; extra == \"benchmarking\"", - "py-rattler<0.22,>=0.21; extra == \"benchmarking\"", - "virtualenv; extra == \"benchmarking\"", - "numpy>=2.2; extra == \"default\"", - "scipy>=1.15; extra == \"default\"", - "matplotlib>=3.10; extra == \"default\"", - "pandas>=2.3; extra == \"default\"", - "pre-commit>=4.1; extra == \"developer\"", - "mypy>=1.15; extra == \"developer\"", - "sphinx>=8.0; extra == \"doc\"", - "pydata-sphinx-theme>=0.16; extra == \"doc\"", - "sphinx-gallery>=0.18; extra == \"doc\"", - "numpydoc>=1.8.0; extra == \"doc\"", - "pillow>=10; extra == \"doc\"", - "texext>=0.6.7; extra == \"doc\"", - "myst-nb>=1.1; extra == \"doc\"", - "intersphinx-registry; extra == \"doc\"", - "osmnx>=2.0.0; extra == \"example\"", - "momepy>=0.7.2; extra == \"example\"", - "contextily>=1.6; extra == \"example\"", - "seaborn>=0.13; extra == \"example\"", - "cairocffi>=1.7; extra == \"example\"", - "igraph>=0.11; extra == \"example\"", - "scikit-learn>=1.6; extra == \"example\"", - "iplotx>=0.9.0; extra == \"example\"", - "hiveplotlib>=0.28; extra == \"example\"", - "lxml>=4.6; extra == \"extra\"", - "pygraphviz>=2.0; extra == \"extra\"", - "pydot>=3.0.1; extra == \"extra\"", - "sympy>=1.10; extra == \"extra\"", - "build>=0.10; extra == \"release\"", - "twine>=4.0; extra == \"release\"", - "wheel>=0.40; extra == \"release\"", - "changelist==0.5; extra == \"release\"", - "pytest>=7.2; extra == \"test\"", - "pytest-cov>=4.0; extra == \"test\"", - "pytest-xdist>=3.0; extra == \"test\"", - "pytest-mpl; extra == \"test-extras\"", - "pytest-randomly; extra == \"test-extras\"" - ], - "requires_python": "!=3.14.1,>=3.12", - "project_url": [ - "Homepage, https://networkx.org/", - "Bug Tracker, https://github.com/networkx/networkx/issues", - "Documentation, https://networkx.org/documentation/stable/", - "Source Code, https://github.com/networkx/networkx" - ], - "provides_extra": [ - "benchmarking", - "default", - "developer", - "doc", - "example", - "extra", - "release", - "test", - "test-extras" - ] - } - }, - { - "download_info": { - "url": "https://files.pythonhosted.org/packages/eb/47/c95ffc2009878c7aac0c5e08528022dcb885933252a88b5f170058014464/pydantic-2.13.5-py3-none-any.whl", - "archive_info": { - "hashes": { - "sha256": "346a034f080da3755d8e9cb5e00e8b07de1d39e4f6e2c87d8ab7cafa0b269a73" - }, - "hash": "sha256=346a034f080da3755d8e9cb5e00e8b07de1d39e4f6e2c87d8ab7cafa0b269a73" - } - }, - "is_direct": false, - "is_yanked": false, - "requested": false, - "metadata": { - "metadata_version": "2.5", - "name": "pydantic", - "version": "2.13.5", - "summary": "Data validation using Python type hints", - "description": "# Pydantic Validation\n\n[![CI](https://img.shields.io/github/actions/workflow/status/pydantic/pydantic/ci.yml?branch=main&logo=github&label=CI)](https://github.com/pydantic/pydantic/actions?query=event%3Apush+branch%3Amain+workflow%3ACI)\n[![Coverage](https://coverage-badge.samuelcolvin.workers.dev/pydantic/pydantic.svg)](https://coverage-badge.samuelcolvin.workers.dev/redirect/pydantic/pydantic)\n[![pypi](https://img.shields.io/pypi/v/pydantic.svg)](https://pypi.python.org/pypi/pydantic)\n[![CondaForge](https://img.shields.io/conda/v/conda-forge/pydantic.svg)](https://anaconda.org/conda-forge/pydantic)\n[![downloads](https://static.pepy.tech/badge/pydantic/month)](https://pepy.tech/project/pydantic)\n[![versions](https://img.shields.io/pypi/pyversions/pydantic.svg)](https://github.com/pydantic/pydantic)\n[![license](https://img.shields.io/github/license/pydantic/pydantic.svg)](https://github.com/pydantic/pydantic/blob/main/LICENSE)\n[![Pydantic v2](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/pydantic/pydantic/main/docs/badge/v2.json)](https://docs.pydantic.dev/latest/contributing/#badges)\n[![llms.txt](https://img.shields.io/badge/llms.txt-green)](https://docs.pydantic.dev/latest/llms.txt)\n\nData validation using Python type hints.\n\nFast and extensible, Pydantic plays nicely with your linters/IDE/brain.\nDefine how data should be in pure, canonical Python 3.9+; validate it with Pydantic.\n\n## Pydantic Logfire :fire:\n\nWe've launched Pydantic Logfire to help you monitor your applications.\n[Learn more](https://pydantic.dev/logfire/?utm_source=pydantic_validation)\n\n## Pydantic V1.10 vs. V2\n\nPydantic V2 is a ground-up rewrite that offers many new features, performance improvements, and some breaking changes compared to Pydantic V1.\n\nIf you're using Pydantic V1 you may want to look at the\n[pydantic V1.10 Documentation](https://docs.pydantic.dev/) or,\n[`1.10.X-fixes` git branch](https://github.com/pydantic/pydantic/tree/1.10.X-fixes). Pydantic V2 also ships with the latest version of Pydantic V1 built in so that you can incrementally upgrade your code base and projects: `from pydantic import v1 as pydantic_v1`.\n\n## Help\n\nSee [documentation](https://docs.pydantic.dev/) for more details.\n\n## Installation\n\nInstall using `pip install -U pydantic` or `conda install pydantic -c conda-forge`.\nFor more installation options to make Pydantic even faster,\nsee the [Install](https://docs.pydantic.dev/install/) section in the documentation.\n\n## A Simple Example\n\n```python\nfrom datetime import datetime\nfrom typing import Optional\nfrom pydantic import BaseModel\n\nclass User(BaseModel):\n id: int\n name: str = 'John Doe'\n signup_ts: Optional[datetime] = None\n friends: list[int] = []\n\nexternal_data = {'id': '123', 'signup_ts': '2017-06-01 12:22', 'friends': [1, '2', b'3']}\nuser = User(**external_data)\nprint(user)\n#> User id=123 name='John Doe' signup_ts=datetime.datetime(2017, 6, 1, 12, 22) friends=[1, 2, 3]\nprint(user.id)\n#> 123\n```\n\n## Contributing\n\nFor guidance on setting up a development environment and how to make a\ncontribution to Pydantic, see\n[Contributing to Pydantic](https://docs.pydantic.dev/contributing/).\n\n## Reporting a Security Vulnerability\n\nSee our [security policy](https://github.com/pydantic/pydantic/security/policy).\n\n## Changelog\n\n\n\n\n\n## v2.13.5 (2026-08-28)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.13.5)\n\n### What's Changed\n\n#### Fixes\n\n* Allow reuse of validators when plugins are set by [@Viicos](https://github.com/Viicos) in [#13535](https://github.com/pydantic/pydantic/pull/13535)\n* Fix missing GC traversal on some `pydantic-core` struct fields by [@Viicos](https://github.com/Viicos) in [#13624](https://github.com/pydantic/pydantic/pull/13624)\n* Fix missing GC traversal in `pydantic-core` for `GeneralFieldsSerializer` by [@Viicos](https://github.com/Viicos) in [#13629](https://github.com/pydantic/pydantic/pull/13629)\n* Count validated model fields once in smart unions by [@tamird](https://github.com/tamird) in [#13731](https://github.com/pydantic/pydantic/pull/13731)\n\n## v2.13.4 (2026-05-06)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.13.4)\n\n### What's Changed\n\n#### Packaging\n\n* Bump libc from 0.2.155 to 0.2.185 by [@Viicos](https://github.com/Viicos) in [#13109](https://github.com/pydantic/pydantic/pull/13109)\n* Adapt `pydantic-core` linker flags on macOS by [@washingtoneg](https://github.com/washingtoneg) and [@Viicos](https://github.com/Viicos) in [#13147](https://github.com/pydantic/pydantic/pull/13147)\n\n#### Fixes\n\n* Preserve `RootModel` core metadata by [@Viicos](https://github.com/Viicos) in [#13129](https://github.com/pydantic/pydantic/pull/13129)\n\n## v2.13.3 (2026-04-20)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.13.3)\n\n### What's Changed\n\n#### Fixes\n\n* Handle `AttributeError` subclasses with `from_attributes` by [@Viicos](https://github.com/Viicos) in [#13096](https://github.com/pydantic/pydantic/pull/13096)\n\n## v2.13.2 (2026-04-17)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.13.2)\n\n### What's Changed\n\n#### Fixes\n\n* Fix `ValidationInfo.field_name` missing with `model_validate_json()` by [@Viicos](https://github.com/Viicos) in [#13084](https://github.com/pydantic/pydantic/pull/13084)\n\n## v2.13.1 (2026-04-15)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.13.1)\n\n### What's Changed\n\n#### Fixes\n\n* Fix `ValidationInfo.data` missing with `model_validate_json()` by [@davidhewitt](https://github.com/davidhewitt) in [#13079](https://github.com/pydantic/pydantic/pull/13079)\n\n## v2.13.0 (2026-04-13)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.13.0)\n\nThe highlights of the v2.13 release are available in the [blog post](https://pydantic.dev/articles/pydantic-v2-13-release).\nSeveral minor changes (considered non-breaking changes according to our [versioning policy](https://pydantic.dev/docs/validation/2.13/get-started/version-policy/#pydantic-v2))\nare also included in this release. Make sure to look into them before upgrading.\n\nThis release contains the updated `pydantic.v1` namespace, matching version 1.10.26 which includes support for Python 3.14.\n\n### What's Changed\n\nSee the beta releases for all changes sinces 2.12.\n\n#### New Features\n\n* Allow default factories of private attributes to take validated model data by [@Viicos](https://github.com/Viicos) in [#13013](https://github.com/pydantic/pydantic/pull/13013)\n\n#### Changes\n\n* Warn when serializing fixed length tuples with too few items by [@arvindsaripalli](https://github.com/arvindsaripalli) in [#13016](https://github.com/pydantic/pydantic/pull/13016)\n\n#### Fixes\n\n* Change type of `Any` when synthesizing `_build_sources` for `BaseSettings.__init__()` signature in the mypy plugin by [@Viicos](https://github.com/Viicos) in [#13049](https://github.com/pydantic/pydantic/pull/13049)\n* Fix model equality when using runtime `extra` configuration by [@Viicos](https://github.com/Viicos) in [#13062](https://github.com/pydantic/pydantic/pull/13062)\n\n#### Packaging\n\n* Add zizmor for GitHub Actions workflow linting by [@Viicos](https://github.com/Viicos) in [#13039](https://github.com/pydantic/pydantic/pull/13039)\n* Update jiter to v0.14.0 to fix a segmentation fault on musl Linux by [@Viicos](https://github.com/Viicos) in [#13064](https://github.com/pydantic/pydantic/pull/13064)\n\n### New Contributors\n\n* [@arvindsaripalli](https://github.com/arvindsaripalli) made their first contribution in [#13016](https://github.com/pydantic/pydantic/pull/13016)\n\n## v2.13.0b3 (2026-03-31)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.13.0b3)\n\n### What's Changed\n\n#### New Features\n\n* Add `ascii_only` option to `StringConstraints` by [@ai-man-codes](https://github.com/ai-man-codes) in [#12907](https://github.com/pydantic/pydantic/pull/12907)\n* Support `exclude_if` in computed fields by [@andresliszt](https://github.com/andresliszt) in [#12748](https://github.com/pydantic/pydantic/pull/12748)\n* Push down constraints in unions involving `MISSING` sentinel by [@Viicos](https://github.com/Viicos) in [#12908](https://github.com/pydantic/pydantic/pull/12908)\n\n#### Changes\n\n* Track extra fields set after init in `model_fields_set` by [@navalprakhar](https://github.com/navalprakhar) in [#12817](https://github.com/pydantic/pydantic/pull/12817)\n* Do not include annotations that are not part of named tuple fields by [@galuszkak](https://github.com/galuszkak) in [#12951](https://github.com/pydantic/pydantic/pull/12951)\n* No longer fall back to trying all union members when the variant selected by discriminator fails to serialize by [@navalprakhar](https://github.com/navalprakhar) in [#12825](https://github.com/pydantic/pydantic/pull/12825)\n\n#### Fixes\n\n* Support discriminator metadata outside union type alias by [@Viicos](https://github.com/Viicos) in [#12785](https://github.com/pydantic/pydantic/pull/12785)\n* Respect `extras_schema` when only `extra_fields_behavior` is set on the config in JSON Schema generation for typed dictionaries by [@Viicos](https://github.com/Viicos) in [#12810](https://github.com/pydantic/pydantic/pull/12810)\n* Ensure `__pydantic_private__` is set in `model_construct()` with user-defined `model_post_init()` by [@nightcityblade](https://github.com/nightcityblade) in [#12816](https://github.com/pydantic/pydantic/pull/12816)\n* Handle all schema generation errors in `InstanceOf` by [@Viicos](https://github.com/Viicos) in [#12705](https://github.com/pydantic/pydantic/pull/12705)\n* Allow dynamic models created with `create_model()` to be used as annotations in the Mypy plugin by [@Br1an67](https://github.com/Br1an67) in [#12879](https://github.com/pydantic/pydantic/pull/12879)\n* Check for `PlaceholderNode` in Mypy plugin by [@Viicos](https://github.com/Viicos) in [#12929](https://github.com/pydantic/pydantic/pull/12929)\n* Try other branches in smart union in case of omit errors by [@mikeedjones](https://github.com/mikeedjones) in [#12758](https://github.com/pydantic/pydantic/pull/12758)\n* Patch unset attributes with `MISSING` during model serialization with `exclude_unset` by [@davidhewitt](https://github.com/davidhewitt) in [#12905](https://github.com/pydantic/pydantic/pull/12905)\n* Ensure custom `__init__()` is called when using `model_validate_strings()` by [@siewcapital](https://github.com/siewcapital) in [#12897](https://github.com/pydantic/pydantic/pull/12897)\n\n#### Packaging\n\n* Add riscv64 build target for manylinux by [@boosterl](https://github.com/boosterl) in [#12723](https://github.com/pydantic/pydantic/pull/12723)\n\n### New Contributors\n\n* [@kelsonbrito50](https://github.com/kelsonbrito50) made their first contribution in [#12860](https://github.com/pydantic/pydantic/pull/12860)\n* [@boosterl](https://github.com/boosterl) made their first contribution in [#12723](https://github.com/pydantic/pydantic/pull/12723)\n* [@adityagiri3600](https://github.com/adityagiri3600) made their first contribution in [#12868](https://github.com/pydantic/pydantic/pull/12868)\n* [@navalprakhar](https://github.com/navalprakhar) made their first contribution in [#12817](https://github.com/pydantic/pydantic/pull/12817)\n* [@Br1an67](https://github.com/Br1an67) made their first contribution in [#12879](https://github.com/pydantic/pydantic/pull/12879)\n* [@rmorshea](https://github.com/rmorshea) made their first contribution in [#12910](https://github.com/pydantic/pydantic/pull/12910)\n* [@N3XT3R1337](https://github.com/N3XT3R1337) made their first contribution in [#12922](https://github.com/pydantic/pydantic/pull/12922)\n* [@ai-man-codes](https://github.com/ai-man-codes) made their first contribution in [#12907](https://github.com/pydantic/pydantic/pull/12907)\n* [@Yume05-dev](https://github.com/Yume05-dev) made their first contribution in [#12953](https://github.com/pydantic/pydantic/pull/12953)\n* [@galuszkak](https://github.com/galuszkak) made their first contribution in [#12951](https://github.com/pydantic/pydantic/pull/12951)\n* [@siewcapital](https://github.com/siewcapital) made their first contribution in [#12897](https://github.com/pydantic/pydantic/pull/12897)\n\n## v2.13.0b2 (2026-02-24)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.13.0b2)\n\n### What's Changed\n\n#### Fixes\n\n* Fix backported V1 namespace by [@Viicos](https://github.com/Viicos) in [#12855](https://github.com/pydantic/pydantic/pull/12855)\n* Allow any type form to be used in `validate_as()` by [@bledden](https://github.com/bledden) in [#12846](https://github.com/pydantic/pydantic/pull/12846)\n* Fix walrus operator precedence in `UrlConstraints.__get_pydantic_core_schema__()` by [@bysiber](https://github.com/bysiber) in [#12826](https://github.com/pydantic/pydantic/pull/12826)\n\n### New Contributors\n\n* [@bledden](https://github.com/bledden) made their first contribution in [#12846](https://github.com/pydantic/pydantic/pull/12846)\n* [@bysiber](https://github.com/bysiber) made their first contribution in [#12827](https://github.com/pydantic/pydantic/pull/12827)\n\n## v2.13.0b1 (2026-02-23)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.13.0b1)\n\nThis is the first beta release of the 2.13 version, mainly providing bug fixes and performance improvements\nfor validation and serialization.\n\nNotable changes include:\n\n* Add a new `polymorphic_serialization` option, solving issues with `serialize_as_any` introduced in 2.12.\n* Latest V1.10.26 release under the `pydantic.v1` namespace. This version includes support for Python 3.14.\n* The [`pydantic-core`](https://github.com/pydantic/pydantic-core/) repository was merged inside the main `pydantic` one.\n\n### What's Changed\n\n#### New Features\n\n* Add `polymorphic_serialization` option by [@davidhewitt](https://github.com/davidhewitt) in [#12518](https://github.com/pydantic/pydantic/pull/12518)\n* Support Root models with `Literal` root types as discriminator field types by [@YassinNouh21](https://github.com/YassinNouh21) in [#12680](https://github.com/pydantic/pydantic/pull/12680)\n\n#### Changes\n\n* Migrate `pydantic-core` CI by [@Viicos](https://github.com/Viicos) in [#12752](https://github.com/pydantic/pydantic/pull/12752)\n* Import `pydantic-core` into pydantic by [@davidhewitt](https://github.com/davidhewitt) in [#12481](https://github.com/pydantic/pydantic/pull/12481)\n* Backport V1 changes up to v1.10.26 by [@Viicos](https://github.com/Viicos) in [#12663](https://github.com/pydantic/pydantic/pull/12663)\n* Use the `complex()` constructor unconditionally when validating `complex` Python data by [@tanmaymunjal](https://github.com/tanmaymunjal) in [#12498](https://github.com/pydantic/pydantic/pull/12498)\n* Add support for three-tuple input for `Decimal` by [@tanmaymunjal](https://github.com/tanmaymunjal) in [#12500](https://github.com/pydantic/pydantic/pull/12500)\n* Align `@field_serializer` logic with `@field_validator` by [@Viicos](https://github.com/Viicos) in [#12577](https://github.com/pydantic/pydantic/pull/12577)\n* Make `PydanticUserError` a `RuntimeError` instead of a `TypeError` by [@poliakovva](https://github.com/poliakovva) in [#12579](https://github.com/pydantic/pydantic/pull/12579)\n* Remove redundant serialization attempts in nested unions by [@davidhewitt](https://github.com/davidhewitt) in [#12604](https://github.com/pydantic/pydantic/pull/12604)\n* Copy `root` value when making root model shallow copies by [@YassinNouh21](https://github.com/YassinNouh21) in [#12679](https://github.com/pydantic/pydantic/pull/12679)\n* Ensure deterministic JSON schema defaults by sorting sets by [@drshvik](https://github.com/drshvik) in [#12760](https://github.com/pydantic/pydantic/pull/12760)\n\n#### Performance\n\n* Refactor `DecoratorInfos.build()` implementation by [@Viicos](https://github.com/Viicos) in [#12536](https://github.com/pydantic/pydantic/pull/12536)\n* Cache compiled regex in `pydantic-core` by [@Viicos](https://github.com/Viicos) in [#12549](https://github.com/pydantic/pydantic/pull/12549)\n* Optimize creation of `Literal` validators by [@davidhewitt](https://github.com/davidhewitt) in [#12569](https://github.com/pydantic/pydantic/pull/12569)\n* Optimize implementation of `LookupKey` by [@davidhewitt](https://github.com/davidhewitt) in [#12571](https://github.com/pydantic/pydantic/pull/12571)\n* Use python strings for field names by [@davidhewitt](https://github.com/davidhewitt) in [#12631](https://github.com/pydantic/pydantic/pull/12631)\n* Optimize datetime formatting code by [@davidhewitt](https://github.com/davidhewitt) in [#12626](https://github.com/pydantic/pydantic/pull/12626)\n* Validate JSON model data by iteration by [@davidhewitt](https://github.com/davidhewitt) in [#12550](https://github.com/pydantic/pydantic/pull/12550)\n* Optimize annotations evaluation of Pydantic models by [@Viicos](https://github.com/Viicos) in [#12681](https://github.com/pydantic/pydantic/pull/12681)\n* Optimize `FieldInfo._copy()` by [@Viicos](https://github.com/Viicos) in [#12727](https://github.com/pydantic/pydantic/pull/12727)\n\n#### Fixes\n\n* Fix `FieldInfo` rebuilding when parameterizing generic models with an `Annotated` type by [@Viicos](https://github.com/Viicos) in [#12463](https://github.com/pydantic/pydantic/pull/12463)\n* Fix nested model schema deduplication in JSON schema generation by [@marwan-alloreview](https://github.com/marwan-alloreview) in [#12494](https://github.com/pydantic/pydantic/pull/12494)\n* Fix `InitVar` being ignored when using with the `pydantic.Field()` function by [@Viicos](https://github.com/Viicos) in [#12495](https://github.com/pydantic/pydantic/pull/12495)\n* Fix support for enums with `NamedTuple` as values by [@Viicos](https://github.com/Viicos) in [#12506](https://github.com/pydantic/pydantic/pull/12506)\n* Do not delete mock validator/serializer in `rebuild_dataclass()` by [@Viicos](https://github.com/Viicos) in [#12513](https://github.com/pydantic/pydantic/pull/12513)\n* Require test suite to pass with free threading, switch back to global generic types cache by [@davidhewitt](https://github.com/davidhewitt) in [#12537](https://github.com/pydantic/pydantic/pull/12537)\n* Refactor `__pydantic_extra__` annotation handling by [@Viicos](https://github.com/Viicos) in [#12563](https://github.com/pydantic/pydantic/pull/12563)\n* Do not add claim of UUID \"safety\" provision by [@davidhewitt](https://github.com/davidhewitt) in [#12567](https://github.com/pydantic/pydantic/pull/12567)\n* Use Python hash to perform lookup in tagged union serializer by [@davidhewitt](https://github.com/davidhewitt) in [#12594](https://github.com/pydantic/pydantic/pull/12594)\n* Do not emit serialization warning `MISSING` sentinel is present in a nested model by [@Viicos](https://github.com/Viicos) in [#12635](https://github.com/pydantic/pydantic/pull/12635)\n* Do not eagerly evaluate annotations in signature logic by [@Viicos](https://github.com/Viicos) in [#12660](https://github.com/pydantic/pydantic/pull/12660)\n* Fix serialization of typed dict unions when `exclude_none` is set by [@davidhewitt](https://github.com/davidhewitt) in [#12677](https://github.com/pydantic/pydantic/pull/12677)\n* Do not reuse prebuilt serializers/validators on rebuilds by [@lmmx](https://github.com/lmmx) in [#12689](https://github.com/pydantic/pydantic/pull/12689)\n* Fix type annotation of `field_definitions` in `create_model()` by [@lehmann-hqs](https://github.com/lehmann-hqs) in [#12734](https://github.com/pydantic/pydantic/pull/12734)\n* Fix incorrect dataclass constructor signature when overriding class `kw_only` with `Field()` by [@jfadia](https://github.com/jfadia) in [#12741](https://github.com/pydantic/pydantic/pull/12741)\n* Use `typing.Union` when replacing types under Python 3.14 by [@Viicos](https://github.com/Viicos) in [#12733](https://github.com/pydantic/pydantic/pull/12733)\n* Improve ImportString error when internal imports fail by [@tsembp](https://github.com/tsembp) in [#12740](https://github.com/pydantic/pydantic/pull/12740)\n* Fix serializing complex numbers with negative zero imaginary part by [@lhnwrk](https://github.com/lhnwrk) in [#12770](https://github.com/pydantic/pydantic/pull/12770)\n* Preserve custom docstrings on stdlib dataclasses in JSON schema by [@nightcityblade](https://github.com/nightcityblade) in [#12815](https://github.com/pydantic/pydantic/pull/12815)\n\n#### Packaging\n\n* Bump Rust url dependency from 2.5.4 to 2.5.7 in `pydantic-core` by [@dependabot](https://github.com/dependabot)[bot] in [#12508](https://github.com/pydantic/pydantic/pull/12508)\n* Bump Rust minimum version to 1.88, use edition 2024 by [@davidhewitt](https://github.com/davidhewitt) and [@Viicos](https://github.com/Viicos) in [#12551](https://github.com/pydantic/pydantic/pull/12551) and [#12752](https://github.com/pydantic/pydantic/pull/12752)\n* Bump PyO3 to 0.28, jiter to 0.13 by [@davidhewitt](https://github.com/davidhewitt) in [#12767](https://github.com/pydantic/pydantic/pull/12767)\n\n### New Contributors\n\n* [@marwan-alloreview](https://github.com/marwan-alloreview) made their first contribution in [#12494](https://github.com/pydantic/pydantic/pull/12494)\n* [@tanmaymunjal](https://github.com/tanmaymunjal) made their first contribution in [#12498](https://github.com/pydantic/pydantic/pull/12498)\n* [@poliakovva](https://github.com/poliakovva) made their first contribution in [#12579](https://github.com/pydantic/pydantic/pull/12579)\n* [@lehmann-hqs](https://github.com/lehmann-hqs) made their first contribution in [#12734](https://github.com/pydantic/pydantic/pull/12734)\n* [@jfadia](https://github.com/jfadia) made their first contribution in [#12741](https://github.com/pydantic/pydantic/pull/12741)\n* [@tsembp](https://github.com/tsembp) made their first contribution in [#12740](https://github.com/pydantic/pydantic/pull/12740)\n* [@drshvik](https://github.com/drshvik) made their first contribution in [#12760](https://github.com/pydantic/pydantic/pull/12760)\n* [@lhnwrk](https://github.com/lhnwrk) made their first contribution in [#12770](https://github.com/pydantic/pydantic/pull/12770)\n* [@nightcityblade](https://github.com/nightcityblade) made their first contribution in [#12815](https://github.com/pydantic/pydantic/pull/12811)\n\n## v2.12.5 (2025-11-26)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.12.5)\n\nThis is the fifth 2.12 patch release, addressing an issue with the `MISSING` sentinel and providing several documentation improvements.\n\nThe next 2.13 minor release will be published in a couple weeks, and will include a new *polymorphic serialization* feature addressing\nthe remaining unexpected changes to the *serialize as any* behavior.\n\n* Fix pickle error when using `model_construct()` on a model with `MISSING` as a default value by [@ornariece](https://github.com/ornariece) in [#12522](https://github.com/pydantic/pydantic/pull/12522).\n* Several updates to the documentation by [@Viicos](https://github.com/Viicos).\n\n## v2.12.4 (2025-11-05)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.12.4)\n\nThis is the fourth 2.12 patch release, fixing more regressions, and reverting a change in the `build()` method\nof the [`AnyUrl` and Dsn types](https://docs.pydantic.dev/latest/api/networks/).\n\nThis patch release also fixes an issue with the serialization of IP address types, when `serialize_as_any` is used. The next patch release\nwill try to address the remaining issues with *serialize as any* behavior by introducing a new *polymorphic serialization* feature, that\nshould be used in most cases in place of *serialize as any*.\n\n* Fix issue with forward references in parent `TypedDict` classes by [@Viicos](https://github.com/Viicos) in [#12427](https://github.com/pydantic/pydantic/pull/12427).\n\n This issue is only relevant on Python 3.14 and greater.\n\n* Exclude fields with `exclude_if` from JSON Schema required fields by [@Viicos](https://github.com/Viicos) in [#12430](https://github.com/pydantic/pydantic/pull/12430)\n* Revert URL percent-encoding of credentials in the `build()` method\n of the [`AnyUrl` and Dsn types](https://docs.pydantic.dev/latest/api/networks/) by [@davidhewitt](https://github.com/davidhewitt) in\n [pydantic-core#1833](https://github.com/pydantic/pydantic-core/pull/1833).\n\n This was initially considered as a bugfix, but caused regressions and as such was fully reverted. The next release will include\n an opt-in option to percent-encode components of the URL.\n\n* Add type inference for IP address types by [@davidhewitt](https://github.com/davidhewitt) in [pydantic-core#1868](https://github.com/pydantic/pydantic-core/pull/1868).\n\n The 2.12 changes to the `serialize_as_any` behavior made it so that IP address types could not properly serialize to JSON.\n\n* Avoid getting default values from defaultdict by [@davidhewitt](https://github.com/davidhewitt) in [pydantic-core#1853](https://github.com/pydantic/pydantic-core/pull/1853).\n\n This fixes a subtle regression in the validation behavior of the [`collections.defaultdict`](https://docs.python.org/3/library/collections.html#collections.defaultdict)\n type.\n\n* Fix issue with field serializers on nested typed dictionaries by [@davidhewitt](https://github.com/davidhewitt) in [pydantic-core#1879](https://github.com/pydantic/pydantic-core/pull/1879).\n* Add more `pydantic-core` builds for the three-threaded version of Python 3.14 by [@davidhewitt](https://github.com/davidhewitt) in [pydantic-core#1864](https://github.com/pydantic/pydantic-core/pull/1864).\n\n## v2.12.3 (2025-10-17)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.12.3)\n\n### What's Changed\n\nThis is the third 2.12 patch release, fixing issues related to the `FieldInfo` class, and reverting a change to the supported\n[*after* model validator](https://docs.pydantic.dev/latest/concepts/validators/#model-validators) function signatures.\n\n* Raise a warning when an invalid after model validator function signature is raised by [@Viicos](https://github.com/Viicos) in [#12414](https://github.com/pydantic/pydantic/pull/12414).\n Starting in 2.12.0, using class methods for *after* model validators raised an error, but the error wasn't raised concistently. We decided\n to emit a deprecation warning instead.\n* Add [`FieldInfo.asdict()`](https://docs.pydantic.dev/latest/api/fields/#pydantic.fields.FieldInfo.asdict) method, improve documentation around `FieldInfo` by [@Viicos](https://github.com/Viicos) in [#12411](https://github.com/pydantic/pydantic/pull/12411).\n This also add back support for mutations on `FieldInfo` classes, that are reused as `Annotated` metadata. **However**, note that this is still\n *not* a supported pattern. Instead, please refer to the [added example](https://docs.pydantic.dev/latest/examples/dynamic_models/) in the documentation.\n\nThe [blog post](https://pydantic.dev/articles/pydantic-v2-12-release#changes) section on changes was also updated to document the changes related to `serialize_as_any`.\n\n## v2.12.2 (2025-10-14)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.12.2)\n\n### What's Changed\n\n#### Fixes\n\n* Release a new `pydantic-core` version, as a corrupted CPython 3.10 `manylinux2014_aarch64` wheel got uploaded ([pydantic-core#1843](https://github.com/pydantic/pydantic-core/pull/1843)).\n* Fix issue with recursive generic models with a parent model class by [@Viicos](https://github.com/Viicos) in [#12398](https://github.com/pydantic/pydantic/pull/12398)\n\n## v2.12.1 (2025-10-13)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.12.1)\n\n### What's Changed\n\nThis is the first 2.12 patch release, addressing most (but not all yet) regressions from the initial 2.12.0 release.\n\n#### Fixes\n\n* Do not evaluate annotations when inspecting validators and serializers by [@Viicos](https://github.com/Viicos) in [#12355](https://github.com/pydantic/pydantic/pull/12355)\n* Make sure `None` is converted as `NoneType` in Python 3.14 by [@Viicos](https://github.com/Viicos) in [#12370](https://github.com/pydantic/pydantic/pull/12370)\n* Backport V1 runtime warning when using Python 3.14 by [@Viicos](https://github.com/Viicos) in [#12367](https://github.com/pydantic/pydantic/pull/12367)\n* Fix error message for invalid validator signatures by [@Viicos](https://github.com/Viicos) in [#12366](https://github.com/pydantic/pydantic/pull/12366)\n* Populate field name in `ValidationInfo` for validation of default value by [@Viicos](https://github.com/Viicos) in [pydantic-core#1826](https://github.com/pydantic/pydantic-core/pull/1826)\n* Encode credentials in `MultiHostUrl` builder by [@willswire](https://github.com/willswire) in [pydantic-core#1829](https://github.com/pydantic/pydantic-core/pull/1829)\n* Respect field serializers when using `serialize_as_any` serialization flag by [@davidhewitt](https://github.com/davidhewitt) in [pydantic-core#1829](https://github.com/pydantic/pydantic-core/pull/1829)\n* Fix various `RootModel` serialization issues by [@davidhewitt](https://github.com/davidhewitt) in [pydantic-core#1836](https://github.com/pydantic/pydantic-core/pull/1836)\n\n### New Contributors\n\n* [@willswire](https://github.com/willswire) made their first contribution in [pydantic-core#1829](https://github.com/pydantic/pydantic-core/pull/1829)\n\n## v2.12.0 (2025-10-07)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.12.0)\n\nThis is the final 2.12 release. It features the work of 20 external contributors and provides useful new features, along with initial Python 3.14 support.\nSeveral minor changes (considered non-breaking changes according to our [versioning policy](https://docs.pydantic.dev/2.12/version-policy/#pydantic-v2))\nare also included in this release. Make sure to look into them before upgrading.\n\n**Note that Pydantic V1 is not compatible with Python 3.14 and greater**.\n\n### What's Changed\n\nSee the beta releases for all changes sinces 2.11.\n\n#### New Features\n\n* Add `extra` parameter to the validate functions by [@anvilpete](https://github.com/anvilpete) in [#12233](https://github.com/pydantic/pydantic/pull/12233)\n* Add `exclude_computed_fields` serialization option by [@Viicos](https://github.com/Viicos) in [#12334](https://github.com/pydantic/pydantic/pull/12334)\n* Add `preverse_empty_path` URL options by [@Viicos](https://github.com/Viicos) in [#12336](https://github.com/pydantic/pydantic/pull/12336)\n* Add `union_format` parameter to JSON Schema generation by [@Viicos](https://github.com/Viicos) in [#12147](https://github.com/pydantic/pydantic/pull/12147)\n* Add `__qualname__` parameter for `create_model` by [@Atry](https://github.com/Atry) in [#12001](https://github.com/pydantic/pydantic/pull/12001)\n\n#### Fixes\n\n* Do not try to infer name from lambda definitions in pipelines API by [@Viicos](https://github.com/Viicos) in [#12289](https://github.com/pydantic/pydantic/pull/12289)\n* Use proper namespace for functions in `TypeAdapter` by [@Viicos](https://github.com/Viicos) in [#12324](https://github.com/pydantic/pydantic/pull/12324)\n* Use `Any` for context type annotation in `TypeAdapter` by [@inducer](https://github.com/inducer) in [#12279](https://github.com/pydantic/pydantic/pull/12279)\n* Expose `FieldInfo` in `pydantic.fields.__all__` by [@Viicos](https://github.com/Viicos) in [#12339](https://github.com/pydantic/pydantic/pull/12339)\n* Respect `validation_alias` in `@validate_call` by [@Viicos](https://github.com/Viicos) in [#12340](https://github.com/pydantic/pydantic/pull/12340)\n* Use `Any` as context annotation in plugin API by [@Viicos](https://github.com/Viicos) in [#12341](https://github.com/pydantic/pydantic/pull/12341)\n* Use proper `stacklevel` in warnings when possible by [@Viicos](https://github.com/Viicos) in [#12342](https://github.com/pydantic/pydantic/pull/12342)\n\n#### Packaging\n\n* Update V1 copy to v1.10.24 by [@Viicos](https://github.com/Viicos) in [#12338](https://github.com/pydantic/pydantic/pull/12338)\n\n### New Contributors\n\n* [@anvilpete](https://github.com/anvilpete) made their first contribution in [#12233](https://github.com/pydantic/pydantic/pull/12233)\n* [@JonathanWindell](https://github.com/JonathanWindell) made their first contribution in [#12327](https://github.com/pydantic/pydantic/pull/12327)\n* [@inducer](https://github.com/inducer) made their first contribution in [#12279](https://github.com/pydantic/pydantic/pull/12279)\n* [@Atry](https://github.com/Atry) made their first contribution in [#12001](https://github.com/pydantic/pydantic/pull/12001)\n\n## v2.12.0b1 (2025-10-03)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.12.0b1)\n\nThis is the first beta release of the upcoming 2.12 release.\n\n### What's Changed\n\n#### New Features\n\n* Add support for `exclude_if` at the field level by [@andresliszt](https://github.com/andresliszt) in [#12141](https://github.com/pydantic/pydantic/pull/12141)\n* Add `ValidateAs` annotation helper by [@Viicos](https://github.com/Viicos) in [#11942](https://github.com/pydantic/pydantic/pull/11942)\n* Add configuration options for validation and JSON serialization of temporal types by [@ollz272](https://github.com/ollz272) in [#12068](https://github.com/pydantic/pydantic/pull/12068)\n* Add support for PEP 728 by [@Viicos](https://github.com/Viicos) in [#12179](https://github.com/pydantic/pydantic/pull/12179)\n* Add field name in serialization error by [@NicolasPllr1](https://github.com/NicolasPllr1) in [pydantic-core#1799](https://github.com/pydantic/pydantic-core/pull/1799)\n* Add option to preserve empty URL paths by [@davidhewitt](https://github.com/davidhewitt) in [pydantic-core#1789](https://github.com/pydantic/pydantic-core/pull/1789)\n\n#### Changes\n\n* Raise error if an incompatible `pydantic-core` version is installed by [@Viicos](https://github.com/Viicos) in [#12196](https://github.com/pydantic/pydantic/pull/12196)\n* Remove runtime warning for experimental features by [@Viicos](https://github.com/Viicos) in [#12265](https://github.com/pydantic/pydantic/pull/12265)\n* Warn if registering virtual subclasses on Pydantic models by [@Viicos](https://github.com/Viicos) in [#11669](https://github.com/pydantic/pydantic/pull/11669)\n\n#### Fixes\n\n* Fix `__getattr__()` behavior on Pydantic models when a property raised an `AttributeError` and extra values are present by [@raspuchin](https://github.com/raspuchin) in [#12106](https://github.com/pydantic/pydantic/pull/12106)\n* Add test to prevent regression with Pydantic models used as annotated metadata by [@Viicos](https://github.com/Viicos) in [#12133](https://github.com/pydantic/pydantic/pull/12133)\n* Allow to use property setters on Pydantic dataclasses with `validate_assignment` set by [@Viicos](https://github.com/Viicos) in [#12173](https://github.com/pydantic/pydantic/pull/12173)\n* Fix mypy v2 plugin for upcoming mypy release by [@cdce8p](https://github.com/cdce8p) in [#12209](https://github.com/pydantic/pydantic/pull/12209)\n* Respect custom title in functions JSON Schema by [@Viicos](https://github.com/Viicos) in [#11892](https://github.com/pydantic/pydantic/pull/11892)\n* Fix `ImportString` JSON serialization for objects with a `name` attribute by [@chr1sj0nes](https://github.com/chr1sj0nes) in [#12219](https://github.com/pydantic/pydantic/pull/12219)\n* Do not error on fields overridden by methods in the mypy plugin by [@Viicos](https://github.com/Viicos) in [#12290](https://github.com/pydantic/pydantic/pull/12290)\n\n#### Packaging\n\n* Bump `pydantic-core` to v2.40.1 by [@Viicos](https://github.com/Viicos) in [#12314](https://github.com/pydantic/pydantic/pull/12314)\n\n### New Contributors\n\n* [@raspuchin](https://github.com/raspuchin) made their first contribution in [#12106](https://github.com/pydantic/pydantic/pull/12106)\n* [@chr1sj0nes](https://github.com/chr1sj0nes) made their first contribution in [#12219](https://github.com/pydantic/pydantic/pull/12219)\n\n## v2.12.0a1 (2025-07-26)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.12.0a1)\n\nThis is the first alpha release of the upcoming 2.12 release, which adds initial support for Python 3.14.\n\n### What's Changed\n\n#### New Features\n\n* Add `__pydantic_on_complete__()` hook that is called once model is fully ready to be used by [@DouweM](https://github.com/DouweM) in [#11762](https://github.com/pydantic/pydantic/pull/11762)\n* Add initial support for Python 3.14 by [@Viicos](https://github.com/Viicos) in [#11991](https://github.com/pydantic/pydantic/pull/11991)\n* Add regex patterns to JSON schema for `Decimal` type by [@Dima-Bulavenko](https://github.com/Dima-Bulavenko) in [#11987](https://github.com/pydantic/pydantic/pull/11987)\n* Add support for `doc` attribute on dataclass fields by [@Viicos](https://github.com/Viicos) in [#12077](https://github.com/pydantic/pydantic/pull/12077)\n* Add experimental `MISSING` sentinel by [@Viicos](https://github.com/Viicos) in [#11883](https://github.com/pydantic/pydantic/pull/11883)\n\n#### Changes\n\n* Allow config and bases to be specified together in `create_model()` by [@Viicos](https://github.com/Viicos) in [#11714](https://github.com/pydantic/pydantic/pull/11714)\n* Move some field logic out of the `GenerateSchema` class by [@Viicos](https://github.com/Viicos) in [#11733](https://github.com/pydantic/pydantic/pull/11733)\n* Always make use of `inspect.getsourcelines()` for docstring extraction on Python 3.13 and greater by [@Viicos](https://github.com/Viicos) in [#11829](https://github.com/pydantic/pydantic/pull/11829)\n* Only support the latest Mypy version by [@Viicos](https://github.com/Viicos) in [#11832](https://github.com/pydantic/pydantic/pull/11832)\n* Do not implicitly convert after model validators to class methods by [@Viicos](https://github.com/Viicos) in [#11957](https://github.com/pydantic/pydantic/pull/11957)\n* Refactor `FieldInfo` creation implementation by [@Viicos](https://github.com/Viicos) in [#11898](https://github.com/pydantic/pydantic/pull/11898)\n* Make `Secret` covariant by [@bluenote10](https://github.com/bluenote10) in [#12008](https://github.com/pydantic/pydantic/pull/12008)\n* Emit warning when field-specific metadata is used in invalid contexts by [@Viicos](https://github.com/Viicos) in [#12028](https://github.com/pydantic/pydantic/pull/12028)\n\n#### Fixes\n\n* Properly fetch plain serializer function when serializing default value in JSON Schema by [@Viicos](https://github.com/Viicos) in [#11721](https://github.com/pydantic/pydantic/pull/11721)\n* Remove generics cache workaround by [@Viicos](https://github.com/Viicos) in [#11755](https://github.com/pydantic/pydantic/pull/11755)\n* Remove coercion of decimal constraints by [@Viicos](https://github.com/Viicos) in [#11772](https://github.com/pydantic/pydantic/pull/11772)\n* Fix crash when expanding root type in the mypy plugin by [@Viicos](https://github.com/Viicos) in [#11735](https://github.com/pydantic/pydantic/pull/11735)\n* Only mark model as complete once all fields are complete by [@DouweM](https://github.com/DouweM) in [#11759](https://github.com/pydantic/pydantic/pull/11759)\n* Do not provide `field_name` in validator core schemas by [@DouweM](https://github.com/DouweM) in [#11761](https://github.com/pydantic/pydantic/pull/11761)\n* Fix issue with recursive generic models by [@Viicos](https://github.com/Viicos) in [#11775](https://github.com/pydantic/pydantic/pull/11775)\n* Fix qualified name comparison of private attributes during namespace inspection by [@karta9821](https://github.com/karta9821) in [#11803](https://github.com/pydantic/pydantic/pull/11803)\n* Make sure Pydantic dataclasses with slots and `validate_assignment` can be unpickled by [@Viicos](https://github.com/Viicos) in [#11769](https://github.com/pydantic/pydantic/pull/11769)\n* Traverse `function-before` schemas during schema gathering by [@Viicos](https://github.com/Viicos) in [#11801](https://github.com/pydantic/pydantic/pull/11801)\n* Fix check for stdlib dataclasses by [@Viicos](https://github.com/Viicos) in [#11822](https://github.com/pydantic/pydantic/pull/11822)\n* Check if `FieldInfo` is complete after applying type variable map by [@Viicos](https://github.com/Viicos) in [#11855](https://github.com/pydantic/pydantic/pull/11855)\n* Do not delete mock validator/serializer in `model_rebuild()` by [@Viicos](https://github.com/Viicos) in [#11890](https://github.com/pydantic/pydantic/pull/11890)\n* Rebuild dataclass fields before schema generation by [@Viicos](https://github.com/Viicos) in [#11949](https://github.com/pydantic/pydantic/pull/11949)\n* Always store the original field assignment on `FieldInfo` by [@Viicos](https://github.com/Viicos) in [#11946](https://github.com/pydantic/pydantic/pull/11946)\n* Do not use deprecated methods as default field values by [@Viicos](https://github.com/Viicos) in [#11914](https://github.com/pydantic/pydantic/pull/11914)\n* Allow callable discriminator to be applied on PEP 695 type aliases by [@Viicos](https://github.com/Viicos) in [#11941](https://github.com/pydantic/pydantic/pull/11941)\n* Suppress core schema generation warning when using `SkipValidation` by [@ygsh0816](https://github.com/ygsh0816) in [#12002](https://github.com/pydantic/pydantic/pull/12002)\n* Do not emit typechecking error for invalid `Field()` default with `validate_default` set to `True` by [@Viicos](https://github.com/Viicos) in [#11988](https://github.com/pydantic/pydantic/pull/11988)\n* Refactor logic to support Pydantic's `Field()` function in dataclasses by [@Viicos](https://github.com/Viicos) in [#12051](https://github.com/pydantic/pydantic/pull/12051)\n\n#### Packaging\n\n* Update project metadata to use PEP 639 by [@Viicos](https://github.com/Viicos) in [#11694](https://github.com/pydantic/pydantic/pull/11694)\n* Bump `mkdocs-llmstxt` to v0.2.0 by [@Viicos](https://github.com/Viicos) in [#11725](https://github.com/pydantic/pydantic/pull/11725)\n* Bump `pydantic-core` to v2.35.1 by [@Viicos](https://github.com/Viicos) in [#11963](https://github.com/pydantic/pydantic/pull/11963)\n* Bump dawidd6/action-download-artifact from 10 to 11 by [@dependabot](https://github.com/dependabot)[bot] in [#12033](https://github.com/pydantic/pydantic/pull/12033)\n* Bump astral-sh/setup-uv from 5 to 6 by [@dependabot](https://github.com/dependabot)[bot] in [#11826](https://github.com/pydantic/pydantic/pull/11826)\n* Update mypy to 1.17.0 by [@Viicos](https://github.com/Viicos) in [#12076](https://github.com/pydantic/pydantic/pull/12076)\n\n### New Contributors\n\n* [@parth-paradkar](https://github.com/parth-paradkar) made their first contribution in [#11695](https://github.com/pydantic/pydantic/pull/11695)\n* [@dqkqd](https://github.com/dqkqd) made their first contribution in [#11739](https://github.com/pydantic/pydantic/pull/11739)\n* [@fhightower](https://github.com/fhightower) made their first contribution in [#11722](https://github.com/pydantic/pydantic/pull/11722)\n* [@gbaian10](https://github.com/gbaian10) made their first contribution in [#11766](https://github.com/pydantic/pydantic/pull/11766)\n* [@DouweM](https://github.com/DouweM) made their first contribution in [#11759](https://github.com/pydantic/pydantic/pull/11759)\n* [@bowenliang123](https://github.com/bowenliang123) made their first contribution in [#11719](https://github.com/pydantic/pydantic/pull/11719)\n* [@rawwar](https://github.com/rawwar) made their first contribution in [#11799](https://github.com/pydantic/pydantic/pull/11799)\n* [@karta9821](https://github.com/karta9821) made their first contribution in [#11803](https://github.com/pydantic/pydantic/pull/11803)\n* [@jinnovation](https://github.com/jinnovation) made their first contribution in [#11834](https://github.com/pydantic/pydantic/pull/11834)\n* [@zmievsa](https://github.com/zmievsa) made their first contribution in [#11861](https://github.com/pydantic/pydantic/pull/11861)\n* [@Otto-AA](https://github.com/Otto-AA) made their first contribution in [#11860](https://github.com/pydantic/pydantic/pull/11860)\n* [@ygsh0816](https://github.com/ygsh0816) made their first contribution in [#12002](https://github.com/pydantic/pydantic/pull/12002)\n* [@lukland](https://github.com/lukland) made their first contribution in [#12015](https://github.com/pydantic/pydantic/pull/12015)\n* [@Dima-Bulavenko](https://github.com/Dima-Bulavenko) made their first contribution in [#11987](https://github.com/pydantic/pydantic/pull/11987)\n* [@GSemikozov](https://github.com/GSemikozov) made their first contribution in [#12050](https://github.com/pydantic/pydantic/pull/12050)\n* [@hannah-heywa](https://github.com/hannah-heywa) made their first contribution in [#12082](https://github.com/pydantic/pydantic/pull/12082)\n\n## v2.11.10 (2025-10-04)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.10)\n\n### What's Changed\n\n#### Fixes\n\n* Backport v1.10.24 changes by [@Viicos](https://github.com/Viicos)\n\n## v2.11.9 (2025-09-13)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.9)\n\n### What's Changed\n\n#### Fixes\n\n* Backport v1.10.23 changes by [@Viicos](https://github.com/Viicos)\n\n## v2.11.8 (2025-09-13)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.8)\n\n### What's Changed\n\n#### Fixes\n\n* Fix mypy plugin for mypy 1.18 by [@cdce8p](https://github.com/cdce8p) in [#12209](https://github.com/pydantic/pydantic/pull/12209)\n\n## v2.11.7 (2025-06-14)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.7)\n\n### What's Changed\n\n#### Fixes\n\n* Copy `FieldInfo` instance if necessary during `FieldInfo` build by [@Viicos](https://github.com/Viicos) in [#11898](https://github.com/pydantic/pydantic/pull/11898)\n\n## v2.11.6 (2025-06-13)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.6)\n\n### What's Changed\n\n#### Fixes\n\n* Rebuild dataclass fields before schema generation by [@Viicos](https://github.com/Viicos) in [#11949](https://github.com/pydantic/pydantic/pull/11949)\n* Always store the original field assignment on `FieldInfo` by [@Viicos](https://github.com/Viicos) in [#11946](https://github.com/pydantic/pydantic/pull/11946)\n\n## v2.11.5 (2025-05-22)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.5)\n\n### What's Changed\n\n#### Fixes\n\n* Check if `FieldInfo` is complete after applying type variable map by [@Viicos](https://github.com/Viicos) in [#11855](https://github.com/pydantic/pydantic/pull/11855)\n* Do not delete mock validator/serializer in `model_rebuild()` by [@Viicos](https://github.com/Viicos) in [#11890](https://github.com/pydantic/pydantic/pull/11890)\n* Do not duplicate metadata on model rebuild by [@Viicos](https://github.com/Viicos) in [#11902](https://github.com/pydantic/pydantic/pull/11902)\n\n## v2.11.4 (2025-04-29)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.4)\n\n### What's Changed\n\n#### Changes\n\n* Allow config and bases to be specified together in `create_model()` by [@Viicos](https://github.com/Viicos) in [#11714](https://github.com/pydantic/pydantic/pull/11714).\n This change was backported as it was previously possible (although not meant to be supported)\n to provide `model_config` as a field, which would make it possible to provide both configuration\n and bases.\n\n#### Fixes\n\n* Remove generics cache workaround by [@Viicos](https://github.com/Viicos) in [#11755](https://github.com/pydantic/pydantic/pull/11755)\n* Remove coercion of decimal constraints by [@Viicos](https://github.com/Viicos) in [#11772](https://github.com/pydantic/pydantic/pull/11772)\n* Fix crash when expanding root type in the mypy plugin by [@Viicos](https://github.com/Viicos) in [#11735](https://github.com/pydantic/pydantic/pull/11735)\n* Fix issue with recursive generic models by [@Viicos](https://github.com/Viicos) in [#11775](https://github.com/pydantic/pydantic/pull/11775)\n* Traverse `function-before` schemas during schema gathering by [@Viicos](https://github.com/Viicos) in [#11801](https://github.com/pydantic/pydantic/pull/11801)\n\n#### Packaging\n\n* Bump `mkdocs-llmstxt` to v0.2.0 by [@Viicos](https://github.com/Viicos) in [#11725](https://github.com/pydantic/pydantic/pull/11725)\n\n## v2.11.3 (2025-04-08)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.3)\n\n### What's Changed\n\n#### Fixes\n\n* Preserve field description when rebuilding model fields by [@Viicos](https://github.com/Viicos) in [#11698](https://github.com/pydantic/pydantic/pull/11698)\n\n#### Packaging\n\n* Update V1 copy to v1.10.21 by [@Viicos](https://github.com/Viicos) in [#11706](https://github.com/pydantic/pydantic/pull/11706)\n\n## v2.11.2 (2025-04-03)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.2)\n\n### What's Changed\n\n#### Fixes\n\n* Bump `pydantic-core` to v2.33.1 by [@Viicos](https://github.com/Viicos) in [#11678](https://github.com/pydantic/pydantic/pull/11678)\n* Make sure `__pydantic_private__` exists before setting private attributes by [@Viicos](https://github.com/Viicos) in [#11666](https://github.com/pydantic/pydantic/pull/11666)\n* Do not override `FieldInfo._complete` when using field from parent class by [@Viicos](https://github.com/Viicos) in [#11668](https://github.com/pydantic/pydantic/pull/11668)\n* Provide the available definitions when applying discriminated unions by [@Viicos](https://github.com/Viicos) in [#11670](https://github.com/pydantic/pydantic/pull/11670)\n* Do not expand root type in the mypy plugin for variables by [@Viicos](https://github.com/Viicos) in [#11676](https://github.com/pydantic/pydantic/pull/11676)\n* Mention the attribute name in model fields deprecation message by [@Viicos](https://github.com/Viicos) in [#11674](https://github.com/pydantic/pydantic/pull/11674)\n* Properly validate parameterized mappings by [@Viicos](https://github.com/Viicos) in [#11658](https://github.com/pydantic/pydantic/pull/11658)\n\n## v2.11.1 (2025-03-28)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.1)\n\n### What's Changed\n\n#### Fixes\n\n* Do not override `'definitions-ref'` schemas containing serialization schemas or metadata by [@Viicos](https://github.com/Viicos) in [#11644](https://github.com/pydantic/pydantic/pull/11644)\n\n## v2.11.0 (2025-03-27)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.0)\n\n### What's Changed\n\nPydantic v2.11 is a version strongly focused on build time performance of Pydantic models (and core schema generation in general).\nSee the [blog post](https://pydantic.dev/articles/pydantic-v2-11-release) for more details.\n\n#### New Features\n\n* Add `encoded_string()` method to the URL types by [@YassinNouh21](https://github.com/YassinNouh21) in [#11580](https://github.com/pydantic/pydantic/pull/11580)\n* Add support for `defer_build` with `@validate_call` decorator by [@Viicos](https://github.com/Viicos) in [#11584](https://github.com/pydantic/pydantic/pull/11584)\n* Allow `@with_config` decorator to be used with keyword arguments by [@Viicos](https://github.com/Viicos) in [#11608](https://github.com/pydantic/pydantic/pull/11608)\n* Simplify customization of default value inclusion in JSON Schema generation by [@Viicos](https://github.com/Viicos) in [#11634](https://github.com/pydantic/pydantic/pull/11634)\n* Add `generate_arguments_schema()` function by [@Viicos](https://github.com/Viicos) in [#11572](https://github.com/pydantic/pydantic/pull/11572)\n\n#### Fixes\n\n* Allow generic typed dictionaries to be used for unpacked variadic keyword parameters by [@Viicos](https://github.com/Viicos) in [#11571](https://github.com/pydantic/pydantic/pull/11571)\n* Fix runtime error when computing model string representation involving cached properties and self-referenced models by [@Viicos](https://github.com/Viicos) in [#11579](https://github.com/pydantic/pydantic/pull/11579)\n* Preserve other steps when using the ellipsis in the pipeline API by [@Viicos](https://github.com/Viicos) in [#11626](https://github.com/pydantic/pydantic/pull/11626)\n* Fix deferred discriminator application logic by [@Viicos](https://github.com/Viicos) in [#11591](https://github.com/pydantic/pydantic/pull/11591)\n\n#### Packaging\n\n* Bump `pydantic-core` to v2.33.0 by [@Viicos](https://github.com/Viicos) in [#11631](https://github.com/pydantic/pydantic/pull/11631)\n\n### New Contributors\n\n* [@cmenon12](https://github.com/cmenon12) made their first contribution in [#11562](https://github.com/pydantic/pydantic/pull/11562)\n* [@Jeukoh](https://github.com/Jeukoh) made their first contribution in [#11611](https://github.com/pydantic/pydantic/pull/11611)\n\n## v2.11.0b2 (2025-03-17)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.0b2)\n\n### What's Changed\n\n#### New Features\n\n* Add experimental support for free threading by [@Viicos](https://github.com/Viicos) in [#11516](https://github.com/pydantic/pydantic/pull/11516)\n\n#### Fixes\n\n* Fix `NotRequired` qualifier not taken into account in stringified annotation by [@Viicos](https://github.com/Viicos) in [#11559](https://github.com/pydantic/pydantic/pull/11559)\n\n#### Packaging\n\n* Bump `pydantic-core` to v2.32.0 by [@Viicos](https://github.com/Viicos) in [#11567](https://github.com/pydantic/pydantic/pull/11567)\n\n### New Contributors\n\n* [@joren485](https://github.com/joren485) made their first contribution in [#11547](https://github.com/pydantic/pydantic/pull/11547)\n\n## v2.11.0b1 (2025-03-06)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.0b1)\n\n### What's Changed\n\n#### New Features\n\n* Support unsubstituted type variables with both a default and a bound or constraints by [@FyZzyss](https://github.com/FyZzyss) in https://github.com/pydantic/pydantic/pull/10789\n* Add a `default_factory_takes_validated_data` property to `FieldInfo` by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11034\n* Raise a better error when a generic alias is used inside `type[]` by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11088\n* Properly support PEP 695 generics syntax by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11189\n* Properly support type variable defaults by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11332\n* Add support for validating v6, v7, v8 UUIDs by [@astei](https://github.com/astei) in https://github.com/pydantic/pydantic/pull/11436\n* Improve alias configuration APIs by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic/pull/11468\n\n#### Changes\n\n* Rework `create_model` field definitions format by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11032\n* Raise a deprecation warning when a field is annotated as final with a default value by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11168\n* Deprecate accessing `model_fields` and `model_computed_fields` on instances by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11169\n* **Breaking Change:** Move core schema generation logic for path types inside the `GenerateSchema` class by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic/pull/10846\n* Remove Python 3.8 Support by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic/pull/11258\n* Optimize calls to `get_type_ref` by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/10863\n* Disable `pydantic-core` core schema validation by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic/pull/11271\n\n#### Performance\n\n* Only evaluate `FieldInfo` annotations if required during schema building by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/10769\n* Improve `__setattr__` performance of Pydantic models by caching setter functions by [@MarkusSintonen](https://github.com/MarkusSintonen) in https://github.com/pydantic/pydantic/pull/10868\n* Improve annotation application performance by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11186\n* Improve performance of `_typing_extra` module by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11255\n* Refactor and optimize schema cleaning logic by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11244\n* Create a single dictionary when creating a `CoreConfig` instance by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic/pull/11384\n* Bump `pydantic-core` and thus use `SchemaValidator` and `SchemaSerializer` caching by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic/pull/11402\n* Reuse cached core schemas for parametrized generic Pydantic models by [@MarkusSintonen](https://github.com/MarkusSintonen) in https://github.com/pydantic/pydantic/pull/11434\n\n#### Fixes\n\n* Improve `TypeAdapter` instance repr by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic/pull/10872\n* Use the correct frame when instantiating a parametrized `TypeAdapter` by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/10893\n* Infer final fields with a default value as class variables in the mypy plugin by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11121\n* Recursively unpack `Literal` values if using PEP 695 type aliases by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11114\n* Override `__subclasscheck__` on `ModelMetaclass` to avoid memory leak and performance issues by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11116\n* Remove unused `_extract_get_pydantic_json_schema()` parameter by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11155\n* Improve discriminated union error message for invalid union variants by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11161\n* Unpack PEP 695 type aliases if using the `Annotated` form by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11109\n* Add missing stacklevel in `deprecated_instance_property` warning by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11200\n* Copy `WithJsonSchema` schema to avoid sharing mutated data by [@thejcannon](https://github.com/thejcannon) in https://github.com/pydantic/pydantic/pull/11014\n* Do not cache parametrized models when in the process of parametrizing another model by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/10704\n* Add discriminated union related metadata entries to the `CoreMetadata` definition by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11216\n* Consolidate schema definitions logic in the `_Definitions` class by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11208\n* Support initializing root model fields with values of the `root` type in the mypy plugin by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11212\n* Fix various issues with dataclasses and `use_attribute_docstrings` by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11246\n* Only compute normalized decimal places if necessary in `decimal_places_validator` by [@misrasaurabh1](https://github.com/misrasaurabh1) in https://github.com/pydantic/pydantic/pull/11281\n* Add support for `validation_alias` in the mypy plugin by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11295\n* Fix JSON Schema reference collection with `\"examples\"` keys by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11305\n* Do not transform model serializer functions as class methods in the mypy plugin by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11298\n* Simplify `GenerateJsonSchema.literal_schema()` implementation by [@misrasaurabh1](https://github.com/misrasaurabh1) in https://github.com/pydantic/pydantic/pull/11321\n* Add additional allowed schemes for `ClickHouseDsn` by [@Maze21127](https://github.com/Maze21127) in https://github.com/pydantic/pydantic/pull/11319\n* Coerce decimal constraints to `Decimal` instances by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11350\n* Use the correct JSON Schema mode when handling function schemas by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11367\n* Improve exception message when encountering recursion errors during type evaluation by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11356\n* Always include `additionalProperties: True` for arbitrary dictionary schemas by [@austinyu](https://github.com/austinyu) in https://github.com/pydantic/pydantic/pull/11392\n* Expose `fallback` parameter in serialization methods by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11398\n* Fix path serialization behavior by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic/pull/11416\n* Do not reuse validators and serializers during model rebuild by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11429\n* Collect model fields when rebuilding a model by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11388\n* Allow cached properties to be altered on frozen models by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11432\n* Fix tuple serialization for `Sequence` types by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic/pull/11435\n* Fix: do not check for `__get_validators__` on classes where `__get_pydantic_core_schema__` is also defined by [@tlambert03](https://github.com/tlambert03) in https://github.com/pydantic/pydantic/pull/11444\n* Allow callable instances to be used as serializers by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11451\n* Improve error thrown when overriding field with a property by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic/pull/11459\n* Fix JSON Schema generation with referenceable core schemas holding JSON metadata by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11475\n* Support strict specification on union member types by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic/pull/11481\n* Implicitly set `validate_by_name` to `True` when `validate_by_alias` is `False` by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic/pull/11503\n* Change type of `Any` when synthesizing `BaseSettings.__init__` signature in the mypy plugin by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11497\n* Support type variable defaults referencing other type variables by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11520\n* Fix `ValueError` on year zero by [@davidhewitt](https://github.com/davidhewitt) in https://github.com/pydantic/pydantic-core/pull/1583\n* `dataclass` `InitVar` shouldn't be required on serialization by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic-core/pull/1602\n\n#### Packaging\n\n* Add a `check_pydantic_core_version()` function by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11324\n* Remove `greenlet` development dependency by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11351\n* Use the `typing-inspection` library by [@Viicos](https://github.com/Viicos) in https://github.com/pydantic/pydantic/pull/11479\n* Bump `pydantic-core` to `v2.31.1` by [@sydney-runkle](https://github.com/sydney-runkle) in https://github.com/pydantic/pydantic/pull/11526\n\n## New Contributors\n\n* [@FyZzyss](https://github.com/FyZzyss) made their first contribution in https://github.com/pydantic/pydantic/pull/10789\n* [@tamird](https://github.com/tamird) made their first contribution in https://github.com/pydantic/pydantic/pull/10948\n* [@felixxm](https://github.com/felixxm) made their first contribution in https://github.com/pydantic/pydantic/pull/11077\n* [@alexprabhat99](https://github.com/alexprabhat99) made their first contribution in https://github.com/pydantic/pydantic/pull/11082\n* [@Kharianne](https://github.com/Kharianne) made their first contribution in https://github.com/pydantic/pydantic/pull/11111\n* [@mdaffad](https://github.com/mdaffad) made their first contribution in https://github.com/pydantic/pydantic/pull/11177\n* [@thejcannon](https://github.com/thejcannon) made their first contribution in https://github.com/pydantic/pydantic/pull/11014\n* [@thomasfrimannkoren](https://github.com/thomasfrimannkoren) made their first contribution in https://github.com/pydantic/pydantic/pull/11251\n* [@usernameMAI](https://github.com/usernameMAI) made their first contribution in https://github.com/pydantic/pydantic/pull/11275\n* [@ananiavito](https://github.com/ananiavito) made their first contribution in https://github.com/pydantic/pydantic/pull/11302\n* [@pawamoy](https://github.com/pawamoy) made their first contribution in https://github.com/pydantic/pydantic/pull/11311\n* [@Maze21127](https://github.com/Maze21127) made their first contribution in https://github.com/pydantic/pydantic/pull/11319\n* [@kauabh](https://github.com/kauabh) made their first contribution in https://github.com/pydantic/pydantic/pull/11369\n* [@jaceklaskowski](https://github.com/jaceklaskowski) made their first contribution in https://github.com/pydantic/pydantic/pull/11353\n* [@tmpbeing](https://github.com/tmpbeing) made their first contribution in https://github.com/pydantic/pydantic/pull/11375\n* [@petyosi](https://github.com/petyosi) made their first contribution in https://github.com/pydantic/pydantic/pull/11405\n* [@austinyu](https://github.com/austinyu) made their first contribution in https://github.com/pydantic/pydantic/pull/11392\n* [@mikeedjones](https://github.com/mikeedjones) made their first contribution in https://github.com/pydantic/pydantic/pull/11402\n* [@astei](https://github.com/astei) made their first contribution in https://github.com/pydantic/pydantic/pull/11436\n* [@dsayling](https://github.com/dsayling) made their first contribution in https://github.com/pydantic/pydantic/pull/11522\n* [@sobolevn](https://github.com/sobolevn) made their first contribution in https://github.com/pydantic/pydantic-core/pull/1645\n\n## v2.11.0a2 (2025-02-10)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.0a2)\n\n### What's Changed\n\nPydantic v2.11 is a version strongly focused on build time performance of Pydantic models (and core schema generation in general).\nThis is another early alpha release, meant to collect early feedback from users having issues with core schema builds.\n\n#### Performance\n\n* Create a single dictionary when creating a `CoreConfig` instance by [@sydney-runkle](https://github.com/sydney-runkle) in [#11384](https://github.com/pydantic/pydantic/pull/11384)\n\n#### Fixes\n\n* Use the correct JSON Schema mode when handling function schemas by [@Viicos](https://github.com/Viicos) in [#11367](https://github.com/pydantic/pydantic/pull/11367)\n* Fix JSON Schema reference logic with `examples` keys by [@Viicos](https://github.com/Viicos) in [#11366](https://github.com/pydantic/pydantic/pull/11366)\n* Improve exception message when encountering recursion errors during type evaluation by [@Viicos](https://github.com/Viicos) in [#11356](https://github.com/pydantic/pydantic/pull/11356)\n* Always include `additionalProperties: True` for arbitrary dictionary schemas by [@austinyu](https://github.com/austinyu) in [#11392](https://github.com/pydantic/pydantic/pull/11392)\n* Expose `fallback` parameter in serialization methods by [@Viicos](https://github.com/Viicos) in [#11398](https://github.com/pydantic/pydantic/pull/11398)\n* Fix path serialization behavior by [@sydney-runkle](https://github.com/sydney-runkle) in [#11416](https://github.com/pydantic/pydantic/pull/11416)\n\n#### Packaging\n\n* Bump `ruff` from 0.9.2 to 0.9.5 by [@Viicos](https://github.com/Viicos) in [#11407](https://github.com/pydantic/pydantic/pull/11407)\n* Bump `pydantic-core` to v2.29.0 by [@mikeedjones](https://github.com/mikeedjones) in [#11402](https://github.com/pydantic/pydantic/pull/11402)\n* Use locally-built rust with symbols & pgo by [@davidhewitt](https://github.com/davidhewitt) in [#11403](https://github.com/pydantic/pydantic/pull/11403)\n\n### New Contributors\n\n* [@kauabh](https://github.com/kauabh) made their first contribution in [#11369](https://github.com/pydantic/pydantic/pull/11369)\n* [@jaceklaskowski](https://github.com/jaceklaskowski) made their first contribution in [#11353](https://github.com/pydantic/pydantic/pull/11353)\n* [@tmpbeing](https://github.com/tmpbeing) made their first contribution in [#11375](https://github.com/pydantic/pydantic/pull/11375)\n* [@petyosi](https://github.com/petyosi) made their first contribution in [#11405](https://github.com/pydantic/pydantic/pull/11405)\n* [@austinyu](https://github.com/austinyu) made their first contribution in [#11392](https://github.com/pydantic/pydantic/pull/11392)\n* [@mikeedjones](https://github.com/mikeedjones) made their first contribution in [#11402](https://github.com/pydantic/pydantic/pull/11402)\n\n## v2.11.0a1 (2025-01-30)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.11.0a1)\n\n### What's Changed\n\nPydantic v2.11 is a version strongly focused on build time performance of Pydantic models (and core schema generation in general).\nThis is an early alpha release, meant to collect early feedback from users having issues with core schema builds.\n\n#### New Features\n\n* Support unsubstituted type variables with both a default and a bound or constraints by [@FyZzyss](https://github.com/FyZzyss) in [#10789](https://github.com/pydantic/pydantic/pull/10789)\n* Add a `default_factory_takes_validated_data` property to `FieldInfo` by [@Viicos](https://github.com/Viicos) in [#11034](https://github.com/pydantic/pydantic/pull/11034)\n* Raise a better error when a generic alias is used inside `type[]` by [@Viicos](https://github.com/Viicos) in [#11088](https://github.com/pydantic/pydantic/pull/11088)\n* Properly support PEP 695 generics syntax by [@Viicos](https://github.com/Viicos) in [#11189](https://github.com/pydantic/pydantic/pull/11189)\n* Properly support type variable defaults by [@Viicos](https://github.com/Viicos) in [#11332](https://github.com/pydantic/pydantic/pull/11332)\n\n#### Changes\n\n* Rework `create_model` field definitions format by [@Viicos](https://github.com/Viicos) in [#11032](https://github.com/pydantic/pydantic/pull/11032)\n* Raise a deprecation warning when a field is annotated as final with a default value by [@Viicos](https://github.com/Viicos) in [#11168](https://github.com/pydantic/pydantic/pull/11168)\n* Deprecate accessing `model_fields` and `model_computed_fields` on instances by [@Viicos](https://github.com/Viicos) in [#11169](https://github.com/pydantic/pydantic/pull/11169)\n* Move core schema generation logic for path types inside the `GenerateSchema` class by [@sydney-runkle](https://github.com/sydney-runkle) in [#10846](https://github.com/pydantic/pydantic/pull/10846)\n* Move `deque` schema gen to `GenerateSchema` class by [@sydney-runkle](https://github.com/sydney-runkle) in [#11239](https://github.com/pydantic/pydantic/pull/11239)\n* Move `Mapping` schema gen to `GenerateSchema` to complete removal of `prepare_annotations_for_known_type` workaround by [@sydney-runkle](https://github.com/sydney-runkle) in [#11247](https://github.com/pydantic/pydantic/pull/11247)\n* Remove Python 3.8 Support by [@sydney-runkle](https://github.com/sydney-runkle) in [#11258](https://github.com/pydantic/pydantic/pull/11258)\n* Disable `pydantic-core` core schema validation by [@sydney-runkle](https://github.com/sydney-runkle) in [#11271](https://github.com/pydantic/pydantic/pull/11271)\n\n#### Performance\n\n* Only evaluate `FieldInfo` annotations if required during schema building by [@Viicos](https://github.com/Viicos) in [#10769](https://github.com/pydantic/pydantic/pull/10769)\n* Optimize calls to `get_type_ref` by [@Viicos](https://github.com/Viicos) in [#10863](https://github.com/pydantic/pydantic/pull/10863)\n* Improve `__setattr__` performance of Pydantic models by caching setter functions by [@MarkusSintonen](https://github.com/MarkusSintonen) in [#10868](https://github.com/pydantic/pydantic/pull/10868)\n* Improve annotation application performance by [@Viicos](https://github.com/Viicos) in [#11186](https://github.com/pydantic/pydantic/pull/11186)\n* Improve performance of `_typing_extra` module by [@Viicos](https://github.com/Viicos) in [#11255](https://github.com/pydantic/pydantic/pull/11255)\n* Refactor and optimize schema cleaning logic by [@Viicos](https://github.com/Viicos) and [@MarkusSintonen](https://github.com/MarkusSintonen) in [#11244](https://github.com/pydantic/pydantic/pull/11244)\n\n#### Fixes\n\n* Add validation tests for `_internal/_validators.py` by [@tkasuz](https://github.com/tkasuz) in [#10763](https://github.com/pydantic/pydantic/pull/10763)\n* Improve `TypeAdapter` instance repr by [@sydney-runkle](https://github.com/sydney-runkle) in [#10872](https://github.com/pydantic/pydantic/pull/10872)\n* Revert \"ci: use locally built pydantic-core with debug symbols by [@sydney-runkle](https://github.com/sydney-runkle) in [#10942](https://github.com/pydantic/pydantic/pull/10942)\n* Re-enable all FastAPI tests by [@tamird](https://github.com/tamird) in [#10948](https://github.com/pydantic/pydantic/pull/10948)\n* Fix typo in HISTORY.md. by [@felixxm](https://github.com/felixxm) in [#11077](https://github.com/pydantic/pydantic/pull/11077)\n* Infer final fields with a default value as class variables in the mypy plugin by [@Viicos](https://github.com/Viicos) in [#11121](https://github.com/pydantic/pydantic/pull/11121)\n* Recursively unpack `Literal` values if using PEP 695 type aliases by [@Viicos](https://github.com/Viicos) in [#11114](https://github.com/pydantic/pydantic/pull/11114)\n* Override `__subclasscheck__` on `ModelMetaclass` to avoid memory leak and performance issues by [@Viicos](https://github.com/Viicos) in [#11116](https://github.com/pydantic/pydantic/pull/11116)\n* Remove unused `_extract_get_pydantic_json_schema()` parameter by [@Viicos](https://github.com/Viicos) in [#11155](https://github.com/pydantic/pydantic/pull/11155)\n* Add FastAPI and SQLModel to third-party tests by [@sydney-runkle](https://github.com/sydney-runkle) in [#11044](https://github.com/pydantic/pydantic/pull/11044)\n* Fix conditional expressions syntax for third-party tests by [@Viicos](https://github.com/Viicos) in [#11162](https://github.com/pydantic/pydantic/pull/11162)\n* Move FastAPI tests to third-party workflow by [@Viicos](https://github.com/Viicos) in [#11164](https://github.com/pydantic/pydantic/pull/11164)\n* Improve discriminated union error message for invalid union variants by [@Viicos](https://github.com/Viicos) in [#11161](https://github.com/pydantic/pydantic/pull/11161)\n* Unpack PEP 695 type aliases if using the `Annotated` form by [@Viicos](https://github.com/Viicos) in [#11109](https://github.com/pydantic/pydantic/pull/11109)\n* Include `openapi-python-client` check in issue creation for third-party failures, use `main` branch by [@sydney-runkle](https://github.com/sydney-runkle) in [#11182](https://github.com/pydantic/pydantic/pull/11182)\n* Add pandera third-party tests by [@Viicos](https://github.com/Viicos) in [#11193](https://github.com/pydantic/pydantic/pull/11193)\n* Add ODMantic third-party tests by [@sydney-runkle](https://github.com/sydney-runkle) in [#11197](https://github.com/pydantic/pydantic/pull/11197)\n* Add missing stacklevel in `deprecated_instance_property` warning by [@Viicos](https://github.com/Viicos) in [#11200](https://github.com/pydantic/pydantic/pull/11200)\n* Copy `WithJsonSchema` schema to avoid sharing mutated data by [@thejcannon](https://github.com/thejcannon) in [#11014](https://github.com/pydantic/pydantic/pull/11014)\n* Do not cache parametrized models when in the process of parametrizing another model by [@Viicos](https://github.com/Viicos) in [#10704](https://github.com/pydantic/pydantic/pull/10704)\n* Re-enable Beanie third-party tests by [@Viicos](https://github.com/Viicos) in [#11214](https://github.com/pydantic/pydantic/pull/11214)\n* Add discriminated union related metadata entries to the `CoreMetadata` definition by [@Viicos](https://github.com/Viicos) in [#11216](https://github.com/pydantic/pydantic/pull/11216)\n* Consolidate schema definitions logic in the `_Definitions` class by [@Viicos](https://github.com/Viicos) in [#11208](https://github.com/pydantic/pydantic/pull/11208)\n* Support initializing root model fields with values of the `root` type in the mypy plugin by [@Viicos](https://github.com/Viicos) in [#11212](https://github.com/pydantic/pydantic/pull/11212)\n* Fix various issues with dataclasses and `use_attribute_docstrings` by [@Viicos](https://github.com/Viicos) in [#11246](https://github.com/pydantic/pydantic/pull/11246)\n* Only compute normalized decimal places if necessary in `decimal_places_validator` by [@misrasaurabh1](https://github.com/misrasaurabh1) in [#11281](https://github.com/pydantic/pydantic/pull/11281)\n* Fix two misplaced sentences in validation errors documentation by [@ananiavito](https://github.com/ananiavito) in [#11302](https://github.com/pydantic/pydantic/pull/11302)\n* Fix mkdocstrings inventory example in documentation by [@pawamoy](https://github.com/pawamoy) in [#11311](https://github.com/pydantic/pydantic/pull/11311)\n* Add support for `validation_alias` in the mypy plugin by [@Viicos](https://github.com/Viicos) in [#11295](https://github.com/pydantic/pydantic/pull/11295)\n* Do not transform model serializer functions as class methods in the mypy plugin by [@Viicos](https://github.com/Viicos) in [#11298](https://github.com/pydantic/pydantic/pull/11298)\n* Simplify `GenerateJsonSchema.literal_schema()` implementation by [@misrasaurabh1](https://github.com/misrasaurabh1) in [#11321](https://github.com/pydantic/pydantic/pull/11321)\n* Add additional allowed schemes for `ClickHouseDsn` by [@Maze21127](https://github.com/Maze21127) in [#11319](https://github.com/pydantic/pydantic/pull/11319)\n* Coerce decimal constraints to `Decimal` instances by [@Viicos](https://github.com/Viicos) in [#11350](https://github.com/pydantic/pydantic/pull/11350)\n* Fix `ValueError` on year zero by [@davidhewitt](https://github.com/davidhewitt) in [pydantic-core#1583](https://github.com/pydantic/pydantic-core/pull/1583)\n\n#### Packaging\n\n* Bump dawidd6/action-download-artifact from 6 to 7 by [@dependabot](https://github.com/dependabot) in [#11018](https://github.com/pydantic/pydantic/pull/11018)\n* Re-enable memray related tests on Python 3.12+ by [@Viicos](https://github.com/Viicos) in [#11191](https://github.com/pydantic/pydantic/pull/11191)\n* Bump astral-sh/setup-uv to 5 by [@dependabot](https://github.com/dependabot) in [#11205](https://github.com/pydantic/pydantic/pull/11205)\n* Bump `ruff` to v0.9.0 by [@sydney-runkle](https://github.com/sydney-runkle) in [#11254](https://github.com/pydantic/pydantic/pull/11254)\n* Regular `uv.lock` deps update by [@sydney-runkle](https://github.com/sydney-runkle) in [#11333](https://github.com/pydantic/pydantic/pull/11333)\n* Add a `check_pydantic_core_version()` function by [@Viicos](https://github.com/Viicos) in [#11324](https://github.com/pydantic/pydantic/pull/11324)\n* Remove `greenlet` development dependency by [@Viicos](https://github.com/Viicos) in [#11351](https://github.com/pydantic/pydantic/pull/11351)\n* Bump `pydantic-core` to v2.28.0 by [@Viicos](https://github.com/Viicos) in [#11364](https://github.com/pydantic/pydantic/pull/11364)\n\n### New Contributors\n\n* [@FyZzyss](https://github.com/FyZzyss) made their first contribution in [#10789](https://github.com/pydantic/pydantic/pull/10789)\n* [@tamird](https://github.com/tamird) made their first contribution in [#10948](https://github.com/pydantic/pydantic/pull/10948)\n* [@felixxm](https://github.com/felixxm) made their first contribution in [#11077](https://github.com/pydantic/pydantic/pull/11077)\n* [@alexprabhat99](https://github.com/alexprabhat99) made their first contribution in [#11082](https://github.com/pydantic/pydantic/pull/11082)\n* [@Kharianne](https://github.com/Kharianne) made their first contribution in [#11111](https://github.com/pydantic/pydantic/pull/11111)\n* [@mdaffad](https://github.com/mdaffad) made their first contribution in [#11177](https://github.com/pydantic/pydantic/pull/11177)\n* [@thejcannon](https://github.com/thejcannon) made their first contribution in [#11014](https://github.com/pydantic/pydantic/pull/11014)\n* [@thomasfrimannkoren](https://github.com/thomasfrimannkoren) made their first contribution in [#11251](https://github.com/pydantic/pydantic/pull/11251)\n* [@usernameMAI](https://github.com/usernameMAI) made their first contribution in [#11275](https://github.com/pydantic/pydantic/pull/11275)\n* [@ananiavito](https://github.com/ananiavito) made their first contribution in [#11302](https://github.com/pydantic/pydantic/pull/11302)\n* [@pawamoy](https://github.com/pawamoy) made their first contribution in [#11311](https://github.com/pydantic/pydantic/pull/11311)\n* [@Maze21127](https://github.com/Maze21127) made their first contribution in [#11319](https://github.com/pydantic/pydantic/pull/11319)\n\n## v2.10.6 (2025-01-23)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.10.6)\n\n### What's Changed\n\n#### Fixes\n\n* Fix JSON Schema reference collection with `'examples'` keys by [@Viicos](https://github.com/Viicos) in [#11325](https://github.com/pydantic/pydantic/pull/11325)\n* Fix url python serialization by [@sydney-runkle](https://github.com/sydney-runkle) in [#11331](https://github.com/pydantic/pydantic/pull/11331)\n\n## v2.10.5 (2025-01-08)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.10.5)\n\n### What's Changed\n\n#### Fixes\n\n* Remove custom MRO implementation of Pydantic models by [@Viicos](https://github.com/Viicos) in [#11184](https://github.com/pydantic/pydantic/pull/11184)\n* Fix URL serialization for unions by [@sydney-runkle](https://github.com/sydney-runkle) in [#11233](https://github.com/pydantic/pydantic/pull/11233)\n\n## v2.10.4 (2024-12-18)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.10.4)\n\n### What's Changed\n\n#### Fixes\n\n* Fix for comparison of `AnyUrl` objects by [@alexprabhat99](https://github.com/alexprabhat99) in [#11082](https://github.com/pydantic/pydantic/pull/11082)\n* Properly fetch PEP 695 type params for functions, do not fetch annotations from signature by [@Viicos](https://github.com/Viicos) in [#11093](https://github.com/pydantic/pydantic/pull/11093)\n* Include JSON Schema input core schema in function schemas by [@Viicos](https://github.com/Viicos) in [#11085](https://github.com/pydantic/pydantic/pull/11085)\n* Add `len` to `_BaseUrl` to avoid TypeError by [@Kharianne](https://github.com/Kharianne) in [#11111](https://github.com/pydantic/pydantic/pull/11111)\n* Make sure the type reference is removed from the seen references by [@Viicos](https://github.com/Viicos) in [#11143](https://github.com/pydantic/pydantic/pull/11143)\n\n### New Contributors\n\n* [@FyZzyss](https://github.com/FyZzyss) made their first contribution in [#10789](https://github.com/pydantic/pydantic/pull/10789)\n* [@tamird](https://github.com/tamird) made their first contribution in [#10948](https://github.com/pydantic/pydantic/pull/10948)\n* [@felixxm](https://github.com/felixxm) made their first contribution in [#11077](https://github.com/pydantic/pydantic/pull/11077)\n* [@alexprabhat99](https://github.com/alexprabhat99) made their first contribution in [#11082](https://github.com/pydantic/pydantic/pull/11082)\n* [@Kharianne](https://github.com/Kharianne) made their first contribution in [#11111](https://github.com/pydantic/pydantic/pull/11111)\n\n#### Packaging\n\n* Bump `pydantic-core` to v2.27.2 by [@davidhewitt](https://github.com/davidhewitt) in [#11138](https://github.com/pydantic/pydantic/pull/11138)\n\n## v2.10.3 (2024-12-03)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.10.3)\n\n### What's Changed\n\n#### Fixes\n\n* Set fields when `defer_build` is set on Pydantic dataclasses by [@Viicos](https://github.com/Viicos) in [#10984](https://github.com/pydantic/pydantic/pull/10984)\n* Do not resolve the JSON Schema reference for `dict` core schema keys by [@Viicos](https://github.com/Viicos) in [#10989](https://github.com/pydantic/pydantic/pull/10989)\n* Use the globals of the function when evaluating the return type for `PlainSerializer` and `WrapSerializer` functions by [@Viicos](https://github.com/Viicos) in [#11008](https://github.com/pydantic/pydantic/pull/11008)\n* Fix host required enforcement for urls to be compatible with v2.9 behavior by [@sydney-runkle](https://github.com/sydney-runkle) in [#11027](https://github.com/pydantic/pydantic/pull/11027)\n* Add a `default_factory_takes_validated_data` property to `FieldInfo` by [@Viicos](https://github.com/Viicos) in [#11034](https://github.com/pydantic/pydantic/pull/11034)\n* Fix url json schema in `serialization` mode by [@sydney-runkle](https://github.com/sydney-runkle) in [#11035](https://github.com/pydantic/pydantic/pull/11035)\n\n## v2.10.2 (2024-11-25)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.10.2)\n\n### What's Changed\n\n#### Fixes\n\n* Only evaluate FieldInfo annotations if required during schema building by [@Viicos](https://github.com/Viicos) in [#10769](https://github.com/pydantic/pydantic/pull/10769)\n* Do not evaluate annotations for private fields by [@Viicos](https://github.com/Viicos) in [#10962](https://github.com/pydantic/pydantic/pull/10962)\n* Support serialization as any for `Secret` types and `Url` types by [@sydney-runkle](https://github.com/sydney-runkle) in [#10947](https://github.com/pydantic/pydantic/pull/10947)\n* Fix type hint of `Field.default` to be compatible with Python 3.8 and 3.9 by [@Viicos](https://github.com/Viicos) in [#10972](https://github.com/pydantic/pydantic/pull/10972)\n* Add hashing support for URL types by [@sydney-runkle](https://github.com/sydney-runkle) in [#10975](https://github.com/pydantic/pydantic/pull/10975)\n* Hide `BaseModel.__replace__` definition from type checkers by [@Viicos](https://github.com/Viicos) in [#10979](https://github.com/pydantic/pydantic/pull/10979)\n\n## v2.10.1 (2024-11-21)\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.10.1)\n\n### What's Changed\n\n#### Fixes\n\n* Use the correct frame when instantiating a parametrized `TypeAdapter` by [@Viicos](https://github.com/Viicos) in [#10893](https://github.com/pydantic/pydantic/pull/10893)\n* Relax check for validated data in `default_factory` utils by [@sydney-runkle](https://github.com/sydney-runkle) in [#10909](https://github.com/pydantic/pydantic/pull/10909)\n* Fix type checking issue with `model_fields` and `model_computed_fields` by [@sydney-runkle](https://github.com/sydney-runkle) in [#10911](https://github.com/pydantic/pydantic/pull/10911)\n* Use the parent configuration during schema generation for stdlib `dataclass`es by [@sydney-runkle](https://github.com/sydney-runkle) in [#10928](https://github.com/pydantic/pydantic/pull/10928)\n* Use the `globals` of the function when evaluating the return type of serializers and `computed_field`s by [@Viicos](https://github.com/Viicos) in [#10929](https://github.com/pydantic/pydantic/pull/10929)\n* Fix URL constraint application by [@sydney-runkle](https://github.com/sydney-runkle) in [#10922](https://github.com/pydantic/pydantic/pull/10922)\n* Fix URL equality with different validation methods by [@sydney-runkle](https://github.com/sydney-runkle) in [#10934](https://github.com/pydantic/pydantic/pull/10934)\n* Fix JSON schema title when specified as `''` by [@sydney-runkle](https://github.com/sydney-runkle) in [#10936](https://github.com/pydantic/pydantic/pull/10936)\n* Fix `python` mode serialization for `complex` inference by [@sydney-runkle](https://github.com/sydney-runkle) in [pydantic-core#1549](https://github.com/pydantic/pydantic-core/pull/1549)\n\n#### Packaging\n\n* Bump `pydantic-core` version to `v2.27.1` by [@sydney-runkle](https://github.com/sydney-runkle) in [#10938](https://github.com/pydantic/pydantic/pull/10938)\n\n### New Contributors\n\n## v2.10.0 (2024-11-20)\n\nThe code released in v2.10.0 is practically identical to that of v2.10.0b2.\n\n[GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.10.0)\n\nSee the [v2.10 release blog post](https://pydantic.dev/articles/pydantic-v2-10-release) for the highlights!\n\n### What's Changed\n\n#### New Features\n\n* Support `fractions.Fraction` by [@sydney-runkle](https://github.com/sydney-runkle) in [#10318](https://github.com/pydantic/pydantic/pull/10318)\n* Support `Hashable` for json validation by [@sydney-runkle](https://github.com/sydney-runkle) in [#10324](https://github.com/pydantic/pydantic/pull/10324)\n* Add a `SocketPath` type for `linux` systems by [@theunkn0wn1](https://github.com/theunkn0wn1) in [#10378](https://github.com/pydantic/pydantic/pull/10378)\n* Allow arbitrary refs in JSON schema `examples` by [@sydney-runkle](https://github.com/sydney-runkle) in [#10417](https://github.com/pydantic/pydantic/pull/10417)\n* Support `defer_build` for Pydantic dataclasses by [@Viicos](https://github.com/Viicos) in [#10313](https://github.com/pydantic/pydantic/pull/10313)\n* Adding v1 / v2 incompatibility warning for nested v1 model by [@sydney-runkle](https://github.com/sydney-runkle) in [#10431](https://github.com/pydantic/pydantic/pull/10431)\n* Add support for unpacked `TypedDict` to type hint variadic keyword arguments with `@validate_call` by [@Viicos](https://github.com/Viicos) in [#10416](https://github.com/pydantic/pydantic/pull/10416)\n* Support compiled patterns in `protected_namespaces` by [@sydney-runkle](https://github.com/sydney-runkle) in [#10522](https://github.com/pydantic/pydantic/pull/10522)\n* Add support for `propertyNames` in JSON schema by [@FlorianSW](https://github.com/FlorianSW) in [#10478](https://github.com/pydantic/pydantic/pull/10478)\n* Adding `__replace__` protocol for Python 3.13+ support by [@sydney-runkle](https://github.com/sydney-runkle) in [#10596](https://github.com/pydantic/pydantic/pull/10596)\n* Expose public `sort` method for JSON schema generation by [@sydney-runkle](https://github.com/sydney-runkle) in [#10595](https://github.com/pydantic/pydantic/pull/10595)\n* Add runtime validation of `@validate_call` callable argument by [@kc0506](https://github.com/kc0506) in [#10627](https://github.com/pydantic/pydantic/pull/10627)\n* Add `experimental_allow_partial` support by [@samuelcolvin](https://github.com/samuelcolvin) in [#10748](https://github.com/pydantic/pydantic/pull/10748)\n* Support default factories taking validated data as an argument by [@Viicos](https://github.com/Viicos) in [#10678](https://github.com/pydantic/pydantic/pull/10678)\n* Allow subclassing `ValidationError` and `PydanticCustomError` by [@Youssefares](https://github.com/Youssefares) in [pydantic/pydantic-core#1413](https://github.com/pydantic/pydantic-core/pull/1413)\n* Add `trailing-strings` support to `experimental_allow_partial` by [@sydney-runkle](https://github.com/sydney-runkle) in [#10825](https://github.com/pydantic/pydantic/pull/10825)\n* Add `rebuild()` method for `TypeAdapter` and simplify `defer_build` patterns by [@sydney-runkle](https://github.com/sydney-runkle) in [#10537](https://github.com/pydantic/pydantic/pull/10537)\n* Improve `TypeAdapter` instance repr by [@sydney-runkle](https://github.com/sydney-runkle) in [#10872](https://github.com/pydantic/pydantic/pull/10872)\n\n#### Changes\n\n* Don't allow customization of `SchemaGenerator` until interface is more stable by [@sydney-runkle](https://github.com/sydney-runkle) in [#10303](https://github.com/pydantic/pydantic/pull/10303)\n* Cleanly `defer_build` on `TypeAdapters`, removing experimental flag by [@sydney-runkle](https://github.com/sydney-runkle) in [#10329](https://github.com/pydantic/pydantic/pull/10329)\n* Fix `mro` of generic subclass by [@kc0506](https://github.com/kc0506) in [#10100](https://github.com/pydantic/pydantic/pull/10100)\n* Strip whitespaces on JSON Schema title generation by [@sydney-runkle](https://github.com/sydney-runkle) in [#10404](https://github.com/pydantic/pydantic/pull/10404)\n* Use `b64decode` and `b64encode` for `Base64Bytes` type by [@sydney-runkle](https://github.com/sydney-runkle) in [#10486](https://github.com/pydantic/pydantic/pull/10486)\n* Relax protected namespace config default by [@sydney-runkle](https://github.com/sydney-runkle) in [#10441](https://github.com/pydantic/pydantic/pull/10441)\n* Revalidate parametrized generics if instance's origin is subclass of OG class by [@sydney-runkle](https://github.com/sydney-runkle) in [#10666](https://github.com/pydantic/pydantic/pull/10666)\n* Warn if configuration is specified on the `@dataclass` decorator and with the `__pydantic_config__` attribute by [@sydney-runkle](https://github.com/sydney-runkle) in [#10406](https://github.com/pydantic/pydantic/pull/10406)\n* Recommend against using `Ellipsis` (...) with `Field` by [@Viicos](https://github.com/Viicos) in [#10661](https://github.com/pydantic/pydantic/pull/10661)\n* Migrate to subclassing instead of annotated approach for pydantic url types by [@sydney-runkle](https://github.com/sydney-runkle) in [#10662](https://github.com/pydantic/pydantic/pull/10662)\n* Change JSON schema generation of `Literal`s and `Enums` by [@Viicos](https://github.com/Viicos) in [#10692](https://github.com/pydantic/pydantic/pull/10692)\n* Simplify unions involving `Any` or `Never` when replacing type variables by [@Viicos](https://github.com/Viicos) in [#10338](https://github.com/pydantic/pydantic/pull/10338)\n* Do not require padding when decoding `base64` bytes by [@bschoenmaeckers](https://github.com/bschoenmaeckers) in [pydantic/pydantic-core#1448](https://github.com/pydantic/pydantic-core/pull/1448)\n* Support dates all the way to 1BC by [@changhc](https://github.com/changhc) in [pydantic/speedate#77](https://github.com/pydantic/speedate/pull/77)\n\n#### Performance\n\n* Schema cleaning: skip unnecessary copies during schema walking by [@Viicos](https://github.com/Viicos) in [#10286](https://github.com/pydantic/pydantic/pull/10286)\n* Refactor namespace logic for annotations evaluation by [@Viicos](https://github.com/Viicos) in [#10530](https://github.com/pydantic/pydantic/pull/10530)\n* Improve email regexp on edge cases by [@AlekseyLobanov](https://github.com/AlekseyLobanov) in [#10601](https://github.com/pydantic/pydantic/pull/10601)\n* `CoreMetadata` refactor with an emphasis on documentation, schema build time performance, and reducing complexity by [@sydney-runkle](https://github.com/sydney-runkle) in [#10675](https://github.com/pydantic/pydantic/pull/10675)\n\n#### Packaging\n\n* Bump `pydantic-core` to `v2.27.0` by [@sydney-runkle](https://github.com/sydney-runkle) in [#10825](https://github.com/pydantic/pydantic/pull/10825)\n* Replaced pdm with uv by [@frfahim](https://github.com/frfahim) in [#10727](https://github.com/pydantic/pydantic/pull/10727)\n\n#### Fixes\n\n* Remove guarding check on `computed_field` with `field_serializer` by [@nix010](https://github.com/nix010) in [#10390](https://github.com/pydantic/pydantic/pull/10390)\n* Fix `Predicate` issue in `v2.9.0` by [@sydney-runkle](https://github.com/sydney-runkle) in [#10321](https://github.com/pydantic/pydantic/pull/10321)\n* Fixing `annotated-types` bound by [@sydney-runkle](https://github.com/sydney-runkle) in [#10327](https://github.com/pydantic/pydantic/pull/10327)\n* Turn `tzdata` install requirement into optional `timezone` dependency by [@jakob-keller](https://github.com/jakob-keller) in [#10331](https://github.com/pydantic/pydantic/pull/10331)\n* Use correct types namespace when building `namedtuple` core schemas by [@Viicos](https://github.com/Viicos) in [#10337](https://github.com/pydantic/pydantic/pull/10337)\n* Fix evaluation of stringified annotations during namespace inspection by [@Viicos](https://github.com/Viicos) in [#10347](https://github.com/pydantic/pydantic/pull/10347)\n* Fix `IncEx` type alias definition by [@Viicos](https://github.com/Viicos) in [#10339](https://github.com/pydantic/pydantic/pull/10339)\n* Do not error when trying to evaluate annotations of private attributes by [@Viicos](https://github.com/Viicos) in [#10358](https://github.com/pydantic/pydantic/pull/10358)\n* Fix nested type statement by [@kc0506](https://github.com/kc0506) in [#10369](https://github.com/pydantic/pydantic/pull/10369)\n* Improve typing of `ModelMetaclass.mro` by [@Viicos](https://github.com/Viicos) in [#10372](https://github.com/pydantic/pydantic/pull/10372)\n* Fix class access of deprecated `computed_field`s by [@Viicos](https://github.com/Viicos) in [#10391](https://github.com/pydantic/pydantic/pull/10391)\n* Make sure `inspect.iscoroutinefunction` works on coroutines decorated with `@validate_call` by [@MovisLi](https://github.com/MovisLi) in [#10374](https://github.com/pydantic/pydantic/pull/10374)\n* Fix `NameError` when using `validate_call` with PEP 695 on a class by [@kc0506](https://github.com/kc0506) in [#10380](https://github.com/pydantic/pydantic/pull/10380)\n* Fix `ZoneInfo` with various invalid types by [@sydney-runkle](https://github.com/sydney-runkle) in [#10408](https://github.com/pydantic/pydantic/pull/10408)\n* Fix `PydanticUserError` on empty `model_config` with annotations by [@cdwilson](https://github.com/cdwilson) in [#10412](https://github.com/pydantic/pydantic/pull/10412)\n* Fix variance issue in `_IncEx` type alias, only allow `True` by [@Viicos](https://github.com/Viicos) in [#10414](https://github.com/pydantic/pydantic/pull/10414)\n* Fix serialization schema generation when using `PlainValidator` by [@Viicos](https://github.com/Viicos) in [#10427](https://github.com/pydantic/pydantic/pull/10427)\n* Fix schema generation error when serialization schema holds references by [@Viicos](https://github.com/Viicos) in [#10444](https://github.com/pydantic/pydantic/pull/10444)\n* Inline references if possible when generating schema for `json_schema_input_type` by [@Viicos](https://github.com/Viicos) in [#10439](https://github.com/pydantic/pydantic/pull/10439)\n* Fix recursive arguments in `Representation` by [@Viicos](https://github.com/Viicos) in [#10480](https://github.com/pydantic/pydantic/pull/10480)\n* Fix representation for builtin function types by [@kschwab](https://github.com/kschwab) in [#10479](https://github.com/pydantic/pydantic/pull/10479)\n* Add python validators for decimal constraints (`max_digits` and `decimal_places`) by [@sydney-runkle](https://github.com/sydney-runkle) in [#10506](https://github.com/pydantic/pydantic/pull/10506)\n* Only fetch `__pydantic_core_schema__` from the current class during schema generation by [@Viicos](https://github.com/Viicos) in [#10518](https://github.com/pydantic/pydantic/pull/10518)\n* Fix `stacklevel` on deprecation warnings for `BaseModel` by [@sydney-runkle](https://github.com/sydney-runkle) in [#10520](https://github.com/pydantic/pydantic/pull/10520)\n* Fix warning `stacklevel` in `BaseModel.__init__` by [@Viicos](https://github.com/Viicos) in [#10526](https://github.com/pydantic/pydantic/pull/10526)\n* Improve error handling for in-evaluable refs for discriminator application by [@sydney-runkle](https://github.com/sydney-runkle) in [#10440](https://github.com/pydantic/pydantic/pull/10440)\n* Change the signature of `ConfigWrapper.core_config` to take the title directly by [@Viicos](https://github.com/Viicos) in [#10562](https://github.com/pydantic/pydantic/pull/10562)\n* Do not use the previous config from the stack for dataclasses without config by [@Viicos](https://github.com/Viicos) in [#10576](https://github.com/pydantic/pydantic/pull/10576)\n* Fix serialization for IP types with `mode='python'` by [@sydney-runkle](https://github.com/sydney-runkle) in [#10594](https://github.com/pydantic/pydantic/pull/10594)\n* Support constraint application for `Base64Etc` types by [@sydney-runkle](https://github.com/sydney-runkle) in [#10584](https://github.com/pydantic/pydantic/pull/10584)\n* Fix `validate_call` ignoring `Field` in `Annotated` by [@kc0506](https://github.com/kc0506) in [#10610](https://github.com/pydantic/pydantic/pull/10610)\n* Raise an error when `Self` is invalid by [@kc0506](https://github.com/kc0506) in [#10609](https://github.com/pydantic/pydantic/pull/10609)\n* Using `core_schema.InvalidSchema` instead of metadata injection + checks by [@sydney-runkle](https://github.com/sydney-runkle) in [#10523](https://github.com/pydantic/pydantic/pull/10523)\n* Tweak type alias logic by [@kc0506](https://github.com/kc0506) in [#10643](https://github.com/pydantic/pydantic/pull/10643)\n* Support usage of `type` with `typing.Self` and type aliases by [@kc0506](https://github.com/kc0506) in [#10621](https://github.com/pydantic/pydantic/pull/10621)\n* Use overloads for `Field` and `PrivateAttr` functions by [@Viicos](https://github.com/Viicos) in [#10651](https://github.com/pydantic/pydantic/pull/10651)\n* Clean up the `mypy` plugin implementation by [@Viicos](https://github.com/Viicos) in [#10669](https://github.com/pydantic/pydantic/pull/10669)\n* Properly check for `typing_extensions` variant of `TypeAliasType` by [@Daraan](https://github.com/Daraan) in [#10713](https://github.com/pydantic/pydantic/pull/10713)\n* Allow any mapping in `BaseModel.model_copy()` by [@Viicos](https://github.com/Viicos) in [#10751](https://github.com/pydantic/pydantic/pull/10751)\n* Fix `isinstance` behavior for urls by [@sydney-runkle](https://github.com/sydney-runkle) in [#10766](https://github.com/pydantic/pydantic/pull/10766)\n* Ensure `cached_property` can be set on Pydantic models by [@Viicos](https://github.com/Viicos) in [#10774](https://github.com/pydantic/pydantic/pull/10774)\n* Fix equality checks for primitives in literals by [@sydney-runkle](https://github.com/sydney-runkle) in [pydantic/pydantic-core#1459](https://github.com/pydantic/pydantic-core/pull/1459)\n* Properly enforce `host_required` for URLs by [@Viicos](https://github.com/Viicos) in [pydantic/pydantic-core#1488](https://github.com/pydantic/pydantic-core/pull/1488)\n* Fix when `coerce_numbers_to_str` enabled and string has invalid Unicode character by [@andrey-berenda](https://github.com/andrey-berenda) in [pydantic/pydantic-core#1515](https://github.com/pydantic/pydantic-core/pull/1515)\n* Fix serializing `complex` values in `Enum`s by [@changhc](https://github.com/changhc) in [pydantic/pydantic-core#1524](https://github.com/pydantic/pydantic-core/pull/1524)\n* Refactor `_typing_extra` module by [@Viicos](https://github.com/Viicos) in [#10725](https://github.com/pydantic/pydantic/pull/10725)\n* Support intuitive equality for urls by [@sydney-runkle](https://github.com/sydney-runkle) in [#10798](https://github.com/pydantic/pydantic/pull/10798)\n* Add `bytearray` to `TypeAdapter.validate_json` signature by [@samuelcolvin](https://github.com/samuelcolvin) in [#10802](https://github.com/pydantic/pydantic/pull/10802)\n* Ensure class access of method descriptors is performed when used as a default with `Field` by [@Viicos](https://github.com/Viicos) in [#10816](https://github.com/pydantic/pydantic/pull/10816)\n* Fix circular import with `validate_call` by [@sydney-runkle](https://github.com/sydney-runkle) in [#10807](https://github.com/pydantic/pydantic/pull/10807)\n* Fix error when using type aliases referencing other type aliases by [@Viicos](https://github.com/Viicos) in [#10809](https://github.com/pydantic/pydantic/pull/10809)\n* Fix `IncEx` type alias to be compatible with mypy by [@Viicos](https://github.com/Viicos) in [#10813](https://github.com/pydantic/pydantic/pull/10813)\n* Make `__signature__` a lazy property, do not deepcopy defaults by [@Viicos](https://github.com/Viicos) in [#10818](https://github.com/pydantic/pydantic/pull/10818)\n* Make `__signature__` lazy for dataclasses, too by [@sydney-runkle](https://github.com/sydney-runkle) in [#10832](https://github.com/pydantic/pydantic/pull/10832)\n* Subclass all single host url classes from `AnyUrl` to preserve behavior from v2.9 by [@sydney-runkle](https://github.com/sydney-runkle) in [#10856](https://github.com/pydantic/pydantic/pull/10856)\n\n### New Contributors\n\n* [@jakob-keller](https://github.com/jakob-keller) made their first contribution in [#10331](https://github.com/pydantic/pydantic/pull/10331)\n* [@MovisLi](https://github.com/MovisLi) made their first contribution in [#10374](https://github.com/pydantic/pydantic/pull/10374)\n* [@joaopalmeiro](https://github.com/joaopalmeiro) made their first contribution in [#10405](https://github.com/pydantic/pydantic/pull/10405)\n* [@theunkn0wn1](https://github.com/theunkn0wn1) made their first contribution in [#10378](https://github.com/pydantic/pydantic/pull/10378)\n* [@cdwilson](https://github.com/cdwilson) made their first contribution in [#10412](https://github.com/pydantic/pydantic/pull/10412)\n* [@dlax](https://github.com/dlax) made their first contribution in [#10421](https://github.com/pydantic/pydantic/pull/10421)\n* [@kschwab](https://github.com/kschwab) made their first contribution in [#10479](https://github.com/pydantic/pydantic/pull/10479)\n* [@santibreo](https://github.com/santibreo) made their first contribution in [#10453](https://github.com/pydantic/pydantic/pull/10453)\n* [@FlorianSW](https://github.com/FlorianSW) made their first contribution in [#10478](https://github.com/pydantic/pydantic/pull/10478)\n* [@tkasuz](https://github.com/tkasuz) made their first contribution in [#10555](https://github.com/pydantic/pydantic/pull/10555)\n* [@AlekseyLobanov](https://github.com/AlekseyLobanov) made their first contribution in [#10601](https://github.com/pydantic/pydantic/pull/10601)\n* [@NiclasvanEyk](https://github.com/NiclasvanEyk) made their first contribution in [#10667](https://github.com/pydantic/pydantic/pull/10667)\n* [@mschoettle](https://github.com/mschoettle) made their first contribution in [#10677](https://github.com/pydantic/pydantic/pull/10677)\n* [@Daraan](https://github.com/Daraan) made their first contribution in [#10713](https://github.com/pydantic/pydantic/pull/10713)\n* [@k4nar](https://github.com/k4nar) made their first contribution in [#10736](https://github.com/pydantic/pydantic/pull/10736)\n* [@UriyaHarpeness](https://github.com/UriyaHarpeness) made their first contribution in [#10740](https://github.com/pydantic/pydantic/pull/10740)\n* [@frfahim](https://github.com/frfahim) made their first contribution in [#10727](https://github.com/pydantic/pydantic/pull/10727)\n\n## v2.10.0b2 (2024-11-13)\n\nPre-release, see [the GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.10.0b2) for details.\n\n## v2.10.0b1 (2024-11-06)\n\nPre-release, see [the GitHub release](https://github.com/pydantic/pydantic/releases/tag/v2.10.0b1) for details.\n\n\n... see [here](https://docs.pydantic.dev/changelog/#v0322-2019-08-17) for earlier changes.\n", - "description_content_type": "text/markdown", - "author_email": "Samuel Colvin , Eric Jolibois , Hasan Ramezani , Adrian Garcia Badaracco <1755071+adriangb@users.noreply.github.com>, Terrence Dorsey , David Montague , Serge Matveenko , Marcelo Trylesinski , Sydney Runkle , David Hewitt , Alex Hall , Victorien Plot ", - "license_expression": "MIT", - "license_file": [ - "LICENSE" - ], - "classifier": [ - "Development Status :: 5 - Production/Stable", - "Framework :: Hypothesis", - "Framework :: Pydantic", - "Intended Audience :: Developers", - "Intended Audience :: Information Technology", - "Operating System :: OS Independent", - "Programming Language :: Python", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - "Programming Language :: Python :: 3.14", - "Programming Language :: Python :: Implementation :: CPython", - "Programming Language :: Python :: Implementation :: PyPy", - "Topic :: Internet", - "Topic :: Software Development :: Libraries :: Python Modules" - ], - "requires_dist": [ - "annotated-types>=0.6.0", - "pydantic-core==2.46.5", - "typing-extensions>=4.14.1", - "typing-inspection>=0.4.2", - "email-validator>=2.0.0; extra == 'email'", - "tzdata; (python_version >= '3.9' and platform_system == 'Windows') and extra == 'timezone'" - ], - "requires_python": ">=3.9", - "project_url": [ - "Homepage, https://github.com/pydantic/pydantic", - "Documentation, https://docs.pydantic.dev", - "Funding, https://github.com/sponsors/samuelcolvin", - "Source, https://github.com/pydantic/pydantic", - "Changelog, https://docs.pydantic.dev/latest/changelog/" - ], - "provides_extra": [ - "email", - "timezone" - ] - } - }, - { - "download_info": { - "url": "https://files.pythonhosted.org/packages/2c/9b/59634b7ac631c63b2a37760eb6943af3e29573d6b59a4abc5e7f019d4cee/pydantic_core-2.46.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "archive_info": { - "hashes": { - "sha256": "54d510bac3ee52247af28ed4bb18a1e799f040ac60fd2bf5ccd4c92f1fbe786f" - }, - "hash": "sha256=54d510bac3ee52247af28ed4bb18a1e799f040ac60fd2bf5ccd4c92f1fbe786f" - } - }, - "is_direct": false, - "is_yanked": false, - "requested": false, - "metadata": { - "metadata_version": "2.4", - "name": "pydantic_core", - "version": "2.46.5", - "summary": "Core functionality for Pydantic validation and serialization", - "description": "# pydantic-core\n\n[![CI](https://github.com/pydantic/pydantic-core/workflows/ci/badge.svg?event=push)](https://github.com/pydantic/pydantic-core/actions?query=event%3Apush+branch%3Amain+workflow%3Aci)\n[![Coverage](https://codecov.io/gh/pydantic/pydantic-core/branch/main/graph/badge.svg)](https://codecov.io/gh/pydantic/pydantic-core)\n[![pypi](https://img.shields.io/pypi/v/pydantic-core.svg)](https://pypi.python.org/pypi/pydantic-core)\n[![versions](https://img.shields.io/pypi/pyversions/pydantic-core.svg)](https://github.com/pydantic/pydantic-core)\n[![license](https://img.shields.io/github/license/pydantic/pydantic-core.svg)](https://github.com/pydantic/pydantic-core/blob/main/LICENSE)\n\nThis package provides the core functionality for [pydantic](https://docs.pydantic.dev) validation and serialization.\n\nPydantic-core is currently around 17x faster than pydantic V1.\nSee [`tests/benchmarks/`](./tests/benchmarks/) for details.\n\n## Example of direct usage\n\n*NOTE: You should not need to use pydantic-core directly; instead, use pydantic, which in turn uses pydantic-core.*\n\n```py\nfrom pydantic_core import SchemaValidator, ValidationError\n\n\nv = SchemaValidator(\n {\n 'type': 'typed-dict',\n 'fields': {\n 'name': {\n 'type': 'typed-dict-field',\n 'schema': {\n 'type': 'str',\n },\n },\n 'age': {\n 'type': 'typed-dict-field',\n 'schema': {\n 'type': 'int',\n 'ge': 18,\n },\n },\n 'is_developer': {\n 'type': 'typed-dict-field',\n 'schema': {\n 'type': 'default',\n 'schema': {'type': 'bool'},\n 'default': True,\n },\n },\n },\n }\n)\n\nr1 = v.validate_python({'name': 'Samuel', 'age': 35})\nassert r1 == {'name': 'Samuel', 'age': 35, 'is_developer': True}\n\n# pydantic-core can also validate JSON directly\nr2 = v.validate_json('{\"name\": \"Samuel\", \"age\": 35}')\nassert r1 == r2\n\ntry:\n v.validate_python({'name': 'Samuel', 'age': 11})\nexcept ValidationError as e:\n print(e)\n \"\"\"\n 1 validation error for model\n age\n Input should be greater than or equal to 18\n [type=greater_than_equal, context={ge: 18}, input_value=11, input_type=int]\n \"\"\"\n```\n\n## Getting Started\n\n### Prerequisites\n\nYou'll need:\n\n1. **[Rust](https://rustup.rs/)** - Rust stable (or nightly for coverage)\n2. **[uv](https://docs.astral.sh/uv/getting-started/installation/)** - Fast Python package manager (will install Python 3.9+ automatically)\n3. **[git](https://git-scm.com/)** - For version control\n4. **[make](https://www.gnu.org/software/make/)** - For running development commands (or use `nmake` on Windows)\n\n### Quick Start\n\n```bash\n# Clone the repository (or from your fork)\ngit clone git@github.com:pydantic/pydantic-core.git\ncd pydantic-core\n\n# Install all dependencies using uv, setup pre-commit hooks, and build the development version\nmake install\n```\n\nVerify your installation by running:\n\n```bash\nmake\n```\n\nThis runs a full development cycle: formatting, building, linting, and testing\n\n### Development Commands\n\nRun `make help` to see all available commands, or use these common ones:\n\n```bash\nmake build-dev # to build the package during development\nmake build-prod # to perform an optimised build for benchmarking\nmake test # to run the tests\nmake testcov # to run the tests and generate a coverage report\nmake lint # to run the linter\nmake format # to format python and rust code\nmake all # to run to run build-dev + format + lint + test\n```\n\n### Useful Resources\n\n* [`python/pydantic_core/_pydantic_core.pyi`](./python/pydantic_core/_pydantic_core.pyi) - Python API types\n* [`python/pydantic_core/core_schema.py`](./python/pydantic_core/core_schema.py) - Core schema definitions\n* [`tests/`](./tests) - Comprehensive usage examples\n\n## Profiling\n\nIt's possible to profile the code using the [`flamegraph` utility from `flamegraph-rs`](https://github.com/flamegraph-rs/flamegraph). (Tested on Linux.) You can install this with `cargo install flamegraph`.\n\nRun `make build-profiling` to install a release build with debugging symbols included (needed for profiling).\n\nOnce that is built, you can profile pytest benchmarks with (e.g.):\n\n```bash\nflamegraph -- pytest tests/benchmarks/test_micro_benchmarks.py -k test_list_of_ints_core_py --benchmark-enable\n```\n\nThe `flamegraph` command will produce an interactive SVG at `flamegraph.svg`.\n\n## Releasing\n\nTBC (needs to be integrated into `pydantic` repository release process).\n\n", - "description_content_type": "text/markdown; charset=UTF-8; variant=GFM", - "home_page": "https://github.com/pydantic/pydantic", - "author_email": "Samuel Colvin , Adrian Garcia Badaracco <1755071+adriangb@users.noreply.github.com>, David Montague , David Hewitt , Sydney Runkle , Victorien Plot ", - "license_expression": "MIT", - "license_file": [ - "LICENSE" - ], - "classifier": [ - "Development Status :: 3 - Alpha", - "Programming Language :: Python", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - "Programming Language :: Python :: 3.14", - "Programming Language :: Python :: Implementation :: CPython", - "Programming Language :: Python :: Implementation :: PyPy", - "Programming Language :: Python :: Implementation :: GraalPy", - "Programming Language :: Rust", - "Framework :: Pydantic", - "Intended Audience :: Developers", - "Intended Audience :: Information Technology", - "Operating System :: POSIX :: Linux", - "Operating System :: Microsoft :: Windows", - "Operating System :: MacOS", - "Typing :: Typed" - ], - "requires_dist": [ - "typing-extensions>=4.14.1" - ], - "requires_python": ">=3.9", - "project_url": [ - "Funding, https://github.com/sponsors/samuelcolvin", - "Homepage, https://github.com/pydantic", - "Source, https://github.com/pydantic/pydantic/tree/main/pydantic-core" - ] - } - }, - { - "download_info": { - "url": "https://files.pythonhosted.org/packages/99/91/8acff4f5e50511b911bbccb72b8628a49c68ce14148cd9f6431094859a90/annotated_types-0.8.0-py3-none-any.whl", - "archive_info": { - "hashes": { - "sha256": "f072f4d804ea359e4eaf198b1af7a8b0943881a87f31bb764f8bf219bb9419e0" - }, - "hash": "sha256=f072f4d804ea359e4eaf198b1af7a8b0943881a87f31bb764f8bf219bb9419e0" - } - }, - "is_direct": false, - "is_yanked": false, - "requested": false, - "metadata": { - "metadata_version": "2.4", - "name": "annotated-types", - "version": "0.8.0", - "summary": "Reusable constraint types to use with typing.Annotated", - "description": "# annotated-types\n\n[![CI](https://github.com/annotated-types/annotated-types/workflows/CI/badge.svg?event=push)](https://github.com/annotated-types/annotated-types/actions?query=event%3Apush+branch%3Amain+workflow%3ACI)\n[![pypi](https://img.shields.io/pypi/v/annotated-types.svg)](https://pypi.python.org/pypi/annotated-types)\n[![versions](https://img.shields.io/pypi/pyversions/annotated-types.svg)](https://github.com/annotated-types/annotated-types)\n[![license](https://img.shields.io/github/license/annotated-types/annotated-types.svg)](https://github.com/annotated-types/annotated-types/blob/main/LICENSE)\n\n[PEP-593](https://peps.python.org/pep-0593/) added `typing.Annotated` as a way of\nadding context-specific metadata to existing types, and specifies that\n`Annotated[T, x]` _should_ be treated as `T` by any tool or library without special\nlogic for `x`.\n\nThis package provides metadata objects which can be used to represent common\nconstraints such as upper and lower bounds on scalar values and collection sizes,\na `Predicate` marker for runtime checks, and\ndescriptions of how we intend these metadata to be interpreted. In some cases,\nwe also note alternative representations which do not require this package.\n\n## Install\n\n```bash\npip install annotated-types\n```\n\n## Examples\n\n```python\nfrom typing import Annotated\nfrom annotated_types import Gt, Len, Predicate\n\nclass MyClass:\n age: Annotated[int, Gt(18)] # Valid: 19, 20, ...\n # Invalid: 17, 18, \"19\", 19.0, ...\n factors: list[Annotated[int, Predicate(is_prime)]] # Valid: 2, 3, 5, 7, 11, ...\n # Invalid: 4, 8, -2, 5.0, \"prime\", ...\n\n my_list: Annotated[list[int], Len(0, 10)] # Valid: [], [10, 20, 30, 40, 50]\n # Invalid: (1, 2), [\"abc\"], [0] * 20\n```\n\n## Documentation\n\n_While `annotated-types` avoids runtime checks for performance, users should not\nconstruct invalid combinations such as `MultipleOf(\"non-numeric\")` or `Annotated[int, Len(3)]`.\nDownstream implementors may choose to raise an error, emit a warning, silently ignore\na metadata item, etc., if the metadata objects described below are used with an\nincompatible type - or for any other reason!_\n\n### Gt, Ge, Lt, Le\n\nExpress inclusive and/or exclusive bounds on orderable values - which may be numbers,\ndates, times, strings, sets, etc. Note that the boundary value need not be of the\nsame type that was annotated, so long as they can be compared: `Annotated[int, Gt(1.5)]`\nis fine, for example, and implies that the value is an integer x such that `x > 1.5`.\n\nWe suggest that implementors may also interpret `functools.partial(operator.le, 1.5)`\nas being equivalent to `Gt(1.5)`, for users who wish to avoid a runtime dependency on\nthe `annotated-types` package.\n\nTo be explicit, these types have the following meanings:\n\n* `Gt(x)` - value must be \"Greater Than\" `x` - equivalent to exclusive minimum\n* `Ge(x)` - value must be \"Greater than or Equal\" to `x` - equivalent to inclusive minimum\n* `Lt(x)` - value must be \"Less Than\" `x` - equivalent to exclusive maximum\n* `Le(x)` - value must be \"Less than or Equal\" to `x` - equivalent to inclusive maximum\n\n### Interval\n\n`Interval(gt, ge, lt, le)` allows you to specify an upper and lower bound with a single\nmetadata object. `None` attributes should be ignored, and non-`None` attributes\ntreated as per the single bounds above.\n\n### MultipleOf\n\n`MultipleOf(multiple_of=x)` might be interpreted in two ways:\n\n1. Python semantics, implying `value % multiple_of == 0`, or\n2. [JSONschema semantics](https://json-schema.org/draft/2020-12/json-schema-validation.html#rfc.section.6.2.1),\n where `int(value / multiple_of) == value / multiple_of`.\n\nWe encourage users to be aware of these two common interpretations and their\ndistinct behaviours, especially since very large or non-integer numbers make\nit easy to cause silent data corruption due to floating-point imprecision.\n\nWe encourage libraries to carefully document which interpretation they implement.\n\n### MinLen, MaxLen, Len\n\n`Len()` implies that `min_length <= len(value) <= max_length` - lower and upper bounds are inclusive.\n\nAs well as `Len()` which can optionally include upper and lower bounds, we also\nprovide `MinLen(x)` and `MaxLen(y)` which are equivalent to `Len(min_length=x)`\nand `Len(max_length=y)` respectively.\n\n`Len`, `MinLen`, and `MaxLen` may be used with any type which supports `len(value)`.\n\nExamples of usage:\n\n* `Annotated[list, MaxLen(10)]` (or `Annotated[list, Len(max_length=10)]`) - list must have a length of 10 or less\n* `Annotated[str, MaxLen(10)]` - string must have a length of 10 or less\n* `Annotated[list, MinLen(3)]` (or `Annotated[list, Len(min_length=3)]`) - list must have a length of 3 or more\n* `Annotated[list, Len(4, 6)]` - list must have a length of 4, 5, or 6\n* `Annotated[list, Len(8, 8)]` - list must have a length of exactly 8\n\n#### Changed in v0.4.0\n\n* `min_inclusive` has been renamed to `min_length`, no change in meaning\n* `max_exclusive` has been renamed to `max_length`, upper bound is now **inclusive** instead of **exclusive**\n* The recommendation that slices are interpreted as `Len` has been removed due to ambiguity and different semantic\n meaning of the upper bound in slices vs. `Len`\n\nSee [issue #23](https://github.com/annotated-types/annotated-types/issues/23) for discussion.\n\n### Timezone\n\n`Timezone` can be used with a `datetime` or a `time` to express which timezones\nare allowed. `Annotated[datetime, Timezone(None)]` must be a naive datetime.\n`Timezone[...]` ([literal ellipsis](https://docs.python.org/3/library/constants.html#Ellipsis))\nexpresses that any timezone-aware datetime is allowed. You may also pass a specific\ntimezone string or [`tzinfo`](https://docs.python.org/3/library/datetime.html#tzinfo-objects)\nobject such as `Timezone(timezone.utc)` or `Timezone(\"Africa/Abidjan\")` to express that you only\nallow a specific timezone, though we note that this is often a symptom of fragile design.\n\n#### Changed in v0.x.x\n\n* `Timezone` accepts [`tzinfo`](https://docs.python.org/3/library/datetime.html#tzinfo-objects) objects instead of\n `timezone`, extending compatibility to [`zoneinfo`](https://docs.python.org/3/library/zoneinfo.html) and third party libraries.\n\n### Unit\n\n`Unit(unit: str)` expresses that the annotated numeric value is the magnitude of\na quantity with the specified unit. For example, `Annotated[float, Unit(\"m/s\")]`\nwould be a float representing a velocity in meters per second.\n\nPlease note that `annotated_types` itself makes no attempt to parse or validate\nthe unit string in any way. That is left entirely to downstream libraries,\nsuch as [`pint`](https://pint.readthedocs.io) or\n[`astropy.units`](https://docs.astropy.org/en/stable/units/).\n\nAn example of how a library might use this metadata:\n\n```python\nfrom annotated_types import Unit\nfrom typing import Annotated, TypeVar, Callable, Any, get_origin, get_args\n\n# given a type annotated with a unit:\nMeters = Annotated[float, Unit(\"m\")]\n\n\n# you can cast the annotation to a specific unit type with any\n# callable that accepts a string and returns the desired type\nT = TypeVar(\"T\")\ndef cast_unit(tp: Any, unit_cls: Callable[[str], T]) -> T | None:\n if get_origin(tp) is Annotated:\n for arg in get_args(tp):\n if isinstance(arg, Unit):\n return unit_cls(arg.unit)\n return None\n\n\n# using `pint`\nimport pint\npint_unit = cast_unit(Meters, pint.Unit)\n\n\n# using `astropy.units`\nimport astropy.units as u\nastropy_unit = cast_unit(Meters, u.Unit)\n```\n\n### Predicate\n\n`Predicate(func: Callable)` expresses that `func(value)` is truthy for valid values.\nUsers should prefer the statically inspectable metadata above, but if you need\nthe full power and flexibility of arbitrary runtime predicates... here it is.\n\nFor some common constraints, we provide generic types:\n\n* `LowerCase = Annotated[T, Predicate(str.islower)]`\n* `UpperCase = Annotated[T, Predicate(str.isupper)]`\n* `IsDigit = Annotated[T, Predicate(str.isdigit)]`\n* `IsFinite = Annotated[T, Predicate(math.isfinite)]`\n* `IsNotFinite = Annotated[T, Predicate(Not(math.isfinite))]`\n* `IsNan = Annotated[T, Predicate(math.isnan)]`\n* `IsNotNan = Annotated[T, Predicate(Not(math.isnan))]`\n* `IsInfinite = Annotated[T, Predicate(math.isinf)]`\n* `IsNotInfinite = Annotated[T, Predicate(Not(math.isinf))]`\n\nso that you can write e.g. `x: IsFinite[float] = 2.0` instead of the longer\n(but exactly equivalent) `x: Annotated[float, Predicate(math.isfinite)] = 2.0`.\n\nSome libraries might have special logic to handle known or understandable predicates,\nfor example by checking for `str.isdigit` and using its presence to both call custom\nlogic to enforce digit-only strings, and customise some generated external schema.\nUsers are therefore encouraged to avoid indirection like `lambda s: s.lower()`, in\nfavor of introspectable methods such as `str.lower` or `re.compile(\"pattern\").search`.\n\nTo enable basic negation of commonly used predicates like `math.isnan` without introducing introspection that makes it impossible for implementers to introspect the predicate we provide a `Not` wrapper that simply negates the predicate in an introspectable manner. Several of the predicates listed above are created in this manner.\n\nWe do not specify what behaviour should be expected for predicates that raise\nan exception. For example `Annotated[int, Predicate(str.isdigit)]` might silently\nskip invalid constraints, or statically raise an error; or it might try calling it\nand then propagate or discard the resulting\n`TypeError: descriptor 'isdigit' for 'str' objects doesn't apply to a 'int' object`\nexception. We encourage libraries to document the behaviour they choose.\n\n### Doc\n\n`doc()` can be used to add documentation information in `Annotated`, for function and method parameters, variables, class attributes, return types, and any place where `Annotated` can be used.\n\nIt expects a value that can be statically analyzed, as the main use case is for static analysis, editors, documentation generators, and similar tools.\n\nIt returns a `DocInfo` class with a single attribute `documentation` containing the value passed to `doc()`.\n\nThis is the early adopter's alternative form of the [`typing-doc` proposal](https://github.com/tiangolo/fastapi/blob/typing-doc/typing_doc.md).\n\n### Integrating downstream types with `GroupedMetadata`\n\nImplementers may choose to provide a convenience wrapper that groups multiple pieces of metadata.\nThis can help reduce verbosity and cognitive overhead for users.\nFor example, an implementer like Pydantic might provide a `Field` or `Meta` type that accepts keyword arguments and transforms these into low-level metadata:\n\n```python\nfrom dataclasses import dataclass\nfrom typing import Iterator\nfrom annotated_types import GroupedMetadata, Ge\n\n@dataclass\nclass Field(GroupedMetadata):\n ge: int | None = None\n description: str | None = None\n\n def __iter__(self) -> Iterator[object]:\n # Iterating over a GroupedMetadata object should yield annotated-types\n # constraint metadata objects which describe it as fully as possible,\n # and may include other unknown objects too.\n if self.ge is not None:\n yield Ge(self.ge)\n if self.description is not None:\n yield Description(self.description)\n```\n\nLibraries consuming annotated-types constraints should check for `GroupedMetadata` and unpack it by iterating over the object and treating the results as if they had been \"unpacked\" in the `Annotated` type. The same logic should be applied to the [PEP 646 `Unpack` type](https://peps.python.org/pep-0646/), so that `Annotated[T, Field(...)]`, `Annotated[T, Unpack[Field(...)]]` and `Annotated[T, *Field(...)]` are all treated consistently.\n\nLibraries consuming annotated-types should also ignore any metadata they do not recongize that came from unpacking a `GroupedMetadata`, just like they ignore unrecognized metadata in `Annotated` itself.\n\nOur own `annotated_types.Interval` class is a `GroupedMetadata` which unpacks itself into `Gt`, `Lt`, etc., so this is not an abstract concern. Similarly, `annotated_types.Len` is a `GroupedMetadata` which unpacks itself into `MinLen` (optionally) and `MaxLen`.\n\n### Consuming metadata\n\nWe intend to not be prescriptive as to _how_ the metadata and constraints are used, but as an example of how one might parse constraints from types annotations see our [implementation in `test_main.py`](https://github.com/annotated-types/annotated-types/blob/f59cf6d1b5255a0fe359b93896759a180bec30ae/tests/test_main.py#L94-L103).\n\nIt is up to the implementer to determine how this metadata is used.\nYou could use the metadata for runtime type checking, for generating schemas or to generate example data, amongst other use cases.\n\n## Design & History\n\nThis package was designed at the PyCon 2022 sprints by the maintainers of Pydantic\nand Hypothesis, with the goal of making it as easy as possible for end-users to\nprovide more informative annotations for use by runtime libraries.\n\nIt is deliberately minimal, and following PEP-593 allows considerable downstream\ndiscretion in what (if anything!) they choose to support. Nonetheless, we expect\nthat staying simple and covering _only_ the most common use-cases will give users\nand maintainers the best experience we can. If you'd like more constraints for your\ntypes - follow our lead, by defining them and documenting them downstream!\n", - "description_content_type": "text/markdown", - "author_email": "Adrian Garcia Badaracco <1755071+adriangb@users.noreply.github.com>, Samuel Colvin , Zac Hatfield-Dodds ", - "license_expression": "MIT", - "license_file": [ - "LICENSE" - ], - "classifier": [ - "Development Status :: 4 - Beta", - "Environment :: Console", - "Environment :: MacOS X", - "Intended Audience :: Developers", - "Intended Audience :: Information Technology", - "License :: OSI Approved :: MIT License", - "Operating System :: POSIX :: Linux", - "Operating System :: Unix", - "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - "Programming Language :: Python :: 3.14", - "Topic :: Software Development :: Libraries :: Python Modules", - "Typing :: Typed" - ], - "requires_python": ">=3.10", - "project_url": [ - "Homepage, https://github.com/annotated-types/annotated-types", - "Source, https://github.com/annotated-types/annotated-types", - "Changelog, https://github.com/annotated-types/annotated-types/releases" - ] - } - }, - { - "download_info": { - "url": "https://files.pythonhosted.org/packages/95/9c/c510029fc6ef33a6275cd2c5d3cecd6613dfd6aa401d57c54f1c18852ccf/setuptools-84.0.0-py3-none-any.whl", - "archive_info": { - "hashes": { - "sha256": "51a52592b3b99e102b609654876bd65f19f999935166d1352678931132b0c670" - }, - "hash": "sha256=51a52592b3b99e102b609654876bd65f19f999935166d1352678931132b0c670" - } - }, - "is_direct": false, - "is_yanked": false, - "requested": false, - "metadata": { - "metadata_version": "2.4", - "name": "setuptools", - "version": "84.0.0", - "dynamic": [ - "license-file" - ], - "summary": "Most extensible Python build backend with support for C/C++ extension modules", - "description": ".. |pypi-version| image:: https://img.shields.io/pypi/v/setuptools.svg\n :target: https://pypi.org/project/setuptools\n\n.. |py-version| image:: https://img.shields.io/pypi/pyversions/setuptools.svg\n\n.. |test-badge| image:: https://github.com/pypa/setuptools/actions/workflows/main.yml/badge.svg\n :target: https://github.com/pypa/setuptools/actions?query=workflow%3A%22tests%22\n :alt: tests\n\n.. |ruff-badge| image:: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/charliermarsh/ruff/main/assets/badge/v2.json\n :target: https://github.com/astral-sh/ruff\n :alt: Ruff\n\n.. |docs-badge| image:: https://img.shields.io/readthedocs/setuptools/latest.svg\n :target: https://setuptools.pypa.io\n\n.. |skeleton-badge| image:: https://img.shields.io/badge/skeleton-2026-informational\n :target: https://blog.jaraco.com/skeleton\n\n.. |codecov-badge| image:: https://img.shields.io/codecov/c/github/pypa/setuptools/master.svg?logo=codecov&logoColor=white\n :target: https://codecov.io/gh/pypa/setuptools\n\n.. |tidelift-badge| image:: https://tidelift.com/badges/github/pypa/setuptools?style=flat\n :target: https://tidelift.com/subscription/pkg/pypi-setuptools?utm_source=pypi-setuptools&utm_medium=readme\n\n.. |discord-badge| image:: https://img.shields.io/discord/803025117553754132\n :target: https://discord.com/channels/803025117553754132/815945031150993468\n :alt: Discord\n\n|pypi-version| |py-version| |test-badge| |ruff-badge| |docs-badge| |skeleton-badge| |codecov-badge| |discord-badge|\n\nSee the `Quickstart `_\nand the `User's Guide `_ for\ninstructions on how to use Setuptools.\n\nQuestions and comments should be directed to `GitHub Discussions\n`_.\nBug reports and especially tested patches may be\nsubmitted directly to the `bug tracker\n`_.\n\n\nCode of Conduct\n===============\n\nEveryone interacting in the setuptools project's codebases, issue trackers,\nchat rooms, and fora is expected to follow the\n`PSF Code of Conduct `_.\n\n\nFor Enterprise\n==============\n\nAvailable as part of the Tidelift Subscription.\n\nSetuptools and the maintainers of thousands of other packages are working with Tidelift to deliver one enterprise subscription that covers all of the open source you use.\n\n`Learn more `_.\n", - "description_content_type": "text/x-rst", - "keywords": [ - "CPAN", - "PyPI", - "distutils", - "eggs", - "package", - "management" - ], - "author_email": "Python Packaging Authority ", - "license_expression": "MIT", - "license_file": [ - "LICENSE" - ], - "classifier": [ - "Development Status :: 5 - Production/Stable", - "Intended Audience :: Developers", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3 :: Only", - "Topic :: Software Development :: Libraries :: Python Modules", - "Topic :: System :: Archiving :: Packaging", - "Topic :: System :: Systems Administration", - "Topic :: Utilities" - ], - "requires_dist": [ - "pytest!=8.1.*,>=6; extra == \"test\"", - "virtualenv>=13.0.0; extra == \"test\"", - "wheel>=0.44.0; extra == \"test\"", - "pip>=19.1; extra == \"test\"", - "packaging>=24.2; extra == \"test\"", - "jaraco.envs>=2.2; extra == \"test\"", - "pytest-xdist>=3; extra == \"test\"", - "jaraco.path>=3.7.2; extra == \"test\"", - "build[virtualenv]>=1.0.3; extra == \"test\"", - "filelock>=3.4.0; extra == \"test\"", - "ini2toml[lite]>=0.14; extra == \"test\"", - "tomli-w>=1.0.0; extra == \"test\"", - "pytest-timeout; extra == \"test\"", - "pytest-perf; sys_platform != \"cygwin\" and extra == \"test\"", - "jaraco.develop>=7.21; (python_version >= \"3.9\" and sys_platform != \"cygwin\") and extra == \"test\"", - "pytest-home>=0.5; extra == \"test\"", - "pytest-subprocess; extra == \"test\"", - "pyproject-hooks!=1.1; extra == \"test\"", - "jaraco.test>=5.5; extra == \"test\"", - "sphinx>=3.5; extra == \"doc\"", - "jaraco.packaging>=9.3; extra == \"doc\"", - "rst.linker>=1.9; extra == \"doc\"", - "furo; extra == \"doc\"", - "sphinx-lint; extra == \"doc\"", - "jaraco.tidelift>=1.4; extra == \"doc\"", - "pygments-github-lexers==0.0.5; extra == \"doc\"", - "sphinx-favicon; extra == \"doc\"", - "sphinx-inline-tabs; extra == \"doc\"", - "sphinx-reredirects; extra == \"doc\"", - "sphinxcontrib-towncrier; extra == \"doc\"", - "sphinx-notfound-page<2,>=1; extra == \"doc\"", - "pyproject-hooks!=1.1; extra == \"doc\"", - "towncrier<24.7; extra == \"doc\"", - "packaging>=24.2; extra == \"core\"", - "more_itertools>=8.8; extra == \"core\"", - "jaraco.text>=3.7; extra == \"core\"", - "importlib_metadata>=6; python_version < \"3.10\" and extra == \"core\"", - "tomli>=2.0.1; python_version < \"3.11\" and extra == \"core\"", - "wheel>=0.43.0; extra == \"core\"", - "jaraco.functools>=4; extra == \"core\"", - "more_itertools; extra == \"core\"", - "pytest-checkdocs>=2.14; extra == \"check\"", - "pytest-ruff>=0.2.1; sys_platform != \"cygwin\" and extra == \"check\"", - "ruff>=0.13.0; sys_platform != \"cygwin\" and extra == \"check\"", - "pytest-cov; extra == \"cover\"", - "pytest-enabler>=3.4; extra == \"enabler\"", - "pytest-mypy>=1.0.1; platform_python_implementation != \"PyPy\" and extra == \"type\"", - "mypy==1.18.*; extra == \"type\"", - "importlib_metadata>=7.0.2; python_version < \"3.10\" and extra == \"type\"", - "jaraco.develop>=7.21; sys_platform != \"cygwin\" and extra == \"type\"" - ], - "requires_python": ">=3.10", - "project_url": [ - "Source, https://github.com/pypa/setuptools", - "Documentation, https://setuptools.pypa.io/", - "Changelog, https://setuptools.pypa.io/en/stable/history.html" - ], - "provides_extra": [ - "test", - "doc", - "ssl", - "certs", - "core", - "check", - "cover", - "enabler", - "type" - ] - } - }, - { - "download_info": { - "url": "https://files.pythonhosted.org/packages/4e/d6/1ec1b290f9e0fb067899b61e1d37a30c923068bad260b216dbe37a7d2967/starlette-1.7.0-py3-none-any.whl", - "archive_info": { - "hashes": { - "sha256": "67f8e99895493dd2911a03f11314af6ceebeae4e704bb9f43dfc6a9db151c93e" - }, - "hash": "sha256=67f8e99895493dd2911a03f11314af6ceebeae4e704bb9f43dfc6a9db151c93e" - } - }, - "is_direct": false, - "is_yanked": false, - "requested": false, - "metadata": { - "metadata_version": "2.5", - "name": "starlette", - "version": "1.7.0", - "summary": "The little ASGI library that shines.", - "description": "

\n \n \n \n \"starlette-logo\"\n \n

\n\n

\n ✨ The little ASGI framework that shines. ✨\n

\n\n---\n\n[![Build Status](https://github.com/Kludex/starlette/workflows/Test%20Suite/badge.svg)](https://github.com/Kludex/starlette/actions)\n[![Package version](https://badge.fury.io/py/starlette.svg)](https://pypi.python.org/pypi/starlette)\n[![Supported Python Version](https://img.shields.io/pypi/pyversions/starlette.svg?color=%2334D058)](https://pypi.org/project/starlette)\n[![Discord](https://img.shields.io/discord/1051468649518616576?logo=discord&logoColor=ffffff&color=7389D8&labelColor=6A7EC2)](https://discord.gg/RxKUF5JuHs)\n\n---\n\n**Documentation**: https://starlette.dev\n\n**Source Code**: https://github.com/Kludex/starlette\n\n---\n\n# Starlette\n\nStarlette is a lightweight [ASGI][asgi] framework/toolkit,\nwhich is ideal for building async web services in Python.\n\nIt is production-ready, and gives you the following:\n\n* A lightweight, low-complexity HTTP web framework.\n* WebSocket support.\n* In-process background tasks.\n* Startup and shutdown events.\n* Test client built on `httpx2`.\n* CORS, GZip, Static Files, Streaming responses.\n* Session and Cookie support.\n* 100% test coverage.\n* 100% type annotated codebase.\n* Few hard dependencies.\n* Compatible with `asyncio` and `trio` backends.\n* Great overall performance [against independent benchmarks][techempower].\n\n## Installation\n\n```shell\n$ pip install starlette\n```\n\nYou'll also want to install an ASGI server, such as [uvicorn](https://uvicorn.dev) or any of the [other ASGI server implementations](https://asgi.readthedocs.io/en/latest/implementations.html#servers).\n\n```shell\n$ pip install uvicorn\n```\n\n## Example\n\n```python title=\"main.py\"\nfrom starlette.applications import Starlette\nfrom starlette.responses import JSONResponse\nfrom starlette.routing import Route\n\n\nasync def homepage(request):\n return JSONResponse({'hello': 'world'})\n\nroutes = [\n Route(\"/\", endpoint=homepage)\n]\n\napp = Starlette(debug=True, routes=routes)\n```\n\nThen run the application using Uvicorn:\n\n```shell\n$ uvicorn main:app\n```\n\n## Dependencies\n\nStarlette only requires `anyio`, and the following are optional:\n\n* [`httpx2`][httpx2] - Required if you want to use the `TestClient`.\n* [`jinja2`][jinja2] - Required if you want to use `Jinja2Templates`.\n* [`opentelemetry-api`][opentelemetry-api] - Required for `OpenTelemetryMiddleware`.\n* [`python-multipart`][python-multipart] - Required if you want to support form parsing, with `request.form()`.\n* [`itsdangerous`][itsdangerous] - Required for `SessionMiddleware` support.\n* [`pyyaml`][pyyaml] - Required for `SchemaGenerator` support.\n\nYou can install all of these with `pip install starlette[full]`.\n\n## Framework or Toolkit\n\nStarlette is designed to be used either as a complete framework, or as\nan ASGI toolkit. You can use any of its components independently.\n\n```python\nfrom starlette.responses import PlainTextResponse\n\n\nasync def app(scope, receive, send):\n assert scope['type'] == 'http'\n response = PlainTextResponse('Hello, world!')\n await response(scope, receive, send)\n```\n\nRun the `app` application in `example.py`:\n\n```shell\n$ uvicorn example:app\nINFO: Started server process [11509]\nINFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)\n```\n\nRun uvicorn with `--reload` to enable auto-reloading on code changes.\n\n## Modularity\n\nThe modularity that Starlette is designed on promotes building reusable\ncomponents that can be shared between any ASGI framework. This should enable\nan ecosystem of shared middleware and mountable applications.\n\nThe clean API separation also means it's easier to understand each component\nin isolation.\n\n---\n\n

Starlette is BSD licensed code.
Designed & crafted with care.

— ⭐️ —

\n\n[asgi]: https://asgi.readthedocs.io/en/latest/\n[httpx2]: https://pypi.org/project/httpx2/\n[jinja2]: https://jinja.palletsprojects.com/\n[opentelemetry-api]: https://opentelemetry.io/docs/languages/python/api/\n[python-multipart]: https://multipart.fastapiexpert.com/\n[itsdangerous]: https://itsdangerous.palletsprojects.com/\n[sqlalchemy]: https://www.sqlalchemy.org\n[pyyaml]: https://pyyaml.org/wiki/PyYAMLDocumentation\n[techempower]: https://github.com/TechEmpower/FrameworkBenchmarks\n", - "description_content_type": "text/markdown", - "author_email": "Tom Christie ", - "maintainer_email": "Marcelo Trylesinski ", - "license_expression": "BSD-3-Clause", - "license_file": [ - "LICENSE.md" - ], - "classifier": [ - "Development Status :: 3 - Alpha", - "Environment :: Web Environment", - "Framework :: AnyIO", - "Intended Audience :: Developers", - "Operating System :: OS Independent", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - "Programming Language :: Python :: 3.14", - "Programming Language :: Python :: 3.15", - "Topic :: Internet :: WWW/HTTP" - ], - "requires_dist": [ - "anyio<5,>=4.0.0", - "typing-extensions>=4.10.0; python_version < '3.13'", - "httpx2>=2.0.0; extra == 'full'", - "httpx<0.29.0,>=0.27.0; extra == 'full'", - "itsdangerous; extra == 'full'", - "jinja2; extra == 'full'", - "opentelemetry-api; extra == 'full'", - "python-multipart>=0.0.18; extra == 'full'", - "pyyaml; extra == 'full'" - ], - "requires_python": ">=3.10", - "project_url": [ - "Homepage, https://github.com/Kludex/starlette", - "Documentation, https://starlette.dev/", - "Changelog, https://starlette.dev/release-notes/", - "Funding, https://github.com/sponsors/Kludex", - "Source, https://github.com/Kludex/starlette" - ], - "provides_extra": [ - "full" - ] - } - }, - { - "download_info": { - "url": "https://files.pythonhosted.org/packages/12/b8/4bd346e22b28902df4d651910f5242c28d84e4a5c2435ca5c3f797ed7e2e/anyio-4.15.1-py3-none-any.whl", - "archive_info": { - "hashes": { - "sha256": "6152fdbbf9a77fdec97731721bebf7c4c44f7c29b424b0065826173efc7ed101" - }, - "hash": "sha256=6152fdbbf9a77fdec97731721bebf7c4c44f7c29b424b0065826173efc7ed101" - } - }, - "is_direct": false, - "is_yanked": false, - "requested": false, - "metadata": { - "metadata_version": "2.4", - "name": "anyio", - "version": "4.15.1", - "dynamic": [ - "license-file" - ], - "summary": "High-level concurrency and networking framework on top of asyncio or Trio", - "description": ".. image:: https://github.com/agronholm/anyio/actions/workflows/test.yml/badge.svg\n :target: https://github.com/agronholm/anyio/actions/workflows/test.yml\n :alt: Build Status\n.. image:: https://coveralls.io/repos/github/agronholm/anyio/badge.svg?branch=master\n :target: https://coveralls.io/github/agronholm/anyio?branch=master\n :alt: Code Coverage\n.. image:: https://readthedocs.org/projects/anyio/badge/?version=latest\n :target: https://anyio.readthedocs.io/en/latest/?badge=latest\n :alt: Documentation\n.. image:: https://badges.gitter.im/gitterHQ/gitter.svg\n :target: https://gitter.im/python-trio/AnyIO\n :alt: Gitter chat\n.. image:: https://tidelift.com/badges/package/pypi/anyio\n :target: https://tidelift.com/subscription/pkg/pypi-anyio\n :alt: Tidelift\n\nAnyIO is an asynchronous networking and concurrency library that works on top of either asyncio_ or\nTrio_. It implements Trio-like `structured concurrency`_ (SC) on top of asyncio and works in harmony\nwith the native SC of Trio itself.\n\nApplications and libraries written against AnyIO's API will run unmodified on either asyncio_ or\nTrio_. AnyIO can also be adopted into a library or application incrementally – bit by bit, no full\nrefactoring necessary. It will blend in with the native libraries of your chosen backend.\n\nTo find out why you might want to use AnyIO's APIs instead of asyncio's, you can read about it\n`here `_.\n\nDocumentation\n-------------\n\nView full documentation at: https://anyio.readthedocs.io/\n\nFeatures\n--------\n\nAnyIO offers the following functionality:\n\n* Task groups (nurseries_ in trio terminology)\n* High-level networking (TCP, UDP and UNIX sockets)\n\n * `Happy eyeballs`_ algorithm for TCP connections (more robust than that of asyncio on Python\n 3.8)\n * async/await style UDP sockets (unlike asyncio where you still have to use Transports and\n Protocols)\n\n* A versatile API for byte streams and object streams\n* Inter-task synchronization and communication (locks, conditions, events, semaphores, object\n streams and futures)\n* Worker threads\n* Subprocesses\n* Subinterpreter support for code parallelization (on Python 3.13 and later)\n* Asynchronous file I/O (using worker threads)\n* Signal handling\n* Asynchronous versions of the functools_ and itertools_ modules\n\nAnyIO also comes with its own pytest_ plugin which also supports asynchronous fixtures.\nIt even works with the popular Hypothesis_ library.\n\n.. _asyncio: https://docs.python.org/3/library/asyncio.html\n.. _Trio: https://github.com/python-trio/trio\n.. _structured concurrency: https://en.wikipedia.org/wiki/Structured_concurrency\n.. _nurseries: https://trio.readthedocs.io/en/stable/reference-core.html#nurseries-and-spawning\n.. _Happy eyeballs: https://en.wikipedia.org/wiki/Happy_Eyeballs\n.. _pytest: https://docs.pytest.org/en/latest/\n.. _functools: https://docs.python.org/3/library/functools.html\n.. _itertools: https://docs.python.org/3/library/itertools.html\n.. _Hypothesis: https://hypothesis.works/\n\nSecurity contact information\n----------------------------\n\nTo report a security vulnerability, please use the `Tidelift security contact`_.\nTidelift will coordinate the fix and disclosure.\n\n.. _Tidelift security contact: https://tidelift.com/security\n", - "description_content_type": "text/x-rst", - "author_email": "Alex Grönholm ", - "license_expression": "MIT", - "license_file": [ - "LICENSE" - ], - "classifier": [ - "Development Status :: 5 - Production/Stable", - "Intended Audience :: Developers", - "Framework :: AnyIO", - "Typing :: Typed", - "Programming Language :: Python", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - "Programming Language :: Python :: 3.14", - "Programming Language :: Python :: 3.15", - "Programming Language :: Python :: Free Threading :: 2 - Beta" - ], - "requires_dist": [ - "exceptiongroup>=1.0.2; python_version < \"3.11\"", - "idna>=2.8", - "typing_extensions>=4.16.0; python_version < \"3.15\"", - "trio>=0.32.0; extra == \"trio\"" - ], - "requires_python": ">=3.10", - "project_url": [ - "Documentation, https://anyio.readthedocs.io/en/latest/", - "Changelog, https://anyio.readthedocs.io/en/stable/versionhistory.html", - "Source code, https://github.com/agronholm/anyio", - "Issue tracker, https://github.com/agronholm/anyio/issues" - ], - "provides_extra": [ - "trio" - ] - } - }, - { - "download_info": { - "url": "https://files.pythonhosted.org/packages/58/a2/bb081bab032533a855d44de1d56f8e8426114ff1ba5d1f07a438a0a654f8/idna-3.20-py3-none-any.whl", - "archive_info": { - "hashes": { - "sha256": "ab7ae7122974553370f0bdb919e1a960b2cd1bc1ef0276416d896db81c14582c" - }, - "hash": "sha256=ab7ae7122974553370f0bdb919e1a960b2cd1bc1ef0276416d896db81c14582c" - } - }, - "is_direct": false, - "is_yanked": false, - "requested": false, - "metadata": { - "metadata_version": "2.5", - "name": "idna", - "version": "3.20", - "summary": "Internationalized Domain Names in Applications (IDNA)", - "description": "# Internationalized Domain Names in Applications (IDNA)\n\nSupport for [Internationalized Domain Names in Applications\n(IDNA)](https://tools.ietf.org/html/rfc5891) and [Unicode IDNA\nCompatibility Processing](https://unicode.org/reports/tr46/). It\nsupersedes the standard library's `encodings.idna`, which only\nimplements the 2003 specification, offering broader script coverage and\nlimiting domains with known security vulnerabilities.\n\n## Usage\n\nPackage may be installed from [PyPI](https://pypi.org/project/idna/) via\nthe typical methods (e.g. `python3 -m pip install idna`)\n\nFor typical usage, the `encode` and `decode` functions will take a\ndomain name argument and perform a conversion to ASCII-compatible encoding\n(known as A-labels), or to Unicode strings (known as U-labels)\nrespectively.\n\n```pycon\n>>> import idna\n>>> idna.encode('ドメイン.テスト')\nb'xn--eckwd4c7c.xn--zckzah'\n>>> print(idna.decode('xn--eckwd4c7c.xn--zckzah'))\nドメイン.テスト\n```\n\nConversions can be applied at a per-label basis using the `ulabel` or\n`alabel` functions for specialized use cases.\n\n\n### Compatibility Mapping (UTS #46)\n\nThis library provides support for [Unicode IDNA Compatibility\nProcessing](https://unicode.org/reports/tr46/) which normalizes input from\ndifferent potential ways a user may input a domain prior to performing the IDNA\nconversion operations. This functionality, known as a\n[mapping](https://tools.ietf.org/html/rfc5895), is considered by the\nspecification to be a local user-interface issue distinct from IDNA\nconversion functionality.\n\nFor example, \"Königsgäßchen\" is not a permissible label as capital letters\nare not allowed. UTS #46 will convert this into lower case prior to applying\nthe IDNA conversion.\n\n```pycon\n>>> import idna\n>>> idna.encode('Königsgäßchen')\n...\nidna.core.InvalidCodepoint: Codepoint U+004B at position 1 of 'Königsgäßchen' not allowed\n>>> idna.encode('Königsgäßchen', uts46=True)\nb'xn--knigsgchen-b4a3dun'\n>>> idna.decode('xn--knigsgchen-b4a3dun')\n'königsgäßchen'\n```\n\nWhen performing a decode operation for display purposes, `decode()`\naccepts a `display=True` argument that leaves any `xn--` label that\nfails to decode unchanged. This is useful for user interface display\nwhere a domain is in use, the A-label form can be presented when it\nis not a valid IDN.\n\n\n## Exceptions\n\nAll errors raised during conversion derive from the `idna.IDNAError`\nbase class. The more specific exceptions are:\n\n* `idna.IDNABidiError` — raised when a label contains an illegal\n combination of left-to-right and right-to-left characters.\n* `idna.InvalidCodepoint` — raised when a label contains a codepoint\n that is INVALID for IDNA.\n* `idna.InvalidCodepointContext` — raised when a CONTEXTO or CONTEXTJ\n codepoint appears in a position whose contextual requirements are\n not satisfied.\n\nExceptions carry machine-readable attributes so that applications do\nnot need to parse the message: `code` is a short, stable identifier\nfor the rule that failed (such as `disallowed_codepoint` or\n`label_too_long`); and, when the failure can be attributed to a\nparticular character, `text` (the label or domain being validated),\n`codepoint` (the offending codepoint as an integer) and `position`\nare set. \n\n\n## Command-line tool\n\nThe package supports command-line usage to convert domain names\nbetween their Unicode and ASCII-compatible forms. It can be run either\nas a module (`python3 -m idna`) or, once installed (such as with `uv\ntool` or `pipx`), via the `idna` script:\n\n```bash\n$ uv tool install idna\n$ idna xn--e1afmkfd.xn--p1ai\nпример.рф\n$ idna пример.рф\nxn--e1afmkfd.xn--p1ai\n```\n\nMode can be specified with `-e`/`--encode` or `-d`/`--decode`, otherwise\nit will be chosen automatically based on the first input. Multiple\ndomains can be supplied either as arguments or through standard input.\nUTS #46 mapping is applied by default, which lets the tool accept\ninputs that aren't strictly valid IDNA 2008 by normalising them first,\npass `--strict` to disable UTS #46.\n\nConversion failures are reported on stderr together with the\noffending input; processing continues with the remaining domains and\nthe tool exits with a non-zero status if any conversion failed.\n\n\n## Additional Notes\n\n* **Python version support**. This library supports Python 3.9 and higher.\n As this library serves as a low-level toolkit for a variety of\n applications, we strive to support all versions of Python that are\n not beyond end-of-life. Free-threaded Python is also supported,\n as the library holds no mutable global state the functions can be\n called concurrently from multiple threads.\n\n* **Unicode version**. The IDNA and UTS #46 lookup tables are generated\n from a specific Unicode release. Some Unicode data depends on the\n running Python's `unicodedata` module, so on an older Python a\n character new to Unicode may be rejected as unknown even if this\n library knows about it.\n\n* **Emoji**. It is an occasional request to support emoji domains in\n this library. Encoding of symbols like emoji is expressly prohibited by\n the IDNA technical standard, and emoji domains are broadly phased\n out across the domain industry due to associated security risks.\n\n* **Regenerating lookup tables**. The IDNA and UTS #46 functionality\n relies upon pre-calculated lookup tables, generated using the\n `idna-data` script in [`tools/`](tools/README.md).\n\n", - "description_content_type": "text/markdown", - "author_email": "Kim Davies ", - "license_expression": "BSD-3-Clause", - "license_file": [ - "LICENSE.md" - ], - "classifier": [ - "Development Status :: 5 - Production/Stable", - "Intended Audience :: Developers", - "Intended Audience :: System Administrators", - "Operating System :: OS Independent", - "Programming Language :: Python", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - "Programming Language :: Python :: 3.14", - "Programming Language :: Python :: 3.15", - "Programming Language :: Python :: Implementation :: CPython", - "Programming Language :: Python :: Implementation :: PyPy", - "Topic :: Internet :: Name Service (DNS)", - "Topic :: Software Development :: Libraries :: Python Modules", - "Topic :: Utilities" - ], - "requires_dist": [ - "ruff >= 0.16.0 ; extra == \"all\"", - "mypy >= 1.11.2 ; extra == \"all\"", - "ty >= 0.0.37 ; extra == \"all\"", - "pytest >= 8.3.2 ; extra == \"all\"", - "hypothesis >= 6.141.1 ; extra == \"all\"", - "coverage >= 7.10.0 ; extra == \"all\"" - ], - "requires_python": ">=3.9", - "project_url": [ - "Changelog, https://github.com/kjd/idna/blob/master/HISTORY.md", - "Issue tracker, https://github.com/kjd/idna/issues", - "Source, https://github.com/kjd/idna" - ], - "provides_extra": [ - "all" - ] - } - }, - { - "download_info": { - "url": "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", - "archive_info": { - "hashes": { - "sha256": "e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5" - }, - "hash": "sha256=e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5" - } - }, - "is_direct": false, - "is_yanked": false, - "requested": false, - "metadata": { - "metadata_version": "2.4", - "name": "sympy", - "version": "1.14.0", - "dynamic": [ - "author", - "author-email", - "classifier", - "description", - "description-content-type", - "home-page", - "keywords", - "license", - "license-file", - "project-url", - "provides-extra", - "requires-dist", - "requires-python", - "summary" - ], - "summary": "Computer algebra system (CAS) in Python", - "description": "# SymPy\n\n[![pypi version](https://img.shields.io/pypi/v/sympy.svg)](https://pypi.python.org/pypi/sympy)\n[![Join the chat at https://gitter.im/sympy/sympy](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/sympy/sympy?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)\n[![Zenodo Badge](https://zenodo.org/badge/18918/sympy/sympy.svg)](https://zenodo.org/badge/latestdoi/18918/sympy/sympy)\n[![Downloads](https://pepy.tech/badge/sympy/month)](https://pepy.tech/project/sympy)\n[![GitHub Issues](https://img.shields.io/badge/issue_tracking-github-blue.svg)](https://github.com/sympy/sympy/issues)\n[![Git Tutorial](https://img.shields.io/badge/PR-Welcome-%23FF8300.svg?)](https://git-scm.com/book/en/v2/GitHub-Contributing-to-a-Project)\n[![Powered by NumFocus](https://img.shields.io/badge/powered%20by-NumFOCUS-orange.svg?style=flat&colorA=E1523D&colorB=007D8A)](https://numfocus.org)\n[![Commits since last release](https://img.shields.io/github/commits-since/sympy/sympy/latest.svg?longCache=true&style=flat-square&logo=git&logoColor=fff)](https://github.com/sympy/sympy/releases)\n\n[![SymPy Banner](https://github.com/sympy/sympy/raw/master/banner.svg)](https://sympy.org/)\n\n\nSee the [AUTHORS](AUTHORS) file for the list of authors.\n\nAnd many more people helped on the SymPy mailing list, reported bugs,\nhelped organize SymPy's participation in the Google Summer of Code, the\nGoogle Highly Open Participation Contest, Google Code-In, wrote and\nblogged about SymPy...\n\nLicense: New BSD License (see the [LICENSE](LICENSE) file for details) covers all\nfiles in the sympy repository unless stated otherwise.\n\nOur mailing list is at\n.\n\nWe have a community chat at [Gitter](https://gitter.im/sympy/sympy). Feel\nfree to ask us anything there. We have a very welcoming and helpful\ncommunity.\n\n## Download\n\nThe recommended installation method is through Anaconda,\n\n\nYou can also get the latest version of SymPy from\n\n\nTo get the git version do\n\n $ git clone https://github.com/sympy/sympy.git\n\nFor other options (tarballs, debs, etc.), see\n.\n\n## Documentation and Usage\n\nFor in-depth instructions on installation and building the\ndocumentation, see the [SymPy Documentation Style Guide](https://docs.sympy.org/dev/documentation-style-guide.html).\n\nEverything is at:\n\n\n\nYou can generate everything at the above site in your local copy of\nSymPy by:\n\n $ cd doc\n $ make html\n\nThen the docs will be in \\_build/html. If\nyou don't want to read that, here is a short usage:\n\nFrom this directory, start Python and:\n\n``` python\n>>> from sympy import Symbol, cos\n>>> x = Symbol('x')\n>>> e = 1/cos(x)\n>>> print(e.series(x, 0, 10))\n1 + x**2/2 + 5*x**4/24 + 61*x**6/720 + 277*x**8/8064 + O(x**10)\n```\n\nSymPy also comes with a console that is a simple wrapper around the\nclassic python console (or IPython when available) that loads the SymPy\nnamespace and executes some common commands for you.\n\nTo start it, issue:\n\n $ bin/isympy\n\nfrom this directory, if SymPy is not installed or simply:\n\n $ isympy\n\nif SymPy is installed.\n\n## Installation\n\nTo install SymPy using PyPI, run the following command:\n\n $ pip install sympy\n\nTo install SymPy using Anaconda, run the following command:\n\n $ conda install -c anaconda sympy\n\nTo install SymPy from GitHub source, first clone SymPy using `git`:\n\n $ git clone https://github.com/sympy/sympy.git\n\nThen, in the `sympy` repository that you cloned, simply run:\n\n $ pip install .\n\nSee for more information.\n\n## Contributing\n\nWe welcome contributions from anyone, even if you are new to open\nsource. Please read our [Introduction to Contributing](https://docs.sympy.org/dev/contributing/introduction-to-contributing.html)\npage and the [SymPy Documentation Style Guide](https://docs.sympy.org/dev/documentation-style-guide.html). If you\nare new and looking for some way to contribute, a good place to start is\nto look at the issues tagged [Easy to Fix](https://github.com/sympy/sympy/issues?q=is%3Aopen+is%3Aissue+label%3A%22Easy+to+Fix%22).\n\nPlease note that all participants in this project are expected to follow\nour Code of Conduct. By participating in this project you agree to abide\nby its terms. See [CODE\\_OF\\_CONDUCT.md](CODE_OF_CONDUCT.md).\n\n## Tests\n\nTo execute all tests, run:\n\n $./setup.py test\n\nin the current directory.\n\nFor the more fine-grained running of tests or doctests, use `bin/test`\nor respectively `bin/doctest`. The master branch is automatically tested\nby GitHub Actions.\n\nTo test pull requests, use\n[sympy-bot](https://github.com/sympy/sympy-bot).\n\n## Regenerate Experimental LaTeX Parser/Lexer\n\nThe parser and lexer were generated with the [ANTLR4](http://antlr4.org)\ntoolchain in `sympy/parsing/latex/_antlr` and checked into the repo.\nPresently, most users should not need to regenerate these files, but\nif you plan to work on this feature, you will need the `antlr4`\ncommand-line tool (and you must ensure that it is in your `PATH`).\nOne way to get it is:\n\n $ conda install -c conda-forge antlr=4.11.1\n\nAlternatively, follow the instructions on the ANTLR website and download\nthe `antlr-4.11.1-complete.jar`. Then export the `CLASSPATH` as instructed\nand instead of creating `antlr4` as an alias, make it an executable file\nwith the following contents:\n``` bash\n#!/bin/bash\njava -jar /usr/local/lib/antlr-4.11.1-complete.jar \"$@\"\n```\n\nAfter making changes to `sympy/parsing/latex/LaTeX.g4`, run:\n\n $ ./setup.py antlr\n\n## Clean\n\nTo clean everything (thus getting the same tree as in the repository):\n\n $ git clean -Xdf\n\nwhich will clear everything ignored by `.gitignore`, and:\n\n $ git clean -df\n\nto clear all untracked files. You can revert the most recent changes in\ngit with:\n\n $ git reset --hard\n\nWARNING: The above commands will all clear changes you may have made,\nand you will lose them forever. Be sure to check things with `git\nstatus`, `git diff`, `git clean -Xn`, and `git clean -n` before doing any\nof those.\n\n## Bugs\n\nOur issue tracker is at . Please\nreport any bugs that you find. Or, even better, fork the repository on\nGitHub and create a pull request. We welcome all changes, big or small,\nand we will help you make the pull request if you are new to git (just\nask on our mailing list or Gitter Channel). If you further have any queries, you can find answers\non Stack Overflow using the [sympy](https://stackoverflow.com/questions/tagged/sympy) tag.\n\n## Brief History\n\nSymPy was started by Ondřej Čertík in 2005, he wrote some code during\nthe summer, then he wrote some more code during summer 2006. In February\n2007, Fabian Pedregosa joined the project and helped fix many things,\ncontributed documentation, and made it alive again. 5 students (Mateusz\nPaprocki, Brian Jorgensen, Jason Gedge, Robert Schwarz, and Chris Wu)\nimproved SymPy incredibly during summer 2007 as part of the Google\nSummer of Code. Pearu Peterson joined the development during the summer\n2007 and he has made SymPy much more competitive by rewriting the core\nfrom scratch, which has made it from 10x to 100x faster. Jurjen N.E. Bos\nhas contributed pretty-printing and other patches. Fredrik Johansson has\nwritten mpmath and contributed a lot of patches.\n\nSymPy has participated in every Google Summer of Code since 2007. You\ncan see for\nfull details. Each year has improved SymPy by bounds. Most of SymPy's\ndevelopment has come from Google Summer of Code students.\n\nIn 2011, Ondřej Čertík stepped down as lead developer, with Aaron\nMeurer, who also started as a Google Summer of Code student, taking his\nplace. Ondřej Čertík is still active in the community but is too busy\nwith work and family to play a lead development role.\n\nSince then, a lot more people have joined the development and some\npeople have also left. You can see the full list in doc/src/aboutus.rst,\nor online at:\n\n\n\nThe git history goes back to 2007 when development moved from svn to hg.\nTo see the history before that point, look at\n.\n\nYou can use git to see the biggest developers. The command:\n\n $ git shortlog -ns\n\nwill show each developer, sorted by commits to the project. The command:\n\n $ git shortlog -ns --since=\"1 year\"\n\nwill show the top developers from the last year.\n\n## Citation\n\nTo cite SymPy in publications use\n\n> Meurer A, Smith CP, Paprocki M, Čertík O, Kirpichev SB, Rocklin M,\n> Kumar A, Ivanov S, Moore JK, Singh S, Rathnayake T, Vig S, Granger BE,\n> Muller RP, Bonazzi F, Gupta H, Vats S, Johansson F, Pedregosa F, Curry\n> MJ, Terrel AR, Roučka Š, Saboo A, Fernando I, Kulal S, Cimrman R,\n> Scopatz A. (2017) SymPy: symbolic computing in Python. *PeerJ Computer\n> Science* 3:e103 \n\nA BibTeX entry for LaTeX users is\n\n``` bibtex\n@article{10.7717/peerj-cs.103,\n title = {SymPy: symbolic computing in Python},\n author = {Meurer, Aaron and Smith, Christopher P. and Paprocki, Mateusz and \\v{C}ert\\'{i}k, Ond\\v{r}ej and Kirpichev, Sergey B. and Rocklin, Matthew and Kumar, Amit and Ivanov, Sergiu and Moore, Jason K. and Singh, Sartaj and Rathnayake, Thilina and Vig, Sean and Granger, Brian E. and Muller, Richard P. and Bonazzi, Francesco and Gupta, Harsh and Vats, Shivam and Johansson, Fredrik and Pedregosa, Fabian and Curry, Matthew J. and Terrel, Andy R. and Rou\\v{c}ka, \\v{S}t\\v{e}p\\'{a}n and Saboo, Ashutosh and Fernando, Isuru and Kulal, Sumith and Cimrman, Robert and Scopatz, Anthony},\n year = 2017,\n month = Jan,\n keywords = {Python, Computer algebra system, Symbolics},\n abstract = {\n SymPy is an open-source computer algebra system written in pure Python. It is built with a focus on extensibility and ease of use, through both interactive and programmatic applications. These characteristics have led SymPy to become a popular symbolic library for the scientific Python ecosystem. This paper presents the architecture of SymPy, a description of its features, and a discussion of select submodules. The supplementary material provides additional examples and further outlines details of the architecture and features of SymPy.\n },\n volume = 3,\n pages = {e103},\n journal = {PeerJ Computer Science},\n issn = {2376-5992},\n url = {https://doi.org/10.7717/peerj-cs.103},\n doi = {10.7717/peerj-cs.103}\n}\n```\n\nSymPy is BSD licensed, so you are free to use it whatever you like, be\nit academic, commercial, creating forks or derivatives, as long as you\ncopy the BSD statement if you redistribute it (see the LICENSE file for\ndetails). That said, although not required by the SymPy license, if it\nis convenient for you, please cite SymPy when using it in your work and\nalso consider contributing all your changes back, so that we can\nincorporate it and all of us will benefit in the end.\n", - "description_content_type": "text/markdown", - "keywords": [ - "Math", - "CAS" - ], - "home_page": "https://sympy.org", - "author": "SymPy development team", - "author_email": "sympy@googlegroups.com", - "license": "BSD", - "license_file": [ - "LICENSE", - "AUTHORS" - ], - "classifier": [ - "License :: OSI Approved :: BSD License", - "Operating System :: OS Independent", - "Programming Language :: Python", - "Topic :: Scientific/Engineering", - "Topic :: Scientific/Engineering :: Mathematics", - "Topic :: Scientific/Engineering :: Physics", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: Implementation :: CPython", - "Programming Language :: Python :: Implementation :: PyPy" - ], - "requires_dist": [ - "mpmath<1.4,>=1.1.0", - "pytest>=7.1.0; extra == \"dev\"", - "hypothesis>=6.70.0; extra == \"dev\"" - ], - "requires_python": ">=3.9", - "project_url": [ - "Source, https://github.com/sympy/sympy" - ], - "provides_extra": [ - "dev" - ] - } - }, - { - "download_info": { - "url": "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", - "archive_info": { - "hashes": { - "sha256": "a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c" - }, - "hash": "sha256=a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c" - } - }, - "is_direct": false, - "is_yanked": false, - "requested": false, - "metadata": { - "metadata_version": "2.1", - "name": "mpmath", - "version": "1.3.0", - "summary": "Python library for arbitrary-precision floating-point arithmetic", - "description": "mpmath\n======\n\n|pypi version| |Build status| |Code coverage status| |Zenodo Badge|\n\n.. |pypi version| image:: https://img.shields.io/pypi/v/mpmath.svg\n :target: https://pypi.python.org/pypi/mpmath\n.. |Build status| image:: https://github.com/fredrik-johansson/mpmath/workflows/test/badge.svg\n :target: https://github.com/fredrik-johansson/mpmath/actions?workflow=test\n.. |Code coverage status| image:: https://codecov.io/gh/fredrik-johansson/mpmath/branch/master/graph/badge.svg\n :target: https://codecov.io/gh/fredrik-johansson/mpmath\n.. |Zenodo Badge| image:: https://zenodo.org/badge/2934512.svg\n :target: https://zenodo.org/badge/latestdoi/2934512\n\nA Python library for arbitrary-precision floating-point arithmetic.\n\nWebsite: http://mpmath.org/\nMain author: Fredrik Johansson \n\nMpmath is free software released under the New BSD License (see the\nLICENSE file for details)\n\n0. History and credits\n----------------------\n\nThe following people (among others) have contributed major patches\nor new features to mpmath:\n\n* Pearu Peterson \n* Mario Pernici \n* Ondrej Certik \n* Vinzent Steinberg \n* Nimish Telang \n* Mike Taschuk \n* Case Van Horsen \n* Jorn Baayen \n* Chris Smith \n* Juan Arias de Reyna \n* Ioannis Tziakos \n* Aaron Meurer \n* Stefan Krastanov \n* Ken Allen \n* Timo Hartmann \n* Sergey B Kirpichev \n* Kris Kuhlman \n* Paul Masson \n* Michael Kagalenko \n* Jonathan Warner \n* Max Gaukler \n* Guillermo Navas-Palencia \n* Nike Dattani \n\nNumerous other people have contributed by reporting bugs,\nrequesting new features, or suggesting improvements to the\ndocumentation.\n\nFor a detailed changelog, including individual contributions,\nsee the CHANGES file.\n\nFredrik's work on mpmath during summer 2008 was sponsored by Google\nas part of the Google Summer of Code program.\n\nFredrik's work on mpmath during summer 2009 was sponsored by the\nAmerican Institute of Mathematics under the support of the National Science\nFoundation Grant No. 0757627 (FRG: L-functions and Modular Forms).\n\nAny opinions, findings, and conclusions or recommendations expressed in this\nmaterial are those of the author(s) and do not necessarily reflect the\nviews of the sponsors.\n\nCredit also goes to:\n\n* The authors of the GMP library and the Python wrapper\n gmpy, enabling mpmath to become much faster at\n high precision\n* The authors of MPFR, pari/gp, MPFUN, and other arbitrary-\n precision libraries, whose documentation has been helpful\n for implementing many of the algorithms in mpmath\n* Wikipedia contributors; Abramowitz & Stegun; Gradshteyn & Ryzhik;\n Wolfram Research for MathWorld and the Wolfram Functions site.\n These are the main references used for special functions\n implementations.\n* George Brandl for developing the Sphinx documentation tool\n used to build mpmath's documentation\n\nRelease history:\n\n* Version 1.3.0 released on March 7, 2023\n* Version 1.2.0 released on February 1, 2021\n* Version 1.1.0 released on December 11, 2018\n* Version 1.0.0 released on September 27, 2017\n* Version 0.19 released on June 10, 2014\n* Version 0.18 released on December 31, 2013\n* Version 0.17 released on February 1, 2011\n* Version 0.16 released on September 24, 2010\n* Version 0.15 released on June 6, 2010\n* Version 0.14 released on February 5, 2010\n* Version 0.13 released on August 13, 2009\n* Version 0.12 released on June 9, 2009\n* Version 0.11 released on January 26, 2009\n* Version 0.10 released on October 15, 2008\n* Version 0.9 released on August 23, 2008\n* Version 0.8 released on April 20, 2008\n* Version 0.7 released on March 12, 2008\n* Version 0.6 released on January 13, 2008\n* Version 0.5 released on November 24, 2007\n* Version 0.4 released on November 3, 2007\n* Version 0.3 released on October 5, 2007\n* Version 0.2 released on October 2, 2007\n* Version 0.1 released on September 27, 2007\n\n1. Download & installation\n--------------------------\n\nMpmath requires Python 2.7 or 3.5 (or later versions). It has been tested\nwith CPython 2.7, 3.5 through 3.7 and for PyPy.\n\nThe latest release of mpmath can be downloaded from the mpmath\nwebsite and from https://github.com/fredrik-johansson/mpmath/releases\n\nIt should also be available in the Python Package Index at\nhttps://pypi.python.org/pypi/mpmath\n\nTo install latest release of Mpmath with pip, simply run\n\n``pip install mpmath``\n\nOr unpack the mpmath archive and run\n\n``python setup.py install``\n\nMpmath can also be installed using\n\n``python -m easy_install mpmath``\n\nThe latest development code is available from\nhttps://github.com/fredrik-johansson/mpmath\n\nSee the main documentation for more detailed instructions.\n\n2. Running tests\n----------------\n\nThe unit tests in mpmath/tests/ can be run via the script\nruntests.py, but it is recommended to run them with py.test\n(https://pytest.org/), especially\nto generate more useful reports in case there are failures.\n\nYou may also want to check out the demo scripts in the demo\ndirectory.\n\nThe master branch is automatically tested by Travis CI.\n\n3. Documentation\n----------------\n\nDocumentation in reStructuredText format is available in the\ndoc directory included with the source package. These files\nare human-readable, but can be compiled to prettier HTML using\nthe build.py script (requires Sphinx, http://sphinx.pocoo.org/).\n\nSee setup.txt in the documentation for more information.\n\nThe most recent documentation is also available in HTML format:\n\nhttp://mpmath.org/doc/current/\n\n4. Known problems\n-----------------\n\nMpmath is a work in progress. Major issues include:\n\n* Some functions may return incorrect values when given extremely\n large arguments or arguments very close to singularities.\n\n* Directed rounding works for arithmetic operations. It is implemented\n heuristically for other operations, and their results may be off by one\n or two units in the last place (even if otherwise accurate).\n\n* Some IEEE 754 features are not available. Inifinities and NaN are\n partially supported; denormal rounding is currently not available\n at all.\n\n* The interface for switching precision and rounding is not finalized.\n The current method is not threadsafe.\n\n5. Help and bug reports\n-----------------------\n\nGeneral questions and comments can be sent to the mpmath mailinglist,\nmpmath@googlegroups.com\n\nYou can also report bugs and send patches to the mpmath issue tracker,\nhttps://github.com/fredrik-johansson/mpmath/issues\n", - "home_page": "http://mpmath.org/", - "author": "Fredrik Johansson", - "author_email": "fredrik.johansson@gmail.com", - "license": "BSD", - "license_file": [ - "LICENSE" - ], - "classifier": [ - "License :: OSI Approved :: BSD License", - "Topic :: Scientific/Engineering :: Mathematics", - "Topic :: Software Development :: Libraries :: Python Modules", - "Programming Language :: Python", - "Programming Language :: Python :: 2", - "Programming Language :: Python :: 2.7", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.5", - "Programming Language :: Python :: 3.6", - "Programming Language :: Python :: 3.7", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: Implementation :: CPython", - "Programming Language :: Python :: Implementation :: PyPy" - ], - "requires_dist": [ - "pytest (>=4.6) ; extra == 'develop'", - "pycodestyle ; extra == 'develop'", - "pytest-cov ; extra == 'develop'", - "codecov ; extra == 'develop'", - "wheel ; extra == 'develop'", - "sphinx ; extra == 'docs'", - "gmpy2 (>=2.1.0a4) ; (platform_python_implementation != \"PyPy\") and extra == 'gmpy'", - "pytest (>=4.6) ; extra == 'tests'" - ], - "project_url": [ - "Source, https://github.com/fredrik-johansson/mpmath", - "Tracker, https://github.com/fredrik-johansson/mpmath/issues", - "Documentation, http://mpmath.org/doc/current/" - ], - "provides_extra": [ - "develop", - "docs", - "gmpy", - "tests" - ] - } - }, - { - "download_info": { - "url": "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", - "archive_info": { - "hashes": { - "sha256": "481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8" - }, - "hash": "sha256=481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8" - } - }, - "is_direct": false, - "is_yanked": false, - "requested": false, - "metadata": { - "metadata_version": "2.4", - "name": "typing_extensions", - "version": "4.16.0", - "summary": "Backported and Experimental Type Hints for Python 3.9+", - "description": "# Typing Extensions\n\n[![Chat at https://gitter.im/python/typing](https://badges.gitter.im/python/typing.svg)](https://gitter.im/python/typing)\n\n[Documentation](https://typing-extensions.readthedocs.io/en/latest/#) –\n[PyPI](https://pypi.org/project/typing-extensions/)\n\n## Overview\n\nThe `typing_extensions` module serves two related purposes:\n\n- Enable use of new type system features on older Python versions. For example,\n `typing.TypeGuard` is new in Python 3.10, but `typing_extensions` allows\n users on previous Python versions to use it too.\n- Enable experimentation with new type system PEPs before they are accepted and\n added to the `typing` module.\n\n`typing_extensions` is treated specially by static type checkers such as\nmypy and pyright. Objects defined in `typing_extensions` are treated the same\nway as equivalent forms in `typing`.\n\n`typing_extensions` uses\n[Semantic Versioning](https://semver.org/). The\nmajor version will be incremented only for backwards-incompatible changes.\nTherefore, it's safe to depend\non `typing_extensions` like this: `typing_extensions ~=x.y`,\nwhere `x.y` is the first version that includes all features you need.\n[This](https://packaging.python.org/en/latest/specifications/version-specifiers/#compatible-release)\nis equivalent to `typing_extensions >=x.y, <(x+1)`. Do not depend on `~= x.y.z`\nunless you really know what you're doing; that defeats the purpose of\nsemantic versioning.\n\n## Included items\n\nSee [the documentation](https://typing-extensions.readthedocs.io/en/latest/#) for a\ncomplete listing of module contents.\n\n## Contributing\n\nSee [CONTRIBUTING.md](https://github.com/python/typing_extensions/blob/main/CONTRIBUTING.md)\nfor how to contribute to `typing_extensions`.\n\n", - "description_content_type": "text/markdown", - "keywords": [ - "annotations", - "backport", - "checker", - "checking", - "function", - "hinting", - "hints", - "type", - "typechecking", - "typehinting", - "typehints", - "typing" - ], - "author_email": "\"Guido van Rossum, Jukka Lehtosalo, Łukasz Langa, Michael Lee\" ", - "license_expression": "PSF-2.0", - "license_file": [ - "LICENSE" - ], - "classifier": [ - "Development Status :: 5 - Production/Stable", - "Environment :: Console", - "Intended Audience :: Developers", - "Operating System :: OS Independent", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - "Programming Language :: Python :: 3.14", - "Programming Language :: Python :: 3.15", - "Topic :: Software Development" - ], - "requires_python": ">=3.9", - "project_url": [ - "Bug Tracker, https://github.com/python/typing_extensions/issues", - "Changes, https://github.com/python/typing_extensions/blob/main/CHANGELOG.md", - "Documentation, https://typing-extensions.readthedocs.io/", - "Home, https://github.com/python/typing_extensions", - "Q & A, https://github.com/python/typing/discussions", - "Repository, https://github.com/python/typing_extensions" - ] - } - }, - { - "download_info": { - "url": "https://files.pythonhosted.org/packages/67/81/4add07e5172b7ac40d8ed5ff580409a7801a4fe26d529bdd915401dabfbe/typing_inspection-0.4.4-py3-none-any.whl", - "archive_info": { - "hashes": { - "sha256": "65b8397ba37ccbce054456aaccddfc91e6e3083c92824df348d96ca832f3f147" - }, - "hash": "sha256=65b8397ba37ccbce054456aaccddfc91e6e3083c92824df348d96ca832f3f147" - } - }, - "is_direct": false, - "is_yanked": false, - "requested": false, - "metadata": { - "metadata_version": "2.5", - "name": "typing-inspection", - "version": "0.4.4", - "summary": "Runtime typing introspection tools", - "description": "# typing-inspection\n\n[![CI](https://img.shields.io/github/actions/workflow/status/pydantic/typing-inspection/ci.yml?branch=main&logo=github&label=CI)](https://github.com/pydantic/typing-inspection/actions?query=event%3Apush+branch%3Amain+workflow%3ACI)\n[![Coverage](https://coverage-badge.samuelcolvin.workers.dev/pydantic/typing-inspection.svg)](https://coverage-badge.samuelcolvin.workers.dev/redirect/pydantic/typing-inspection)\n[![PyPI](https://img.shields.io/pypi/v/typing-inspection.svg)](https://pypi.org/project/typing-inspection/)\n[![Versions](https://img.shields.io/pypi/pyversions/typing-inspection.svg)](https://github.com/pydantic/typing-inspection)\n[![License](https://img.shields.io/github/license/pydantic/typing-inspection.svg)](https://github.com/pydantic/typing-inspection/blob/main/LICENSE)\n[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)\n\n`typing-inspection` provides tools to inspect type annotations at runtime.\n\n## Installation\n\nFrom [PyPI](https://pypi.org/project/typing-inspection/):\n\n```bash\npip install typing-inspection\n```\n\nThe library can be imported from the `typing_inspection` module.\n", - "description_content_type": "text/markdown", - "author_email": "Victorien Plot ", - "license_expression": "MIT", - "license_file": [ - "LICENSE" - ], - "classifier": [ - "Development Status :: 3 - Alpha", - "Intended Audience :: Developers", - "Programming Language :: Python", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - "Programming Language :: Python :: 3.14", - "Programming Language :: Python :: 3.15", - "Programming Language :: Python :: Implementation :: CPython", - "Topic :: Software Development :: Libraries :: Python Modules", - "Typing :: Typed" - ], - "requires_dist": [ - "typing-extensions>=4.15.0" - ], - "requires_python": ">=3.10", - "project_url": [ - "Homepage, https://github.com/pydantic/typing-inspection", - "Documentation, https://pydantic.github.io/typing-inspection/dev/", - "Source, https://github.com/pydantic/typing-inspection", - "Changelog, https://github.com/pydantic/typing-inspection/blob/main/HISTORY.md" - ] - } - }, - { - "download_info": { - "url": "https://files.pythonhosted.org/packages/7a/6d/db8b86e168fef0cf904737e275bccb683558088ef971e92d3b41ce980699/filelock-4.0.3-py3-none-any.whl", - "archive_info": { - "hashes": { - "sha256": "30cd166e2aee2c7534ce2c33c6367c4cd051b8368e20e2c4eb0c34f699bacfab" - }, - "hash": "sha256=30cd166e2aee2c7534ce2c33c6367c4cd051b8368e20e2c4eb0c34f699bacfab" - } - }, - "is_direct": false, - "is_yanked": false, - "requested": false, - "metadata": { - "metadata_version": "2.5", - "name": "filelock", - "version": "4.0.3", - "summary": "A platform independent file lock.", - "description": "# filelock\n\n[![PyPI](https://img.shields.io/pypi/v/filelock)](https://pypi.org/project/filelock/)\n[![Supported Python versions](https://img.shields.io/pypi/pyversions/filelock.svg)](https://pypi.org/project/filelock/)\n[![Documentation status](https://readthedocs.org/projects/py-filelock/badge/?version=latest)](https://py-filelock.readthedocs.io/en/latest/?badge=latest)\n[![Downloads](https://static.pepy.tech/badge/filelock/month)](https://pepy.tech/project/filelock)\n[![check](https://github.com/tox-dev/py-filelock/actions/workflows/check.yaml/badge.svg)](https://github.com/tox-dev/py-filelock/actions/workflows/check.yaml)\n\nFor more information checkout the [official documentation](https://py-filelock.readthedocs.io/en/latest/index.html).\n", - "description_content_type": "text/markdown", - "keywords": [ - "application", - "cache", - "directory", - "log", - "user" - ], - "maintainer_email": "Bernát Gábor ", - "license_expression": "MIT", - "license_file": [ - "LICENSE" - ], - "classifier": [ - "Development Status :: 5 - Production/Stable", - "Intended Audience :: Developers", - "License :: OSI Approved :: MIT License", - "Operating System :: OS Independent", - "Programming Language :: Python", - "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - "Programming Language :: Python :: 3.14", - "Programming Language :: Python :: 3.15", - "Topic :: Internet", - "Topic :: Software Development :: Libraries", - "Topic :: System" - ], - "requires_python": ">=3.10", - "project_url": [ - "Documentation, https://py-filelock.readthedocs.io", - "Homepage, https://github.com/tox-dev/py-filelock", - "Source, https://github.com/tox-dev/py-filelock", - "Tracker, https://github.com/tox-dev/py-filelock/issues" - ] - } - }, - { - "download_info": { - "url": "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", - "archive_info": { - "hashes": { - "sha256": "85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67" - }, - "hash": "sha256=85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67" - } - }, - "is_direct": false, - "is_yanked": false, - "requested": false, - "metadata": { - "metadata_version": "2.4", - "name": "Jinja2", - "version": "3.1.6", - "summary": "A very fast and expressive template engine.", - "description": "# Jinja\n\nJinja is a fast, expressive, extensible templating engine. Special\nplaceholders in the template allow writing code similar to Python\nsyntax. Then the template is passed data to render the final document.\n\nIt includes:\n\n- Template inheritance and inclusion.\n- Define and import macros within templates.\n- HTML templates can use autoescaping to prevent XSS from untrusted\n user input.\n- A sandboxed environment can safely render untrusted templates.\n- AsyncIO support for generating templates and calling async\n functions.\n- I18N support with Babel.\n- Templates are compiled to optimized Python code just-in-time and\n cached, or can be compiled ahead-of-time.\n- Exceptions point to the correct line in templates to make debugging\n easier.\n- Extensible filters, tests, functions, and even syntax.\n\nJinja's philosophy is that while application logic belongs in Python if\npossible, it shouldn't make the template designer's job difficult by\nrestricting functionality too much.\n\n\n## In A Nutshell\n\n```jinja\n{% extends \"base.html\" %}\n{% block title %}Members{% endblock %}\n{% block content %}\n \n{% endblock %}\n```\n\n## Donate\n\nThe Pallets organization develops and supports Jinja and other popular\npackages. In order to grow the community of contributors and users, and\nallow the maintainers to devote more time to the projects, [please\ndonate today][].\n\n[please donate today]: https://palletsprojects.com/donate\n\n## Contributing\n\nSee our [detailed contributing documentation][contrib] for many ways to\ncontribute, including reporting issues, requesting features, asking or answering\nquestions, and making PRs.\n\n[contrib]: https://palletsprojects.com/contributing/\n\n", - "description_content_type": "text/markdown", - "maintainer_email": "Pallets ", - "license_file": [ - "LICENSE.txt" - ], - "classifier": [ - "Development Status :: 5 - Production/Stable", - "Environment :: Web Environment", - "Intended Audience :: Developers", - "License :: OSI Approved :: BSD License", - "Operating System :: OS Independent", - "Programming Language :: Python", - "Topic :: Internet :: WWW/HTTP :: Dynamic Content", - "Topic :: Text Processing :: Markup :: HTML", - "Typing :: Typed" - ], - "requires_dist": [ - "MarkupSafe>=2.0", - "Babel>=2.7 ; extra == \"i18n\"" - ], - "requires_python": ">=3.7", - "project_url": [ - "Changes, https://jinja.palletsprojects.com/changes/", - "Chat, https://discord.gg/pallets", - "Documentation, https://jinja.palletsprojects.com/", - "Donate, https://palletsprojects.com/donate", - "Source, https://github.com/pallets/jinja/" - ], - "provides_extra": [ - "i18n" - ] - } - }, - { - "download_info": { - "url": "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", - "archive_info": { - "hashes": { - "sha256": "457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97" - }, - "hash": "sha256=457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97" - } - }, - "is_direct": false, - "is_yanked": false, - "requested": false, - "metadata": { - "metadata_version": "2.4", - "name": "MarkupSafe", - "version": "3.0.3", - "dynamic": [ - "license-file" - ], - "summary": "Safely add untrusted strings to HTML/XML markup.", - "description": "
\"\"
\n\n# MarkupSafe\n\nMarkupSafe implements a text object that escapes characters so it is\nsafe to use in HTML and XML. Characters that have special meanings are\nreplaced so that they display as the actual characters. This mitigates\ninjection attacks, meaning untrusted user input can safely be displayed\non a page.\n\n\n## Examples\n\n```pycon\n>>> from markupsafe import Markup, escape\n\n>>> # escape replaces special characters and wraps in Markup\n>>> escape(\"\")\nMarkup('<script>alert(document.cookie);</script>')\n\n>>> # wrap in Markup to mark text \"safe\" and prevent escaping\n>>> Markup(\"Hello\")\nMarkup('hello')\n\n>>> escape(Markup(\"Hello\"))\nMarkup('hello')\n\n>>> # Markup is a str subclass\n>>> # methods and operators escape their arguments\n>>> template = Markup(\"Hello {name}\")\n>>> template.format(name='\"World\"')\nMarkup('Hello "World"')\n```\n\n## Donate\n\nThe Pallets organization develops and supports MarkupSafe and other\npopular packages. In order to grow the community of contributors and\nusers, and allow the maintainers to devote more time to the projects,\n[please donate today][].\n\n[please donate today]: https://palletsprojects.com/donate\n\n## Contributing\n\nSee our [detailed contributing documentation][contrib] for many ways to\ncontribute, including reporting issues, requesting features, asking or answering\nquestions, and making PRs.\n\n[contrib]: https://palletsprojects.com/contributing/\n", - "description_content_type": "text/markdown", - "maintainer_email": "Pallets ", - "license_expression": "BSD-3-Clause", - "license_file": [ - "LICENSE.txt" - ], - "classifier": [ - "Development Status :: 5 - Production/Stable", - "Environment :: Web Environment", - "Intended Audience :: Developers", - "Operating System :: OS Independent", - "Programming Language :: Python", - "Topic :: Internet :: WWW/HTTP :: Dynamic Content", - "Topic :: Text Processing :: Markup :: HTML", - "Typing :: Typed" - ], - "requires_python": ">=3.9", - "project_url": [ - "Donate, https://palletsprojects.com/donate", - "Documentation, https://markupsafe.palletsprojects.com/", - "Changes, https://markupsafe.palletsprojects.com/page/changes/", - "Source, https://github.com/pallets/markupsafe/", - "Chat, https://discord.gg/pallets" - ] - } - } - ], - "environment": { - "implementation_name": "cpython", - "implementation_version": "3.14.7", - "os_name": "posix", - "platform_machine": "x86_64", - "platform_release": "7.0.0-31-generic", - "platform_system": "Linux", - "platform_version": "#31~24.04.1-Ubuntu SMP PREEMPT_DYNAMIC Mon Aug 10 09:38:02 UTC 2", - "python_full_version": "3.14.7", - "platform_python_implementation": "CPython", - "python_version": "3.14", - "sys_platform": "linux" - } -} diff --git a/docs/plans/torch-cross-platform-runtime-management/reports/v2.14.0-linux-cpu-rpc-acceptance/probe-results.json b/docs/plans/torch-cross-platform-runtime-management/reports/v2.14.0-linux-cpu-rpc-acceptance/probe-results.json deleted file mode 100644 index ec1bfc6d0..000000000 --- a/docs/plans/torch-cross-platform-runtime-management/reports/v2.14.0-linux-cpu-rpc-acceptance/probe-results.json +++ /dev/null @@ -1,304 +0,0 @@ -{ - "recorded_at": "2026-09-25T21:29:33.590478+00:00", - "status": "passed", - "core_status": "passed", - "adapter_status": "not selected", - "environment": { - "release": "2.14.0", - "torch": "2.14.0+cpu", - "build": "cpu", - "adapter": "none", - "python": "3.14", - "interpreter": "/tmp/pumas-torch-native-cpu-9u4lwjfg/launcher-data/managed-python/python/0800c1ab76812b8a0a424e27c9a0c6ff818175e26b32d40b165081b5e041a8c5/cpython-3.14.7-linux-x86_64-gnu/bin/python3.14", - "implementation": "cpython", - "platform": "Linux-7.0.0-31-generic-x86_64-with-glibc2.39", - "machine": "x86_64", - "artifacts": [ - { - "name": "torch", - "version": "2.14.0+cpu", - "url": "https://download-r2.pytorch.org/whl/cpu/torch-2.14.0%2Bcpu-cp314-cp314-manylinux_2_28_x86_64.whl", - "sha256": "f152f41dc5dc462afe0de780e451ebb47ea8b4451f8f919f9537aa8e2cbe1d7e" - }, - { - "name": "fastapi", - "version": "0.141.1", - "url": "https://files.pythonhosted.org/packages/cb/03/10388a42375ee7e4ac9b94eb2c5c569c8b5795e377e701c9ac3ad63de890/fastapi-0.141.1-py3-none-any.whl", - "sha256": "bfb91aa2d334c61cb35ba9a116fc123b3d3df31640b801cf57a7a78ec3f603b3" - }, - { - "name": "uvicorn", - "version": "0.54.0", - "url": "https://files.pythonhosted.org/packages/38/0c/b54a4fdd7f90a3af8b02ebc9ce6712c2c208b7926a2f7bad95c33ebbe943/uvicorn-0.54.0-py3-none-any.whl", - "sha256": "505bdb0f318731d45f1f712071fc781a8981f6847a31c902c9f5e652d4f67faf" - }, - { - "name": "psutil", - "version": "7.2.2", - "url": "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", - "sha256": "076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9" - }, - { - "name": "pillow", - "version": "12.3.0", - "url": "https://files.pythonhosted.org/packages/5c/44/c85361f65dbe00eea8576ee467c768d25129989efb76e94f205e9ca9bb46/pillow-12.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", - "sha256": "251bf95b67017e27b13d82f5b326234ca62d70f9cf4c2b9032de2358a3b12c7b" - }, - { - "name": "safetensors", - "version": "0.8.0", - "url": "https://files.pythonhosted.org/packages/28/50/f203ff3a3ddfe19308efc83c5a3a29ed02bf786732ec35e68bf9162f3365/safetensors-0.8.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "sha256": "fd6f3f93c9a0a7cc2788ee63fb763353d4bd2e89b0751bc78fcf7dda00bea774" - }, - { - "name": "annotated-doc", - "version": "0.0.5", - "url": "https://files.pythonhosted.org/packages/3e/30/e900b21425a860e195f32e37657aa1f7c7f2b1bfb26f03ca209b90933c06/annotated_doc-0.0.5-py3-none-any.whl", - "sha256": "117bac03a25ede5df5440e855b32d556049ca169ead221505badf432fed4b101" - }, - { - "name": "click", - "version": "8.5.0", - "url": "https://files.pythonhosted.org/packages/58/50/6c0d534c5f134586a8e1ba4e330569e32f057e33372ae556463212fb4cd3/click-8.5.0-py3-none-any.whl", - "sha256": "255bc9599cf7748b4b1a446ccc735421bd08a2ae529a8b88597d3de5664ee360" - }, - { - "name": "fsspec", - "version": "2026.9.0", - "url": "https://files.pythonhosted.org/packages/6c/c0/a98505f18594f1bce828bb159cec0fcf9860562f1a2c85913409fc8f3d9e/fsspec-2026.9.0-py3-none-any.whl", - "sha256": "8dd6e646e99ea382bd85f97a45e6b526a442d79423a7dc673f1e2756d05fcb5f" - }, - { - "name": "h11", - "version": "0.16.0", - "url": "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", - "sha256": "63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86" - }, - { - "name": "networkx", - "version": "3.7", - "url": "https://files.pythonhosted.org/packages/7e/cd/fe58041e9011f307c490e3e17dd48cc516448f7c698a3f2d9d9d65d7e6a8/networkx-3.7-py3-none-any.whl", - "sha256": "e3fd2c13a7814cee3746340d8d7f8598a67f16a58bf47fb7f8793fab6efca1b0" - }, - { - "name": "pydantic", - "version": "2.13.5", - "url": "https://files.pythonhosted.org/packages/eb/47/c95ffc2009878c7aac0c5e08528022dcb885933252a88b5f170058014464/pydantic-2.13.5-py3-none-any.whl", - "sha256": "346a034f080da3755d8e9cb5e00e8b07de1d39e4f6e2c87d8ab7cafa0b269a73" - }, - { - "name": "pydantic-core", - "version": "2.46.5", - "url": "https://files.pythonhosted.org/packages/2c/9b/59634b7ac631c63b2a37760eb6943af3e29573d6b59a4abc5e7f019d4cee/pydantic_core-2.46.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "sha256": "54d510bac3ee52247af28ed4bb18a1e799f040ac60fd2bf5ccd4c92f1fbe786f" - }, - { - "name": "annotated-types", - "version": "0.8.0", - "url": "https://files.pythonhosted.org/packages/99/91/8acff4f5e50511b911bbccb72b8628a49c68ce14148cd9f6431094859a90/annotated_types-0.8.0-py3-none-any.whl", - "sha256": "f072f4d804ea359e4eaf198b1af7a8b0943881a87f31bb764f8bf219bb9419e0" - }, - { - "name": "setuptools", - "version": "84.0.0", - "url": "https://files.pythonhosted.org/packages/95/9c/c510029fc6ef33a6275cd2c5d3cecd6613dfd6aa401d57c54f1c18852ccf/setuptools-84.0.0-py3-none-any.whl", - "sha256": "51a52592b3b99e102b609654876bd65f19f999935166d1352678931132b0c670" - }, - { - "name": "starlette", - "version": "1.7.0", - "url": "https://files.pythonhosted.org/packages/4e/d6/1ec1b290f9e0fb067899b61e1d37a30c923068bad260b216dbe37a7d2967/starlette-1.7.0-py3-none-any.whl", - "sha256": "67f8e99895493dd2911a03f11314af6ceebeae4e704bb9f43dfc6a9db151c93e" - }, - { - "name": "anyio", - "version": "4.15.1", - "url": "https://files.pythonhosted.org/packages/12/b8/4bd346e22b28902df4d651910f5242c28d84e4a5c2435ca5c3f797ed7e2e/anyio-4.15.1-py3-none-any.whl", - "sha256": "6152fdbbf9a77fdec97731721bebf7c4c44f7c29b424b0065826173efc7ed101" - }, - { - "name": "idna", - "version": "3.20", - "url": "https://files.pythonhosted.org/packages/58/a2/bb081bab032533a855d44de1d56f8e8426114ff1ba5d1f07a438a0a654f8/idna-3.20-py3-none-any.whl", - "sha256": "ab7ae7122974553370f0bdb919e1a960b2cd1bc1ef0276416d896db81c14582c" - }, - { - "name": "sympy", - "version": "1.14.0", - "url": "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", - "sha256": "e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5" - }, - { - "name": "mpmath", - "version": "1.3.0", - "url": "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", - "sha256": "a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c" - }, - { - "name": "typing-extensions", - "version": "4.16.0", - "url": "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", - "sha256": "481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8" - }, - { - "name": "typing-inspection", - "version": "0.4.4", - "url": "https://files.pythonhosted.org/packages/67/81/4add07e5172b7ac40d8ed5ff580409a7801a4fe26d529bdd915401dabfbe/typing_inspection-0.4.4-py3-none-any.whl", - "sha256": "65b8397ba37ccbce054456aaccddfc91e6e3083c92824df348d96ca832f3f147" - }, - { - "name": "filelock", - "version": "4.0.3", - "url": "https://files.pythonhosted.org/packages/7a/6d/db8b86e168fef0cf904737e275bccb683558088ef971e92d3b41ce980699/filelock-4.0.3-py3-none-any.whl", - "sha256": "30cd166e2aee2c7534ce2c33c6367c4cd051b8368e20e2c4eb0c34f699bacfab" - }, - { - "name": "jinja2", - "version": "3.1.6", - "url": "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", - "sha256": "85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67" - }, - { - "name": "markupsafe", - "version": "3.0.3", - "url": "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", - "sha256": "457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97" - } - ] - }, - "context": { - "python": "3.14.7 (main, Sep 1 2026, 14:18:09) [Clang 22.1.3 ]", - "executable": "/tmp/pumas-torch-native-cpu-9u4lwjfg/torch-versions/.torch-install-LJa7YI/runtime/venv/bin/python", - "platform": "Linux-7.0.0-31-generic-x86_64-with-glibc2.39", - "hardware": { - "cuda": null, - "hip": null, - "devices": [] - }, - "hardware_fingerprint": "494fb1d79639aecf4bb2b6043473616914037c874c14d9805f8e3f9d38b2c602", - "driver_version": null, - "runtime_files_sha256": { - "control_api.py": "ee5160f121a749d8d11cd929abfb9d98a1a109235dac3690c9e2118f9cca54d0", - "device_manager.py": "9ab6d63eb943989bc19f1fed89098aca27b168536fa2529734d1ee4f37585379", - "diffusion.py": "c4dadfc949c17a460f8fc8a446b03139da0c574b45b3f561403fdf83e495b6d3", - "flux2.py": "39f864e1e15ffb2b697bb95418d474cb98a760feca9acd48a74b5cf05642fea2", - "image_api.py": "bb39ac05aee7ea4d4357360accfa27ee261f58d1cd9cc35af28470012673a7ec", - "loaders/__init__.py": "80cec9242f95b73881b038b890a5d9465a14be86a631b2a0e1bf9efacac543fe", - "loaders/dllm_loader.py": "2c5656bce01a6d133925d02ca72606f8ae951d66186ac07d3fcb7fd5580b1a13", - "loaders/safetensors_loader.py": "661a000b791396067d253a27a26cb5905ae40ce8d50817ba54bc1afce803396f", - "loaders/sherry_loader.py": "360ac3f66c4438e3ffe3d9dc99ef2a27ae69efdd26f8d3564f638ae7802e5b3f", - "model_manager.py": "cfc049050f9003f87d622fe57da5c4ab4efb5105523fcbab926d8770d82be3f8", - "nunchaku_compat.py": "27b42f9cae80e474c0b2162e6bf572f822d525134bf2fc3bddd551c031bb5d70", - "openai_api.py": "a3c712e6307fe3b60d1b7acdcbeb9413b011eb370ad656f862ef9399f3342f8c", - "probe_runtime.py": "9b9e1d81087aefffdb383038724b471daeb0456814e5f2fa17e0b4da46255e25", - "resolve_runtime.py": "5e9b5b351e2a335587ae607f6c6a73de9ab4aed28ecde3b3768c3aee5037148d", - "serve.py": "88bf72ea3eac013dc7678bebe0e3b3053c141e8ec1222a210bd18b2a47601af4", - "validation.py": "f53cca26ddbddbc3c924ff07d32aaf9ced6061a7f1628379b4c0db2c9da7feb1" - }, - "interpreter_sha256": "241bf774a81580bb760adf960b48df7e6b23b1de026c9c912d4ca6be1a08241e", - "installed_distributions": { - "torch": "2.14.0+cpu", - "fastapi": "0.141.1", - "uvicorn": "0.54.0", - "psutil": "7.2.2", - "pillow": "12.3.0", - "safetensors": "0.8.0", - "annotated-doc": "0.0.5", - "click": "8.5.0", - "fsspec": "2026.9.0", - "h11": "0.16.0", - "networkx": "3.7", - "pydantic": "2.13.5", - "pydantic-core": "2.46.5", - "annotated-types": "0.8.0", - "setuptools": "84.0.0", - "starlette": "1.7.0", - "anyio": "4.15.1", - "idna": "3.20", - "sympy": "1.14.0", - "mpmath": "1.3.0", - "typing-extensions": "4.16.0", - "typing-inspection": "0.4.4", - "filelock": "4.0.3", - "jinja2": "3.1.6", - "markupsafe": "3.0.3" - }, - "all_installed_distributions": { - "annotated-doc": "0.0.5", - "annotated-types": "0.8.0", - "anyio": "4.15.1", - "click": "8.5.0", - "fastapi": "0.141.1", - "filelock": "4.0.3", - "fsspec": "2026.9.0", - "h11": "0.16.0", - "idna": "3.20", - "jinja2": "3.1.6", - "markupsafe": "3.0.3", - "mpmath": "1.3.0", - "networkx": "3.7", - "pillow": "12.3.0", - "pip": "26.2.1", - "psutil": "7.2.2", - "pydantic": "2.13.5", - "pydantic-core": "2.46.5", - "safetensors": "0.8.0", - "setuptools": "84.0.0", - "starlette": "1.7.0", - "sympy": "1.14.0", - "torch": "2.14.0+cpu", - "typing-extensions": "4.16.0", - "typing-inspection": "0.4.4", - "uvicorn": "0.54.0" - }, - "distributions_sha256": "fb628c6fb5305166cad9332e5cf97765df173d14d44b7a0296950ad749e0254e", - "resolution_sha256": "d02c2be2fea242cbabd9dc5d0408772167f847231fb3fb378046c44e5279d0b4", - "sidecar_sha256": "88bf72ea3eac013dc7678bebe0e3b3053c141e8ec1222a210bd18b2a47601af4" - }, - "capabilities": { - "torch_import": { - "status": "passed", - "version": "2.14.0+cpu" - }, - "cpu_tensor": { - "status": "passed" - }, - "cuda_tensor": { - "status": "unavailable", - "scope": "CUDA tensor operation", - "reason": "CUDA is not available" - }, - "sidecar_app": { - "status": "passed", - "health": { - "status": "ok", - "protocol": 3, - "capabilities": [ - "image_generation" - ] - }, - "scope": "in-process app construction and health endpoint" - }, - "flux2_klein": { - "status": "not selected", - "scope": "optional adapter" - }, - "nunchaku_z_image": { - "status": "not selected", - "scope": "optional adapter" - }, - "image_device": { - "status": "unavailable", - "scope": "adapter device requirement", - "reason": "No NVIDIA sm_120 CUDA device detected" - }, - "sidecar_startup": { - "status": "not tested", - "scope": "socket startup requires an explicit trial" - }, - "image_generation": { - "status": "not tested", - "scope": "no model loaded or inference performed" - } - } -} diff --git a/docs/plans/torch-cross-platform-runtime-management/reports/v2.14.0-linux-cpu-rpc-acceptance/resolution.json b/docs/plans/torch-cross-platform-runtime-management/reports/v2.14.0-linux-cpu-rpc-acceptance/resolution.json deleted file mode 100644 index a34b68985..000000000 --- a/docs/plans/torch-cross-platform-runtime-management/reports/v2.14.0-linux-cpu-rpc-acceptance/resolution.json +++ /dev/null @@ -1,163 +0,0 @@ -{ - "release": "2.14.0", - "torch": "2.14.0+cpu", - "build": "cpu", - "adapter": "none", - "python": "3.14", - "interpreter": "/tmp/pumas-torch-native-cpu-9u4lwjfg/launcher-data/managed-python/python/0800c1ab76812b8a0a424e27c9a0c6ff818175e26b32d40b165081b5e041a8c5/cpython-3.14.7-linux-x86_64-gnu/bin/python3.14", - "implementation": "cpython", - "platform": "Linux-7.0.0-31-generic-x86_64-with-glibc2.39", - "machine": "x86_64", - "artifacts": [ - { - "name": "torch", - "version": "2.14.0+cpu", - "url": "https://download-r2.pytorch.org/whl/cpu/torch-2.14.0%2Bcpu-cp314-cp314-manylinux_2_28_x86_64.whl", - "sha256": "f152f41dc5dc462afe0de780e451ebb47ea8b4451f8f919f9537aa8e2cbe1d7e" - }, - { - "name": "fastapi", - "version": "0.141.1", - "url": "https://files.pythonhosted.org/packages/cb/03/10388a42375ee7e4ac9b94eb2c5c569c8b5795e377e701c9ac3ad63de890/fastapi-0.141.1-py3-none-any.whl", - "sha256": "bfb91aa2d334c61cb35ba9a116fc123b3d3df31640b801cf57a7a78ec3f603b3" - }, - { - "name": "uvicorn", - "version": "0.54.0", - "url": "https://files.pythonhosted.org/packages/38/0c/b54a4fdd7f90a3af8b02ebc9ce6712c2c208b7926a2f7bad95c33ebbe943/uvicorn-0.54.0-py3-none-any.whl", - "sha256": "505bdb0f318731d45f1f712071fc781a8981f6847a31c902c9f5e652d4f67faf" - }, - { - "name": "psutil", - "version": "7.2.2", - "url": "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", - "sha256": "076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9" - }, - { - "name": "pillow", - "version": "12.3.0", - "url": "https://files.pythonhosted.org/packages/5c/44/c85361f65dbe00eea8576ee467c768d25129989efb76e94f205e9ca9bb46/pillow-12.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", - "sha256": "251bf95b67017e27b13d82f5b326234ca62d70f9cf4c2b9032de2358a3b12c7b" - }, - { - "name": "safetensors", - "version": "0.8.0", - "url": "https://files.pythonhosted.org/packages/28/50/f203ff3a3ddfe19308efc83c5a3a29ed02bf786732ec35e68bf9162f3365/safetensors-0.8.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "sha256": "fd6f3f93c9a0a7cc2788ee63fb763353d4bd2e89b0751bc78fcf7dda00bea774" - }, - { - "name": "annotated-doc", - "version": "0.0.5", - "url": "https://files.pythonhosted.org/packages/3e/30/e900b21425a860e195f32e37657aa1f7c7f2b1bfb26f03ca209b90933c06/annotated_doc-0.0.5-py3-none-any.whl", - "sha256": "117bac03a25ede5df5440e855b32d556049ca169ead221505badf432fed4b101" - }, - { - "name": "click", - "version": "8.5.0", - "url": "https://files.pythonhosted.org/packages/58/50/6c0d534c5f134586a8e1ba4e330569e32f057e33372ae556463212fb4cd3/click-8.5.0-py3-none-any.whl", - "sha256": "255bc9599cf7748b4b1a446ccc735421bd08a2ae529a8b88597d3de5664ee360" - }, - { - "name": "fsspec", - "version": "2026.9.0", - "url": "https://files.pythonhosted.org/packages/6c/c0/a98505f18594f1bce828bb159cec0fcf9860562f1a2c85913409fc8f3d9e/fsspec-2026.9.0-py3-none-any.whl", - "sha256": "8dd6e646e99ea382bd85f97a45e6b526a442d79423a7dc673f1e2756d05fcb5f" - }, - { - "name": "h11", - "version": "0.16.0", - "url": "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", - "sha256": "63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86" - }, - { - "name": "networkx", - "version": "3.7", - "url": "https://files.pythonhosted.org/packages/7e/cd/fe58041e9011f307c490e3e17dd48cc516448f7c698a3f2d9d9d65d7e6a8/networkx-3.7-py3-none-any.whl", - "sha256": "e3fd2c13a7814cee3746340d8d7f8598a67f16a58bf47fb7f8793fab6efca1b0" - }, - { - "name": "pydantic", - "version": "2.13.5", - "url": "https://files.pythonhosted.org/packages/eb/47/c95ffc2009878c7aac0c5e08528022dcb885933252a88b5f170058014464/pydantic-2.13.5-py3-none-any.whl", - "sha256": "346a034f080da3755d8e9cb5e00e8b07de1d39e4f6e2c87d8ab7cafa0b269a73" - }, - { - "name": "pydantic-core", - "version": "2.46.5", - "url": "https://files.pythonhosted.org/packages/2c/9b/59634b7ac631c63b2a37760eb6943af3e29573d6b59a4abc5e7f019d4cee/pydantic_core-2.46.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "sha256": "54d510bac3ee52247af28ed4bb18a1e799f040ac60fd2bf5ccd4c92f1fbe786f" - }, - { - "name": "annotated-types", - "version": "0.8.0", - "url": "https://files.pythonhosted.org/packages/99/91/8acff4f5e50511b911bbccb72b8628a49c68ce14148cd9f6431094859a90/annotated_types-0.8.0-py3-none-any.whl", - "sha256": "f072f4d804ea359e4eaf198b1af7a8b0943881a87f31bb764f8bf219bb9419e0" - }, - { - "name": "setuptools", - "version": "84.0.0", - "url": "https://files.pythonhosted.org/packages/95/9c/c510029fc6ef33a6275cd2c5d3cecd6613dfd6aa401d57c54f1c18852ccf/setuptools-84.0.0-py3-none-any.whl", - "sha256": "51a52592b3b99e102b609654876bd65f19f999935166d1352678931132b0c670" - }, - { - "name": "starlette", - "version": "1.7.0", - "url": "https://files.pythonhosted.org/packages/4e/d6/1ec1b290f9e0fb067899b61e1d37a30c923068bad260b216dbe37a7d2967/starlette-1.7.0-py3-none-any.whl", - "sha256": "67f8e99895493dd2911a03f11314af6ceebeae4e704bb9f43dfc6a9db151c93e" - }, - { - "name": "anyio", - "version": "4.15.1", - "url": "https://files.pythonhosted.org/packages/12/b8/4bd346e22b28902df4d651910f5242c28d84e4a5c2435ca5c3f797ed7e2e/anyio-4.15.1-py3-none-any.whl", - "sha256": "6152fdbbf9a77fdec97731721bebf7c4c44f7c29b424b0065826173efc7ed101" - }, - { - "name": "idna", - "version": "3.20", - "url": "https://files.pythonhosted.org/packages/58/a2/bb081bab032533a855d44de1d56f8e8426114ff1ba5d1f07a438a0a654f8/idna-3.20-py3-none-any.whl", - "sha256": "ab7ae7122974553370f0bdb919e1a960b2cd1bc1ef0276416d896db81c14582c" - }, - { - "name": "sympy", - "version": "1.14.0", - "url": "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", - "sha256": "e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5" - }, - { - "name": "mpmath", - "version": "1.3.0", - "url": "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", - "sha256": "a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c" - }, - { - "name": "typing-extensions", - "version": "4.16.0", - "url": "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", - "sha256": "481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8" - }, - { - "name": "typing-inspection", - "version": "0.4.4", - "url": "https://files.pythonhosted.org/packages/67/81/4add07e5172b7ac40d8ed5ff580409a7801a4fe26d529bdd915401dabfbe/typing_inspection-0.4.4-py3-none-any.whl", - "sha256": "65b8397ba37ccbce054456aaccddfc91e6e3083c92824df348d96ca832f3f147" - }, - { - "name": "filelock", - "version": "4.0.3", - "url": "https://files.pythonhosted.org/packages/7a/6d/db8b86e168fef0cf904737e275bccb683558088ef971e92d3b41ce980699/filelock-4.0.3-py3-none-any.whl", - "sha256": "30cd166e2aee2c7534ce2c33c6367c4cd051b8368e20e2c4eb0c34f699bacfab" - }, - { - "name": "jinja2", - "version": "3.1.6", - "url": "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", - "sha256": "85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67" - }, - { - "name": "markupsafe", - "version": "3.0.3", - "url": "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", - "sha256": "457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97" - } - ] -} diff --git a/docs/plans/torch-cross-platform-runtime-management/reports/v2.14.0-linux-cpu-rpc-acceptance/rpc.log b/docs/plans/torch-cross-platform-runtime-management/reports/v2.14.0-linux-cpu-rpc-acceptance/rpc.log deleted file mode 100644 index c2251a9fe..000000000 --- a/docs/plans/torch-cross-platform-runtime-management/reports/v2.14.0-linux-cpu-rpc-acceptance/rpc.log +++ /dev/null @@ -1,27 +0,0 @@ -2026-09-25T21:26:10.038820Z INFO Starting Pumas RPC Server -2026-09-25T21:26:10.038857Z INFO Launcher root configured -2026-09-25T21:26:10.313694Z INFO Created FTS5 table: model_search -2026-09-25T21:26:10.330817Z INFO Populated FTS5 table from models -2026-09-25T21:26:10.330950Z INFO Rebuilding model index -2026-09-25T21:26:10.331005Z INFO Rebuilt index with 0 models -2026-09-25T21:26:10.625388Z INFO IPC server listening on 127.0.0.1:45189 -2026-09-25T21:26:10.625521Z INFO IPC server started on port 45189 -2026-09-25T21:26:10.625675Z INFO Started watching model library at "/tmp/pumas-torch-native-cpu-9u4lwjfg/shared-resources/models" -2026-09-25T21:26:10.650125Z INFO Validation complete: 0 valid, 0 removed, 0 orphaned -2026-09-25T21:26:10.650140Z INFO ollama version manager initialized successfully -2026-09-25T21:26:10.673764Z INFO Validation complete: 0 valid, 0 removed, 0 orphaned -2026-09-25T21:26:10.673779Z INFO torch version manager initialized successfully -2026-09-25T21:26:10.697030Z INFO Validation complete: 0 valid, 0 removed, 0 orphaned -2026-09-25T21:26:10.697048Z INFO llama-cpp version manager initialized successfully -2026-09-25T21:26:10.697050Z INFO Initialized 3 version manager(s) -2026-09-25T21:26:10.697241Z INFO Size calculator initialized -2026-09-25T21:26:10.697321Z INFO Plugin loader initialized (0 plugins) -2026-09-25T21:26:10.794772Z INFO Server listening on 127.0.0.1:39815 with max 64 in-flight requests and 33554432 byte request bodies -RPC_PORT=39815 -2026-09-25T21:26:10.794804Z INFO RPC server running on 127.0.0.1:39815 -2026-09-25T21:26:16.164941Z INFO Fetched 69 releases from GitHub for pytorch/pytorch -2026-09-25T21:29:33.882873Z INFO Finalizing installation for v2.14.0 -2026-09-25T21:29:33.890173Z INFO Installation of v2.14.0 finalized -2026-09-25T21:29:36.683512Z INFO Set active version: v2.14.0 -2026-09-25T21:29:38.081229Z INFO Shutdown signal received, exiting -2026-09-25T21:29:38.082502Z WARN File watcher channel disconnected diff --git a/docs/plans/torch-cross-platform-runtime-management/reports/v2.14.0-linux-cpu-rpc-acceptance/runtime.json b/docs/plans/torch-cross-platform-runtime-management/reports/v2.14.0-linux-cpu-rpc-acceptance/runtime.json deleted file mode 100644 index 32177cfe7..000000000 --- a/docs/plans/torch-cross-platform-runtime-management/reports/v2.14.0-linux-cpu-rpc-acceptance/runtime.json +++ /dev/null @@ -1,181 +0,0 @@ -{ - "adapter": "none", - "artifacts": [ - { - "name": "torch", - "sha256": "f152f41dc5dc462afe0de780e451ebb47ea8b4451f8f919f9537aa8e2cbe1d7e", - "url": "https://download-r2.pytorch.org/whl/cpu/torch-2.14.0%2Bcpu-cp314-cp314-manylinux_2_28_x86_64.whl", - "version": "2.14.0+cpu" - }, - { - "name": "fastapi", - "sha256": "bfb91aa2d334c61cb35ba9a116fc123b3d3df31640b801cf57a7a78ec3f603b3", - "url": "https://files.pythonhosted.org/packages/cb/03/10388a42375ee7e4ac9b94eb2c5c569c8b5795e377e701c9ac3ad63de890/fastapi-0.141.1-py3-none-any.whl", - "version": "0.141.1" - }, - { - "name": "uvicorn", - "sha256": "505bdb0f318731d45f1f712071fc781a8981f6847a31c902c9f5e652d4f67faf", - "url": "https://files.pythonhosted.org/packages/38/0c/b54a4fdd7f90a3af8b02ebc9ce6712c2c208b7926a2f7bad95c33ebbe943/uvicorn-0.54.0-py3-none-any.whl", - "version": "0.54.0" - }, - { - "name": "psutil", - "sha256": "076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", - "url": "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", - "version": "7.2.2" - }, - { - "name": "pillow", - "sha256": "251bf95b67017e27b13d82f5b326234ca62d70f9cf4c2b9032de2358a3b12c7b", - "url": "https://files.pythonhosted.org/packages/5c/44/c85361f65dbe00eea8576ee467c768d25129989efb76e94f205e9ca9bb46/pillow-12.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", - "version": "12.3.0" - }, - { - "name": "safetensors", - "sha256": "fd6f3f93c9a0a7cc2788ee63fb763353d4bd2e89b0751bc78fcf7dda00bea774", - "url": "https://files.pythonhosted.org/packages/28/50/f203ff3a3ddfe19308efc83c5a3a29ed02bf786732ec35e68bf9162f3365/safetensors-0.8.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "version": "0.8.0" - }, - { - "name": "annotated-doc", - "sha256": "117bac03a25ede5df5440e855b32d556049ca169ead221505badf432fed4b101", - "url": "https://files.pythonhosted.org/packages/3e/30/e900b21425a860e195f32e37657aa1f7c7f2b1bfb26f03ca209b90933c06/annotated_doc-0.0.5-py3-none-any.whl", - "version": "0.0.5" - }, - { - "name": "click", - "sha256": "255bc9599cf7748b4b1a446ccc735421bd08a2ae529a8b88597d3de5664ee360", - "url": "https://files.pythonhosted.org/packages/58/50/6c0d534c5f134586a8e1ba4e330569e32f057e33372ae556463212fb4cd3/click-8.5.0-py3-none-any.whl", - "version": "8.5.0" - }, - { - "name": "fsspec", - "sha256": "8dd6e646e99ea382bd85f97a45e6b526a442d79423a7dc673f1e2756d05fcb5f", - "url": "https://files.pythonhosted.org/packages/6c/c0/a98505f18594f1bce828bb159cec0fcf9860562f1a2c85913409fc8f3d9e/fsspec-2026.9.0-py3-none-any.whl", - "version": "2026.9.0" - }, - { - "name": "h11", - "sha256": "63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", - "url": "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", - "version": "0.16.0" - }, - { - "name": "networkx", - "sha256": "e3fd2c13a7814cee3746340d8d7f8598a67f16a58bf47fb7f8793fab6efca1b0", - "url": "https://files.pythonhosted.org/packages/7e/cd/fe58041e9011f307c490e3e17dd48cc516448f7c698a3f2d9d9d65d7e6a8/networkx-3.7-py3-none-any.whl", - "version": "3.7" - }, - { - "name": "pydantic", - "sha256": "346a034f080da3755d8e9cb5e00e8b07de1d39e4f6e2c87d8ab7cafa0b269a73", - "url": "https://files.pythonhosted.org/packages/eb/47/c95ffc2009878c7aac0c5e08528022dcb885933252a88b5f170058014464/pydantic-2.13.5-py3-none-any.whl", - "version": "2.13.5" - }, - { - "name": "pydantic-core", - "sha256": "54d510bac3ee52247af28ed4bb18a1e799f040ac60fd2bf5ccd4c92f1fbe786f", - "url": "https://files.pythonhosted.org/packages/2c/9b/59634b7ac631c63b2a37760eb6943af3e29573d6b59a4abc5e7f019d4cee/pydantic_core-2.46.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "version": "2.46.5" - }, - { - "name": "annotated-types", - "sha256": "f072f4d804ea359e4eaf198b1af7a8b0943881a87f31bb764f8bf219bb9419e0", - "url": "https://files.pythonhosted.org/packages/99/91/8acff4f5e50511b911bbccb72b8628a49c68ce14148cd9f6431094859a90/annotated_types-0.8.0-py3-none-any.whl", - "version": "0.8.0" - }, - { - "name": "setuptools", - "sha256": "51a52592b3b99e102b609654876bd65f19f999935166d1352678931132b0c670", - "url": "https://files.pythonhosted.org/packages/95/9c/c510029fc6ef33a6275cd2c5d3cecd6613dfd6aa401d57c54f1c18852ccf/setuptools-84.0.0-py3-none-any.whl", - "version": "84.0.0" - }, - { - "name": "starlette", - "sha256": "67f8e99895493dd2911a03f11314af6ceebeae4e704bb9f43dfc6a9db151c93e", - "url": "https://files.pythonhosted.org/packages/4e/d6/1ec1b290f9e0fb067899b61e1d37a30c923068bad260b216dbe37a7d2967/starlette-1.7.0-py3-none-any.whl", - "version": "1.7.0" - }, - { - "name": "anyio", - "sha256": "6152fdbbf9a77fdec97731721bebf7c4c44f7c29b424b0065826173efc7ed101", - "url": "https://files.pythonhosted.org/packages/12/b8/4bd346e22b28902df4d651910f5242c28d84e4a5c2435ca5c3f797ed7e2e/anyio-4.15.1-py3-none-any.whl", - "version": "4.15.1" - }, - { - "name": "idna", - "sha256": "ab7ae7122974553370f0bdb919e1a960b2cd1bc1ef0276416d896db81c14582c", - "url": "https://files.pythonhosted.org/packages/58/a2/bb081bab032533a855d44de1d56f8e8426114ff1ba5d1f07a438a0a654f8/idna-3.20-py3-none-any.whl", - "version": "3.20" - }, - { - "name": "sympy", - "sha256": "e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", - "url": "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", - "version": "1.14.0" - }, - { - "name": "mpmath", - "sha256": "a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", - "url": "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", - "version": "1.3.0" - }, - { - "name": "typing-extensions", - "sha256": "481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", - "url": "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", - "version": "4.16.0" - }, - { - "name": "typing-inspection", - "sha256": "65b8397ba37ccbce054456aaccddfc91e6e3083c92824df348d96ca832f3f147", - "url": "https://files.pythonhosted.org/packages/67/81/4add07e5172b7ac40d8ed5ff580409a7801a4fe26d529bdd915401dabfbe/typing_inspection-0.4.4-py3-none-any.whl", - "version": "0.4.4" - }, - { - "name": "filelock", - "sha256": "30cd166e2aee2c7534ce2c33c6367c4cd051b8368e20e2c4eb0c34f699bacfab", - "url": "https://files.pythonhosted.org/packages/7a/6d/db8b86e168fef0cf904737e275bccb683558088ef971e92d3b41ce980699/filelock-4.0.3-py3-none-any.whl", - "version": "4.0.3" - }, - { - "name": "jinja2", - "sha256": "85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", - "url": "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", - "version": "3.1.6" - }, - { - "name": "markupsafe", - "sha256": "457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", - "url": "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", - "version": "3.0.3" - } - ], - "build": "cpu", - "capabilities": [ - "image_generation" - ], - "managed_python": { - "distribution": { - "catalogKey": "cpython-3.14.7-linux-x86_64-gnu", - "implementation": "CPython", - "sourceUrl": "https://releases.astral.sh/github/python-build-standalone/releases/download/20260901/cpython-3.14.7%2B20260901-x86_64-unknown-linux-gnu-install_only_stripped.tar.gz", - "targetTriple": "x86_64-unknown-linux-gnu", - "version": "3.14.7" - }, - "executable": { - "path": "/tmp/pumas-torch-native-cpu-9u4lwjfg/launcher-data/managed-python/python/0800c1ab76812b8a0a424e27c9a0c6ff818175e26b32d40b165081b5e041a8c5/cpython-3.14.7-linux-x86_64-gnu/bin/python3.14", - "sha256": "241bf774a81580bb760adf960b48df7e6b23b1de026c9c912d4ca6be1a08241e" - }, - "provider": { - "archiveSha256": "89eadd7c76fc063887959510d5ba0ab1264dfd5f1143b925ddb73021a40acf16", - "name": "uv", - "version": "0.12.18" - } - }, - "protocol": 3, - "python": "python3.14", - "qualification": "not verified by Pumas", - "recipe_id": "upstream-preview-v2.14.0-cpu-python3.14-none" -} diff --git a/docs/plans/torch-diffusion-serving/execution-ledger.md b/docs/plans/torch-diffusion-serving/execution-ledger.md deleted file mode 100644 index 5e0966c33..000000000 --- a/docs/plans/torch-diffusion-serving/execution-ledger.md +++ /dev/null @@ -1,749 +0,0 @@ -# Execution ledger - -## 2026-09-20 — Reconcile Torch Image Provider Contract Correction - -- Planning-only operation. The focused - [Torch Image Provider Contract Correction](../torch-image-provider-contract/plan.md) - now solely owns the Pumas/Torch lifetime, live compatibility, extensible - private result, and public projection correction. -- Superseded this plan's prospective 600/615/client generation-deadline - instructions. Historical runtime and image reports retain their recorded - protocol, dimensions, bytes, and acceptance scope. -- This plan retains Tuldok's remaining consumer adaptation, corrected - `torch-runtime-0.1.6` candidate construction/isolated installation, real GPU - cleanup TIPC-04, exact-byte TIPC-09, 1280×720 browser TIPC-10, and later - distribution consumption. Recipe allocation must be rechecked before build. -- The current distribution next slice and the user's reduced-verification, - NVFP4, broad GPU-matrix, and T16 desktop-shutdown deferrals remain unchanged. -- No implementation, test, runtime, installation, activation, publication, or - commit action was performed. - -### Generation-wide lifetime clarification - -- The user's follow-up makes the no-elapsed-deadline policy apply to every - admitted generation, not only images. This plan's image/Tuldok handoffs consume - the shared `TIPC-GEN-01` lifecycle; the focused plan owns the reusable gateway - transport evidence in TIPC-12. -- This clarification does not expand this plan into text semantics or usage - accounting and does not change its current distribution next slice. - -### Handoff-state correction after review - -- Original M3 remains completed only for its recorded workflow. New Tuldok - deadline removal, uncertain-outcome handling, metadata permissiveness, and the - exact-candidate 1280×720 workflow are now the explicit `M3-TIPC` Planned - companion; they are not retroactively accepted by the old evidence. -- TIPC-04, TIPC-09, and TIPC-10 return independently when their exact evidence - passes. They do not wait for whole-M5 acceptance, publication, or A1's - publication-dependent discovery evidence. -- The existing distribution next slice remains the plan's sole current - priority; M3-TIPC is independently preparable and its required-real gate waits - for the installed corrected candidate. - -### M3-TIPC source companion completed - -- Consumed accepted Pumas source identity - `826a270958f7182bd8108c879b4b7fa1da5cab7d` and integrated the Muse-assisted - Tuldok companion as `a61daeec83779868cf03b14fb5c811fcdc608fc2` on - `integration/torch-image-provider-contract`. -- Tuldok now bounds only connection establishment, leaves admitted reads - duration-unbounded, distinguishes pre-connect unavailability from uncertain - response loss, never retries automatically, preserves explicit - socket/watcher cancellation, accepts additive public metadata without saving - unknown fields, and drives the real browser script at 1280×720. -- The full Tuldok unit suite passed: 47 tests. Two timed-out Passeur worktrees - were confirmed stopped, reconciled, and finalized as retained audit evidence; - only the broader v5 work was adapted, so competing partial contributions were - not combined. -- This is source completion only. No candidate was built or installed, no GPU - was allocated, and no browser was run. TIPC-10 remains pending until the exact - corrected candidate traverses Tuldok → Pumas at 1280×720 and both displayed - and saved outputs are recorded. - -### TIPC-09 exact candidate returned - -- Rechecked the reserved identity and built `torch-runtime-0.1.6` from accepted - provider source `826a270958f7182bd8108c879b4b7fa1da5cab7d`. Archive SHA-256 - is `74f9b593dff1e447a73571dc465efd520238ba0c56d2730393a17eee2b97426c`; - requirements-lock SHA-256 is - `d4073f8e8a1d8b20b48a275a2c63a6d2c084369e831f093b8903a0047c4ca0f4`. -- The production installer initially exposed a stale strict recipe decoder that - rejected the required capability list. Pumas fix - `ab3a95a9369a5471127003fcd8e6fff529596cb5` adds the capability contract and - regression; all 107 app-manager tests pass. -- The unchanged exact archive installed atomically into isolated root - `launcher-data/cache/torch-qualification/tipc-0.1.6-install`. Native validation - passed on the RTX 5090 Laptop GPU with Torch 2.9.1+cu130/CUDA 13.0 and live - health `{status: ok, protocol: 3, capabilities: [image_generation]}`. TIPC-09 - is returned independently. -- No main-root installation, activation, default selection, publication, model - unload, real cancellation, or browser run occurred. TIPC-04 and TIPC-10 remain - pending and do not block the returned installed-artifact claim. - -### TIPC-04 and TIPC-10 returned - -- Kept the production-installed candidate in its isolated launcher root after - the managed approval reviewer rejected adding it to the main shared version - store without narrower authorization. An isolated model index used - qualification-only links plus a copied Nunchaku FP4 rank-128 checkpoint; main - runtime and model state remained unchanged. -- Release gateway binary SHA-256 - `97ee58c8042d22fcb27f47b3b07ce54faa7f16cfec050b552b911c03e0a9bcfe` - loaded Nunchaku through exact runtime `0.1.6`. A live 1280×720 request was - disconnected; runtime cancellation was requested at `23:30:56.981` and - completed at `23:30:57.584`. Only afterward, a new request returned a valid - 265,041-byte PNG in 7.276 seconds, SHA-256 - `4fc58b0a9d21b33380006600af8cc26afc8f33577d7cf6b3fc6180937b96d013`. - TIPC-04 is returned. -- Refreshed Tuldok `a61daeec83779868cf03b14fb5c811fcdc608fc2` - completed its required-real browser flow through the same exact candidate: - model discovery, 1280×720 generation/display, save, and automatic temporary - collection import. The prompt-matching result took 10.036 seconds browser - elapsed and 9.553 seconds runtime; saved PNG SHA-256 is - `cdf9ae632f621606032d91975f86f960d546b39349a83ce6b851b50390fb52a3`. - TIPC-10 is returned. Evidence is under - `launcher-data/cache/torch-qualification/tipc-0.1.6-tuldok-real/`. -- Unloaded the model, stopped the profile, and shut down the isolated gateway. - No qualification process remained and GPU occupancy returned to baseline. - TIPC-04, TIPC-09, and TIPC-10 are now all independently returned; publication - and this broader plan's remaining distribution/A1/A5 acceptance stay pending. - -## 2026-09-13 — Brief and implementation plan - -- Moved runtime requirements from `docs/torch-diffusion-runtime.md` to - `docs/breif/torch-diffusion-runtime.md` and made Tuldok prompt-to-image delivery - the objective. -- Created the serial implementation plan with shared installation, Nunchaku - gateway path, Tuldok UI, FLUX.2 and release/feature-gate acceptance. -- Preserved the current loaded-model gateway policy and deferred general gateway - redesign. No implementation, installs, model loads or release builds performed - in this planning task. -- Baseline: the earlier no-default-features cargo check passed; it does not - satisfy future release acceptance. See [baseline](reports/baseline.md). -- Validation: checked local document links and removal of the original document. -- Commit: none requested or created. - -## 2026-09-13 — `start`: M1 implementation - -- Admitted the explicit `start` operation and transitioned the plan from Planned - to Active. M2–M5 remain behind the M1 gate. -- Inspected both dirty checkouts and repository/ancestor instructions. Preserved - the existing Pumas intent/library changes, deleted CI files and Tuldok VLM work. -- Implemented the managed bundle strategy in the shared VersionManager installer, - release filtering, hash-locked packaging, validation, lifecycle guards and - failure/cancellation regression evidence. Corrected the plan's nonexistent - app-manager `config.rs` path to the actual core AppId owner and admitted reuse - of the existing platform non-replacing move primitive. -- Resolved the actual live gateway and queried Pumas hardware telemetry. -- Real package qualification and enabled/disabled release checks are in progress. - No acceptance claim has been promoted from compilation or fixtures. -- Identified the missing published runtime release as a dependency for normal UI - discovery. See [runtime evidence](reports/runtime.md). -- No commits, remote tags, release publication, model acquisition or Tuldok edits. - -### Continuation and cancellation correction - -- The continuation ended prior tool processes before either release build or real - runtime qualification completed; no completed runtime was published. Restarted - them with logs under `launcher-data/cache/torch-qualification/`. -- A repeated cancellation fixture exposed parent-exit/child-exit ordering. The - installer now retains the unreaped group leader, uses Pumas's existing Linux - group observation, waits for all live group members to stop, and reaps last. - The platform helper implementation is reused without changing its semantics. -- The latest app-manager suite passed all 87 tests, including actual Python - relocation after atomic publication and cancellation of the child process. -- Reused the shared Pumas pip cache with hash verification, so future interrupted - qualification attempts can reuse completed artifacts. The installation state - and runtime environment remain isolated from the live Pumas root. - -### Release gate and dependency controls - -- Both Rust release builds completed. Ran the disabled artifact on an isolated - root: healthy library server, no inference HTTP routes or management methods, - and no runtime installation files. Browser control absence remains pending. -- Found and closed an existing in-place dependency repair path for Torch. Its - validated bundle now owns dependency changes; direct-wheel requirement names - are recognized by shared dependency checks. -- Updated live telemetry evidence after the historical serving processes - disappeared across continuation; no competing model was stopped by this task. - -### Sequencing correction for T7 - -The published runtime must include M2 adapters. Deferred M1 public discovery/UI -acceptance until that payload is complete and qualified, avoiding publication of -a known incomplete control-only runtime. M2 source work may proceed while real -package qualification finishes; GPU model loading still requires successful -qualification. No acceptance criterion is removed and no publication is authorized -or performed by this sequencing change. Expanded M2 write set to the existing -provider registry and serving lifecycle owners identified during code inspection. - -### M2 source and real qualification failure - -- Added the concrete offline Nunchaku FP4 adapter, bounded image requests, - synchronous PNG responses, cancellation checkpoints and device-lease ownership. - Added Torch to the existing provider registry and managed runtime-profile path; - load publication uses the existing operation and process-ownership receipt. -- Added the image gateway route under `inference-plugins`, with closed input - validation, response bounds and ready-slot capability filtering. Rust check - passes; host integration and further lifecycle evidence are in progress. -- The first real native import rejected the CUDA 12.8 candidate because the pinned - Nunchaku wheel needs CUDA 13.0. Failed staging was removed, no runtime published. - Started corrected hash-locked qualification using official PyTorch CUDA 13.0. -- Started the existing enabled release on gateway 18767 and acquired the complete - Z-Image base pipeline through `start_model_download_from_hf`. Automatic approval - initially used root-volume free space; checked the actual library volume and - exact payload size, and approval accepted the retry. No alternate downloader or - library mutation bypass was used. -- No image has been generated; A1–A7 remain pending. No Tuldok edits or remote - release publication have occurred. - -### Client implementation during acquisition - -Admitted M3 source work against the documented, fixture-tested M2 contract while -real runtime and model assets transfer. This avoids an idle dependency on a long -library download; real Nunchaku gateway and Tuldok acceptance remain required. -M4 remains after that first real flow. Inspected the current Tuldok checkout before -client edits; no existing VLM changes are to be reverted. - -### Corrected runtime qualification passed - -The production installer completed the CUDA 13.0 candidate: native Nunchaku and -Diffusers imports, real CUDA operation on the RTX 5090 Laptop GPU, sidecar health -protocol 1, atomic publication and installed-version registration. The isolated -runtime is `torch-runtime-0.1.0`. This does not establish model generation or -public shared UI discovery. M3 transport/browser fixtures are active; a closed -HTTP-response socket read was found and corrected before rerunning them. - -### M3 client implementation and runtime successor qualification - -- Added Tuldok bounded image transport, transient cancellation ownership and the - Generate images browser workflow, keeping corner detection settings separate. -- Python tests (21), new image browser fixture, and existing VLM/camera browser - regression pass. Real model acceptance remains pending; see reports/tuldok.md. -- Expanded M3 to the existing frontend provider descriptors and serving decoder: - Torch must not invalidate mixed-provider observations. Torch uses shared profile - controls and the advertised gateway URL. -- Packaged recipe 0.1.1 with current cancellation fixes and started production - installation beside the healthy 0.1.0 baseline. Native dependencies are unchanged. -- Pumas telemetry now reports 311,427,072 / 25,651,314,688 GPU bytes used. Pipeline - acquisition is 28% complete through the existing library authority; no GPU model - has been loaded and no objective acceptance has been marked complete. - -### Release regression and shared control acceptance - -- Fresh disabled release passed route absence and actual Electron control absence. -- Actual Tuldok browser with a complete local Qwen VLM passed suggestion/display/ - save in 80.512 seconds through the new Pumas release. A7 is passed; no diffusion - criterion is marked passed. The test model was unloaded through Pumas. -- Runtime 0.1.1 qualified in isolated and main roots. Actual shared desktop - selection, managed profile start/stop, running-version protection and inactive - removal were exercised. A corrupted candidate preserved the healthy runtime. -- Extended M1 to existing VersionSelector and InstallDialogHelpers after actual - desktop failures showed missing error feedback and missing installed rows when - discovery is empty. Regression tests and live rendering now pass. -- Main pipeline acquisition reached 61.7% (20.29/32.90 GB); paused through Pumas - for a graceful gateway restart to admit the new runtime, then resumed through - the same library authority. Publication/discovery (T7) and real diffusion - acceptance remain pending. - -### Native Nunchaku compatibility correction - -- Native FP4 forward failed despite healthy imports: Nunchaku 1.2 positional - arguments target newly inserted Diffusers 0.37 ControlNet fields. -- Applied diagnosing-bugs with a reduced, weight-free binding reproduction and - real dependency-class regression tests. Named arguments preserve rotary hooks. -- Repeated the actual FP4 GPU forward successfully (finite output, 4.41 GB peak - Torch allocation). This is not PNG or full-pipeline acceptance. -- Packaged corrected runtime 0.1.2, SHA-256 - `37bd65537b51ea7c744d3844ed8213e5d8d802ded474c3c1c83c3229beca8366`, - and started its production installation in the main root beside 0.1.1. -- M3 fixture/client source and A7 regression are done; M2 complete pipeline and - real image acceptance are the immediate gate. M4 implementation remains pending. - -### Runtime 0.1.2 installed; real browser qualification prepared - -- Production installation retry passed native GPU and sidecar health validation. - Shared selection activated 0.1.2, preserving 0.1.1 and unrelated legacy files. -- Paused the library download, confirmed all main-root profiles stopped, and - gracefully restarted gateway 18767 onto release SHA-256 - `209a7cca7af73886e47ee0a2721ecc6b45cc26ceccb05c758085a7b2f5b82377`. - Acquisition resumed through Pumas at 81.4%; no alternate asset writer was used. -- Created managed GPU profile `torch-image-acceptance`. Pumas telemetry reports - 525,336,576 / 25,651,314,688 GPU bytes used before model loading. -- Prepared a real acceptance runner that waits for library completion, loads via - `serve_model`, samples Pumas telemetry and runs Tuldok's actual browser flow. - No image criterion is marked passed before its result and visual inspection. - -### Admit bounded FLUX source preparation during acquisition - -Nunchaku acquisition slowed near 89%. A read-only FLUX checkpoint-header probe -matched all 9,078,581,248 parameters strictly against the installed Diffusers -Klein 9B architecture after its existing conversion. Admit M4 source preparation -while the transfer continues; do not compete with Nunchaku asset acquisition or -change its priority for actual GPU/browser acceptance. Expand M4 only to the -existing Torch serving load DTO and ready-slot filter needed for a second adapter. -This does not establish FP8 scaling correctness or a generated FLUX image. - -### Focus on the usable image workflow - -The user requested reducing excessive verification and prioritizing working Pumas -and Tuldok image inference. Stop expanding the test matrix; use actual workflow -runs to resolve blockers and retain the existing disabled-build/VLM evidence. - -The Z-Image acquisition completed. Its first real Serve exposed T13: duplicate -profile launch and missing startup readiness wait. Corrected the existing Torch -serving owner and started the replacement release build. Runtime 0.1.3 contains -both adapters and is installing through the production shared installer; 0.1.2 -remains active for Nunchaku. FLUX VAE acquisition completed, while Qwen3-8B is -downloading through Pumas. No image acceptance is claimed yet. - -### Real Nunchaku image completed - -The release gateway now loads Nunchaku and Tuldok completes discovery, prompt, -display, PNG download and byte-preserving collection import. The visually checked -teapot/lemon image took 11.047 seconds. A2/A3 are passed. Runtime 0.1.3 installation -also completed; it includes the FLUX adapter and will be activated after unloading -the current 0.1.2 profile. Qwen3-8B acquisition remains in progress for FLUX. - -### Restore the user's visible desktop library - -The user reported the open app showed no models. That was the task's isolated -verification desktop, not the actual model library. Confirmed 88 real library -records, closed that window and moved execution to a desktop opened on the main -root with the current release. The desktop owns gateway -`http://127.0.0.1:42893/v1`; the earlier task gateway 18767 was shut down gracefully. -Paused/resumed Qwen through Pumas around this transition, selected installed -runtime 0.1.3 and restored Nunchaku serving. Tuldok is available on localhost 8091 -with its existing collection. The user was given the current gateway address. - -### FP8 encoder conversion and library naming - -The user requested converting the downloaded BF16 encoder, making its FLUX role -obvious in the library, and supporting FP8 Safetensors in Pumas's existing -conversion tool. A one-off model-specific script was removed after the user's -correction. Its temporary output demonstrated native FP8 prompt encoding and -9,436,626,944 bytes of weights versus 16,381,516,776 source bytes; that is not -yet FLUX image acceptance. Both variants received explicit FLUX text-encoder names -through library import/review APIs. - -Admit existing conversion owners (`pumas-core/src/conversion/`), RPC conversion -decoders and generated desktop contract, and existing conversion dialog/workflow -to this slice. Add a general CPU conversion backend producing Transformers -128x128 block-scaled FP8 Safetensors, sharing setup, cancellation, atomic output -and library registration. No model-specific converter or separate serving updater. -The serving resolver prefers an FP8 variant while retaining its BF16 source. -The existing dependency badge describes dependency bindings; model-component -grouping/hiding is not implemented by renaming and remains a separate UI decision. - -### FP8 conversion completed through the existing desktop workflow - -The actual Pumas dialog selected Safetensors (FP8), installed the CPU backend -through its existing setup owner, and completed `conv-1` in 43.132 seconds. -Output `llm/qwen3/qwen--qwen3-8b__files_97c4978527af-fp8` contains 9,437,473,248 -weight bytes and original-source conversion provenance. The prototype import -and staging weight copy were removed; the original BF16 package remains. -Both retained entries visibly identify FLUX.2 Klein 9B and text-encoder precision. - -A native load and real FLUX image using this Pumas-converted encoder passed in -14.174 seconds, with a visually correct teapot/lemon image (`flux-fp8-native.png`). -This is supporting evidence; the final release-gateway/Tuldok run remains pending. -The first gateway load exposed a directory-valued VAE descriptor. The serving -owner now resolves the known standalone VAE file within the validated package. -Also corrected conversion source-name hydration from indexed columns and retained -source classification in derived metadata, avoiding lost names/unknown model type. -The final combined release is building. - -### Final FLUX/Tuldok FP8 workflow passed - -Activated the combined release `b11742c95e7dc68d82abd790618a6cba9e012dbc95e7c8ad8cb60f9165b45b74` -in the actual desktop. Both image models load through gateway 38035/v1. -Tuldok discovered FLUX, generated, displayed and saved/imported matching PNG -content in 8.843 seconds. The image was visually checked. A4 and A6 are passed -with the evidence and artifact limitations in their reports. The BF16 source -and the clearly named, Pumas-converted FP8 encoder remain in the library; the -prototype duplicates are removed. Public distribution and remaining A5 GPU -fault acceptance remain open; no publication or full-plan completion claimed. - -### User extension: FP4 conversion - -Reusing the existing NVFP4 backend and conversion direction. Added NVFP4 to the -format dialog and shared backend setup/readiness flow. Replaced the previous -FP8 recipe mutation and fake-quantized save with Model Optimizer's NVFP4 recipe -and packed Hugging Face export. Dependencies are pinned; no model-specific -script or separate updater is introduced. The current FLUX encoder remains FP8. -A real small Qwen3 conversion produced seven packed U8 weight tensors with -NVFP4 scales; saved-output reload and release/UI verification are in progress. - -The packed small-model output passed ModelOpt reference dequantization, strict -parameter reload and a finite GPU forward. This is a storage roundtrip, not -native FP4 inference. Release `8ec4a7a156ff4b250e174ff3e75cc7b992547ec7c8d11e4128bcc1c48c113d70` -is running; the actual desktop shows NVFP4 and its managed setup status. Both -image models are restored at gateway 40209/v1, with FLUX still using FP8. See -[FP4 evidence](reports/fp4-conversion.md). No repeated broad diffusion tests. - -Actual NVFP4 setup exposed a download-budget issue: CUDA wheels exceeded the -shared 15-minute command limit and were downloaded again on retry. The NVFP4 -recipe now selects a bounded 45-minute install budget through the same setup -runner; other backends retain their previous budget. Retained completed NVIDIA -wheels only after official PyPI hash verification for the local retry. Final -release with the adjusted recipe is building. - -The final setup received the verified wheel-cache location and proceeded to the -Torch wheel. An older pip process survived the desktop restart as an orphan -(PPid 1, process group equal to PID). Stopped only that verified task-owned -group; it had not installed packages yet. Recorded T16 at the existing desktop -shutdown boundary instead of expanding this conversion-format slice. - -### FP4 conversion extension complete - -Final release `a64bfc5d0574b6d8fdb3a6466c60d5a8857e13996e1a18f00bde698494a6852e` -is running at gateway 43571/v1. Managed NVFP4 setup completed and the live backend -reports ready. Its deployed converter passed a real small-model packed export, -strict saved-weight reload and finite GPU forward via reference dequantization. -Both image models were restored with FLUX using FP8. The 8B encoder packages are -unchanged. This does not claim full 8B NVFP4 conversion or native FP4 encoder -serving. See [bounded evidence and remaining limitations](reports/fp4-conversion.md). -No additional desktop restart or broad test matrix was run merely to capture -another screenshot. Public distribution, A5 and the recorded T16 follow-up remain -open; the requested general FP4 conversion extension is implemented and usable. - -### Commit isolation verification (2026-09-14) - -Prepared candidates from committed HEAD in plain temporary directories, excluding -the concurrent intent API/storage changes and unrelated Tuldok corner UI edits. -Conversion candidate: 23 focused frontend tests and type checking passed; its -Rust contract exporter built with inference disabled. VLM candidate: both -dedicated and router sibling-projector tests passed. Torch candidate: enabled -RPC cargo check and disabled contract-export build passed; frontend type checking -and 58 focused runtime/serving tests passed. Shared platform helper visibility -is included because the runtime installer consumes those existing helpers. - -Tuldok image candidate: five transport tests and the actual browser fixture -passed display, byte-identical save/import and cancellation. Committed as -`9361773`; conversion is `ad3071d6`, projector resolution is `444eaac9`, -and private runtime/repair ignore rules are `f174a54c`. Contract output was -regenerated from the isolated Rust schema using the repository's normal Electron -working directory. These checks establish commit independence, not a new -release/GPU qualification; earlier real image and disabled-release evidence -retains its explicitly recorded artifact scope. Overall plan acceptance is -partial: public distribution, remaining fault acceptance and T16 remain open. - -### Commit-message correction (2026-09-14) - -The user identified missing explanatory bodies in the five new local commits. -Reworded only those unpublished commits on each repository's main branch, -without changing any commit tree. The original tips remain recoverable under -`refs/archive/before-message-correction-20260914` in each repository. Both -working-tree diffs and complete porcelain status were identical before and -after applying the correction. Hooks remained enabled. - -| Repository | Original commit | Message-corrected commit | -| --- | --- | --- | -| Pumas | `f174a54c90c72a560c479440358d79d403592766` | `b58ff8ac7da9a4312b5932588b2f580a4c15454a` | -| Pumas | `ad3071d6dd15f67a4e02339e0cb5256064f04426` | `ea9752885309dc55f015dc270fe04992d3da6704` | -| Pumas | `444eaac9764051b01b0fdc3e4718f2bcd421bb50` | `b284e5865d6bd6d3d54f1013a701cced2f61216e` | -| Pumas | `40d47964572462e38875827a2205555fc3039c61` | `baa4f4c2f7c48203bb254b6c15fff6070c73cc01` | -| Tuldok | `9361773d4a21d42be0ce10fc483388a262a6aeb1` | `a70f374218684cd9d8f050ba7b81a50013c11fac` | - -These mappings supersede the commit IDs in the preceding preparation entry; -the recorded runtime artifact hashes and test results are unchanged. Temporary -rewording clones have no unique commits after integration; main retains every -replacement, and the archive refs retain every original. - -The remaining Tuldok labeling changes were committed separately as `2617b72` -after 21 Python tests and the local browser regression passed. The local intent -API was committed as `22388e70` after its focused verification recorded in that -plan's ledger. Four pre-existing Pumas file deletions remain uncommitted pending -clarification of their intent. - -### A1/A5 continuation (2026-09-22) - -Work is isolated on `work/torch-runtime-a1-a5`, based on merged PR #1 at -`516ad94aabbfc4f82fc7c72719f46d7dd4fd63d0`. A1 source review found the shared -Torch version controls, validated installation flow, independent active-version -marker, and failure-preservation paths already present. The app-manager tests -(107 passed) and full frontend suite (678 passed) also passed on this baseline. -Public catalog discovery remains unaccepted: the last release inventory check -in this task found only the general Pumas releases `v0.7.0` through `v0.1.0`, -with no `torch-runtime-*` release. A1 remains pending; no publication or -runtime-default change is claimed. - -A5 coverage now includes public gateway responses for `runtime_busy` (409), -`model_unavailable` (503), and admitted transport loss (`backend_failure`, 502) -with one generation admission and no replay; public `serve_model` coverage for -a missing Nunchaku checkpoint after generic validation succeeds; and the -registered Python image route using the real manager lease with unavailable, -busy, backend-failure, and subsequent-success outcomes. The missing-checkpoint -fixture retains an unrelated selected-artifact boundary so it reaches Torch's -asset resolution rather than stopping at generic artifact validation. Failed -loads remain visible as `failed` rows and are not reported as loaded. - -The full Rust check passed. Focused RPC tests passed (3 gateway, 1 missing -checkpoint), the Torch image-provider boundary module passed (6), Ruff check and -format checks passed, and Rust formatting plus `git diff --check` passed. The -Python route test invokes the registered handler directly because the local -test environment lacks an ASGI test client. These fixtures do not establish -real GPU OOM recovery or managed sidecar process-death/restart cleanup; those -A5 acceptance cases remain open. The final `nvidia-smi` check could not -communicate with the NVIDIA driver, so GPU fault qualification was unavailable. -No production defect was exposed by this source-and-caller review. - -### A1 cancellation and A5 managed Torch exit follow-up (2026-09-22) - -A1 now has a deterministic cancellation-during-validation regression. The -validator starts a child and signals readiness before cancellation. The test -checks that the candidate and staging directory disappear, the validator child -is no longer computing, the previous runtime files and installed metadata are -byte-identical, and `.active-version-torch` is unchanged. After reconstructing -`VersionState`, the previous tag remains the active valid install and its -fixture `serve.py` sentinel runs under that version's `venv/bin/python`, checking -its recipe, required files, interpreter version, and virtual-environment prefix. -The focused test passed; the full Rust check includes all 108 app-manager tests. -This proves the cancellation-preservation path with a valid fixture sidecar, -not startup or GPU usability of a published runtime. - -A5 now has a CPU managed TorchServe child test that publishes a Torch serving -row alongside an unrelated profile row, signals natural child exit, waits for -the terminal cleanup result, and drains the owner. Before the fix the row -remained after cleanup. Non-router managed sessions now retain and join a -terminal-only observer; it invalidates serving state and publishes -`ModelUnloaded` only after the process group is confirmed clean, using the -existing generation fence. The test verifies that the unrelated row remains. -The existing stopped/replaced-generation regression still passes. Review -confirmed that failed cleanup sends `Some(false)`, retains the child in owner -custody, and blocks replacement; no separate cleanup-failure injection fixture -was added. - -`./scripts/rust/check.sh` passed after the sandboxed run first returned `EPERM` -for loopback HTTP fixtures and the same local check was rerun with localhost -socket permission. This covers formatting, all-feature checks and Clippy, -workspace tests, doc tests, and the no-default-features check. `nvidia-smi` -still cannot communicate with the NVIDIA driver. Real GPU OOM recovery remains -unverified; A1 public catalogue and normal UI install/update acceptance still -require a qualified, published `torch-runtime-*` bundle. No bundle was -published, no runtime default changed, and no tag was created. - -### A1/A5 local lifecycle and route regressions (2026-09-22) - -A1 now has a manager-level offline install/update lifecycle test using the real -`VersionManager` and installer, a seeded `ReleasesCache`, and loopback bundle -and checksum assets. It verifies Torch release filtering, installation and -terminal progress cleanup for two versions, activation under the Torch-specific -marker, unchanged llama marker and unset default, refusal to remove the active -version, and removal of the inactive version. A TorchPanel integration fixture -starts with no available releases, then has the shared refresh action populate -the release fixture before exercising install, activation and removal; it also -confirms activation does not set a default. These fixtures establish local -manager/UI behavior only; they do not establish public catalogue availability -or usability of a published bundle. A1 remains pending until the qualified -runtime is published and the normal UI path is checked. - -A5 source review confirmed that the registered image route previously caught -admission errors around both lease acquisition and adapter execution, so an -admitted adapter `KeyError`, `ValueError` or busy-text `RuntimeError` could be -reported as 503, 400 or 409. The route now scopes those mappings to -`image_lease` admission while retaining the lease around owned generation. -Registered-route tests verify true admission errors retain their 503/400/409 -responses, the three admitted adapter errors produce sanitized 502 responses, -synthetic CUDA OOM remains 507, and a delayed synthetic OOM keeps the real -device lock while blocked, rejects a concurrent request as busy, returns 507 -only after worker termination, releases the lock, and permits a later explicit -request. Existing owner-cancellation coverage continues to verify that -cancellation does not release the lease while the worker is active. - -The new manager lifecycle test passed; `./scripts/rust/check.sh` passed with -localhost socket permission after its sandboxed run failed on loopback binding. -The frontend suite passed (118 files, 679 tests) and TypeScript checking passed. -The image boundary module passed (8 tests) under a test-only direct executor -shutdown harness. The exact Python unittest command hangs in this host's Python -3.12.3 `asyncio.run()` executor shutdown; a minimal `asyncio.to_thread` script -reproduces that environment issue. Ruff check/format and `git diff --check` -passed. Independent review found no blocking regression in the four-file code -scope at this checkpoint. Real GPU OOM recovery was still unverified then; the -later allocator recovery run is recorded below. - -For inherited Passeur task `e4323220-4f72-4b5e-9194-4e7c308abcc4`, the user -confirmed attachment and the task is visible to this session at control -generation 2. Its result still reports `cancelled`, no changed files, -`worker_stop=unconfirmed`, an unknown native run with outstanding obligations, -and three permission inputs with delivery unknown. `passeur_prepare` continues -to report `PROJECT_NEEDS_RECONCILIATION`; coordination remains frozen. The -task worktree is clean at its recorded base commit and no matching Muse run -process appears in the host process table, but these observations do not confirm -native shutdown. Inspecting each old permission input returns `STALE_INPUT`, -while the task snapshot still lists delivery unknown. The stale permissions -were not approved and no new Passeur task was accepted. Native collaboration -agents performed the implementation and review. - -### A1 globe refresh and A5 real CUDA OOM recovery (2026-09-22) - -The shared version manager now waits for initial version loading, then forces a -catalogue refresh when opened from the version-selector globe. It keeps the -manager loading state until that request completes, so cached releases are not -offered as current install choices during refresh. A regression first failed -because opening the manager made zero forced refresh calls; it now holds a -cached release fixture behind the startup and forced refreshes, then checks that -the entry appears and preserves the manual Refresh action. The complete frontend -suite passed (118 files, 679 tests), TypeScript checking passed, and -`git diff --check` passed. A fresh release/tag inventory still contains no -`torch-runtime-*` release with the required runtime archive and checksum, so the -live manager correctly has no remotely installable Torch release to display. -The active launcher remains on 0.1.4 with 0.1.1–0.1.4 installed and no default. -A1 remains pending publication and normal shared-UI installation of a qualified -bundle. - -A5's remaining real-GPU recovery case passed on the RTX 5090 Laptop GPU using -the isolated `torch-runtime-0.1.6` environment (archive SHA-256 -`74f9b593dff1e447a73571dc465efd520238ba0c56d2730393a17eee2b97426c`) and the -real Nunchaku Z-Image-Turbo model. For the test only, the isolated sidecar was -overlaid with the current branch's Torch source and a one-shot fault hook that -requested the currently free CUDA memory plus 256 MiB from `torch.empty`; no -large image dimensions or host allocation were used. Through the public Pumas -image gateway, the first request returned sanitized HTTP 507 -`out_of_memory`. A separate request then generated a decodable 512×512 PNG -(302,715 bytes, SHA-256 -`cddd2386cb8ca5105325aca2d202db68885dd71402dca04f55949b87f379120d`) in -10.309 seconds using the same loaded model. The profile remained healthy after -the OOM; model unload and profile shutdown succeeded. GPU memory returned from -657 MiB before the run to 662 MiB after cleanup, with only the existing desktop -process using CUDA. The main runtime's installed versions, active 0.1.4, and -unset default were unchanged. The candidate's 15 source files were restored and -SHA-256 checked after the test; no runtime was published, tagged, or selected -as the main default. This demonstrates an actual CUDA allocator OOM and -post-OOM inference recovery, not a naturally induced high-resolution pipeline -OOM. See [the A5 GPU report](reports/a5-gpu-oom-recovery.md). - -### Terminal observer error propagation (2026-09-22) - -A review of T20 found that both retained router-observer tasks discarded errors -from the generation-guarded serving invalidation. The observer tasks now return -`Result<()>`, and `drain_session` records returned failures and join failures in -the existing observer-error state while completing worker and observer cleanup. -Serving invalidation still goes through the current-generation fence; a stale -observer remains a no-op, and an observer panic is rethrown after the terminal -update attempt. - -Registry-poison regressions verify that terminal invalidation errors from both -observer variants are observable, that draining records the session as failed, -and that repeated draining retains the failure. The TorchServe natural-exit -invalidation, replacement-generation rejection, observer join-failure, and -already-stopped observer tests also passed. The six focused `pumas-library` -tests, `cargo fmt --manifest-path rust/Cargo.toml --all -- --check`, -`./scripts/rust/check.sh`, and `git diff --check` passed. The full gate needed a -test-only lexical-scope correction after its first run identified -`clippy::await_holding_lock`. -These tests make a failed generation lookup visible; they do not repair a -poisoned registry or bypass its ownership check to clear serving state. - -### PyTorch upstream discovery and installer publication boundary (2026-09-23) - -The prior assumption that A1 requires a Pumas-hosted `torch-runtime-*` release -was incorrect. Torch discovery now targets the official `pytorch/pytorch` -repository and exposes only the qualified `v2.9.1` tag. That tag maps to the -independent recipe `torch-upstream-2.9.1-r1`; the app embeds its sidecar and -dependency lock and installs the direct SHA-256-pinned Torch and torchvision -wheels from the official PyTorch wheel host. Other upstream tags remain hidden -until their full app recipe is qualified. The PyTorch GitHub source archive size -is not presented as an install size. The prior historical Pumas-bundle -qualification remains historical evidence only. - -Fixtures verify supported/unsupported release filtering, no dependence on -Pumas bundle assets, embedded sidecar materialization outside the checkout, -official wheel URLs and hashes, rejection before staging, and preservation of -installed `0.1.1`–`0.1.4`, active `0.1.4`, and unset default. Torch cancellation -accepted by `VersionManager` and the publication transition now compete through -one atomic state change; once publication begins, manager cancellation returns -false without setting the cancellation flag. A per-installer attempt lock also -rejects a concurrent direct call before it can alter the active attempt, with a -deterministic publication regression. The constructor documents that direct -stores to its cooperative cancellation flag have no acceptance result and may -arrive after the final cancellation checkpoint. - -`cargo fmt --manifest-path rust/Cargo.toml --all -- --check`, all-target -`pumas-app-manager` Clippy with warnings denied, the 111-test app-manager suite, -`./scripts/rust/check.sh`, and `git diff --check` passed. The full Rust script -ran with localhost socket permission for its fixtures; the workspace library -suite reported 1,415 passed and 6 ignored. No native GPU qualification was -rerun because these changes do not alter the qualified runtime or A5 GPU path. -A1 still needs packaged-app discovery and fresh shared-UI installation -acceptance; this does not require publishing a Torch release through Pumas. -The recorded A5 allocator OOM and subsequent inference recovery evidence is -unchanged, including its limitation that the fault was not a naturally -oversized diffusion request. Installed versions, active version, default, -runtime publication state, and tags were not changed. - -### Packaged upstream Torch discovery and lifecycle acceptance (2026-09-23) - -Built the Linux x86_64 AppImage from source commit -`5d373bf8791c43f1b995f4ba51a17da1610a6686`; artifact SHA-256 is -`74d6c6143c5342a9492f7afbc30b301f751f870aca04ec05f231ff6ee140f71c`. The -packaged app used an explicit isolated launcher root and separate Electron -profile. The Torch globe fetched 69 `pytorch/pytorch` releases and displayed -only installable `v2.9.1`, the sole tag mapped to a qualified recipe. A fresh -shared-UI install registered `torch-upstream-2.9.1-r1`, Python 3.12.3, -`dependenciesInstalled: true`, and the official SHA-256-pinned CUDA 13.0 Torch -wheel. The installer validated recipe identity, imports, GPU, and sidecar health. -The profile started from the packaged Torch UI, returned HTTP 200 from -`/health` with protocol 3 and `image_generation`, stopped normally, and remained -stopped after app restart. - -A second disposable root held a physical copy of the host's installed -`torch-runtime-0.1.4`; the host runtime was never modified. Its UI-managed -profile returned HTTP 200 with protocol 1 on the RTX 5090 Laptop GPU. A v2.9.1 -install was started from the version row and cancelled from the UI confirmation -while locked dependency setup was in progress. The manager returned to one -installed version; the staging directory and child process were gone, metadata -and the active marker still selected `.1.4`, and the default remained unset. -After restart, the UI still showed `.1.4` installed and v2.9.1 available. - -The same isolated root then completed a fresh v2.9.1 install through the UI. -With both versions registered, the selector activated v2.9.1; its managed -sidecar returned HTTP 200 with protocol 3 and `image_generation` on the RTX -5090. After stopping the profile, the UI removed the inactive copied `.1.4` -runtime. Restart retained v2.9.1, its active marker and last-selected value; -the profile was stopped and the default remained unset. The host root remained -at installed `.1.1`–`.1.4`, active `.1.4`, and no default. Temporary package, -runtime, and profile data were removed after recording the evidence. - -A1 passed for the currently qualified recipe, including migration from the -existing installed runtime, cancellation preservation, activation, removal, -and restart recovery. This does not claim an upgrade between two different -PyTorch upstream tags because only v2.9.1 currently has a qualified recipe. -No Pumas runtime release or tag was created, and no default runtime was changed. -The A5 GPU OOM and post-OOM inference evidence remains as recorded in -`reports/a5-gpu-oom-recovery.md`; it was not rerun for this packaged UI check. - -### A1/A5 acceptance closeout and lifecycle serialization (2026-09-23) - -The packaged A1 trace above is sequential and uses the AppImage built from -baseline source commit `5d373bf8791c43f1b995f4ba51a17da1610a6686`. An -independent source review found concurrent selection/removal races in the -shared `VersionManager`: `remove_version` checked active state and then released -the state lock before deleting files, while `set_active_version` did not share -the removal lock. A later review found default selection could validate stale -installed state after metadata deletion and before refresh. All three operations -are exposed as separate RPC requests. - -`VersionManager` now has a dedicated lifecycle mutex. Active and default -selection acquire lifecycle before state; removal acquires install, then -lifecycle, then state. This serializes selection with deletion without making -selection wait behind a long download or changing public RPC interfaces. -Deterministic Torch manager tests force removal-first active and default -selection interleavings, then verify that setters reject the deleted tag after -cleanup. The selection-first check verifies active removal refusal; default-first -removal clears the default. The tests verify runtime files, Torch metadata, -`.active-version-torch`, default selection, and reconstructed state. Removing -either selection lock made its forced removal-first regression fail; restoring -both made them pass. - -Root acceptance passed: `cargo test --manifest-path rust/Cargo.toml -p -pumas-app-manager version_manager::tests:: -- --nocapture` (14 passed), -`cargo fmt --manifest-path rust/Cargo.toml --all -- --check`, -`./scripts/rust/check.sh` (exit 0, workspace tests, doc tests, lint and -feature-gate checks), and `git diff --check`. Native GPU qualification was not -rerun because the change only serializes active/default selection and removal. -A1 is accepted from the recorded packaged sequential trace plus the -current-source concurrency regressions. A5 remains accepted within its recorded -controlled CUDA allocator OOM/recovery and lifecycle scope; it does not establish a -naturally oversized pipeline request. No runtime was published or tagged and no -default was changed. diff --git a/docs/plans/torch-diffusion-serving/issues.md b/docs/plans/torch-diffusion-serving/issues.md deleted file mode 100644 index 5a4282cec..000000000 --- a/docs/plans/torch-diffusion-serving/issues.md +++ /dev/null @@ -1,29 +0,0 @@ -# Issues - -| ID | Severity | Evidence / objective impact | Owner / boundary | Disposition | Verification / revisit | -| --- | --- | --- | --- | --- | --- | -| T1 | High | An upstream PyTorch release tag alone does not identify a complete serving recipe | App manager / installation | Resolved for `v2.9.1` with a separate recipe identity and embedded sidecar; packaged discovery, install, migration, activation, removal, cancellation preservation, and restart acceptance passed | [Packaged upstream acceptance](reports/a1-packaged-acceptance.md); an upgrade between two different PyTorch upstream tags awaits a second qualified recipe | -| T2 | High | Torch and torchvision must resolve to the exact qualified official wheels, not source archives or mutable package choices | Runtime packaging | Implemented with direct official wheel URLs and SHA-256 pins for the Linux x86_64 / CPython 3.12 recipe | Artifact hashes and GPU startup; re-plan if unavailable | -| T3 | High | Standalone checkpoint availability does not establish all matching pipeline assets | Library and Torch adapters | Resolved: both complete pipelines generate; encoder converted via Pumas | Exact component identities and successful real pipeline loads | -| T4 | High | Tuldok's existing local-model client sends VLM chat requests, not image generation | Tuldok / HTTP and browser | Fix in M3 | Real prompt, displayed image and saved decoded content | -| T5 | Medium | 24 GB VRAM is shared with other inference; full pipeline fit and latency require exact-candidate evidence | Serving lifecycle | Resolved: exact-candidate inference and cancellation/reuse passed; a controlled CUDA allocator OOM returned a sanitized 507 and a later real generation succeeded | [GPU OOM recovery](reports/a5-gpu-oom-recovery.md), [Nunchaku GPU evidence](reports/nunchaku.md), and TIPC-04 | -| T6 | Low | LLaDA and other platforms are not qualified for this implementation | Runtime adapter owner | Defer | Revisit after primary flow acceptance and user prioritization | -| T7 | High | The manager pointed Torch discovery at the Pumas repository and filtered out official upstream releases; the globe must show installable supported PyTorch tags | Runtime distribution | Fixed and packaged acceptance passed: discovery targets `pytorch/pytorch`, and only qualified v2.9.1 is installable. No Torch release or tag is published by Pumas. | Official release fixture and [packaged upstream acceptance](reports/a1-packaged-acceptance.md); broader upstream-to-upstream updates await another qualified recipe | -| T8 | Medium | Shared install mutex previously ended when the background task was spawned; release failure could leave a phantom installing tag | App manager lifecycle | Fixed in M1 | App-manager regression suite | -| T9 | High | Torch activation previously wrote llama.cpp's `.active-version` marker | App manager selection | Fixed in M1 with a Torch-specific marker inside shared state management | Marker-preservation regression | -| T10 | High | Real Nunchaku wheel import requires libcudart.so.13; CUDA 12.8 candidate rejected before publication | Runtime recipe | Resolved with official Torch 2.9.1 CUDA 13.0; real imports, CUDA execution and protocol-1 health passed | Real imports, CUDA operation and sidecar health | -| T11 | Medium | Full base-pipeline acquisition is 30.64 GiB and current transfer is slow | Library acquisition | Completed through Pumas authority; real Nunchaku and FLUX images passed | Complete validated library bundle before model loading | - -| T12 | High | Nunchaku 1.2 positional forward arguments bind to Diffusers 0.37 ControlNet fields; native FP4 forward raises TypeError | Torch adapter compatibility | Fixed by a narrow subclass preserving rotary hooks and naming Diffusers arguments; native kernel pass and focused tests passed | Resolved: complete Nunchaku pipeline and real Tuldok workflow passed | -| T13 | High | Real Serve on an already-running managed Torch profile tried to launch it again; newly launched profiles also lacked a health wait | Torch serving lifecycle | Reuse the current owned process observation; wait for owned listener and health before load | Resolved: actual release Serve and Tuldok image flow passed | - -| T14 | Medium | Standalone VAE download resolves to a package directory | Torch serving asset resolution | Fixed: resolve the known VAE file within the validated package | Final release FLUX/Tuldok FP8 image passed | -| T15 | Medium | Conversion metadata omitted indexed source names and labeled non-GGUF output as GGUF | Existing conversion pipeline | Fixed: hydrate column-owned identity, label the actual format, retain source classification | Real FP8 conversion, visible final encoder names, final release build | - -| T16 | Medium | Restarting the desktop during active NVFP4 setup left the previous pip process orphaned (PPid 1, own process group) | Existing Electron/backend shutdown boundary | Operationally stopped the verified task-owned orphan before either installer wrote packages; current setup continues. Broader shutdown fix deferred from conversion-format scope | Revisit desktop shutdown while dependency setup is active; root setup unit evidence alone did not cover this actual desktop path | -| T17 | High | Prospective image deadline instructions conflict with the generation-wide no-elapsed-deadline contract | Torch Image Provider Contract Correction plus this plan's Tuldok/candidate handoffs | Resolved: the focused plan owns shared generation lifetime and the Pumas/Torch image compatibility/result/projection correction; Tuldok removed its remaining deadline and TIPC-04/TIPC-09/TIPC-10 passed | Exact installation, real GPU cancellation/reuse, and 1280×720 browser evidence passed; historical reports retain their original scope | -| T18 | High | Original M3 was marked completed before the newly delegated Tuldok deadline removal and exact-candidate 1280×720 evidence existed | M3-TIPC companion | Resolved without relabeling original evidence: `M3-TIPC` completed independently at Tuldok `a61daeec` | 47 focused/full Tuldok tests plus exact-candidate 1280×720 browser display/save passed | -| T19 | High | Production installer rejected the protocol-3 recipe's required `capabilities` field before dependency setup | App-manager immutable recipe qualification | Fixed in Pumas `ab3a95a9`: decode additive capabilities and require `image_generation`; candidate bytes unchanged | Focused red/green regression, 107 app-manager tests, and exact `0.1.6` production installation/native validation passed | -| T20 | Medium | Natural exit of a managed TorchServe child completed process-group cleanup but left its served-model row visible because terminal invalidation only ran through the llama.cpp router observer | Managed runtime lifecycle / serving state | Fixed on `work/torch-runtime-a1-a5`: retain and join terminal observers for both non-router and router profiles; invalidate only after confirmed cleanup through the current-generation fence; surface update failures as failed drains | CPU child-process regression checks row removal, `ModelUnloaded` update, and preservation of another profile's row; registry-poison tests verify both observer variants report failed generation lookup and drain state becomes failed; replacement-generation rejection remains covered | -| T21 | High | The private image route applied admission error mappings to admitted adapter execution, so adapter `KeyError`, `ValueError`, and busy-text `RuntimeError` could be exposed as 503, 400, and 409 | Torch image-provider error boundary | Fixed on `work/torch-runtime-a1-a5`: scope 503/400/409 mapping to lease admission; map admitted adapter failures to sanitized 502 while preserving OOM 507 | Registered-route regressions cover all three ambiguous adapter errors, true admission errors, immediate and delayed synthetic OOM, device-lock custody, and subsequent reuse; image boundary module passed 8 tests | -| T22 | High | Concurrent active/default selection could target an installed runtime after removal checked it but before filesystem and cached-state cleanup completed | Shared `VersionManager` lifecycle | Fixed with a lifecycle mutex serializing active/default selection and removal while keeping selection independent of long-running installs | Deterministic Torch tests cover removal-first active/default races, sequential active-selection-first refusal, default-first removal, metadata, markers, files, and reconstructed state; app-manager and Rust checks | diff --git a/docs/plans/torch-diffusion-serving/plan.md b/docs/plans/torch-diffusion-serving/plan.md deleted file mode 100644 index 2901db8d3..000000000 --- a/docs/plans/torch-diffusion-serving/plan.md +++ /dev/null @@ -1,409 +0,0 @@ -# Plan: Tuldok Image Generation Through Pumas - -**Plan status:** `Completed` - -**Current phase:** A1–A7 acceptance is complete within the limits recorded in the evidence reports. A1 includes packaged upstream discovery and migration plus concurrent active/default selection and removal regression coverage. A5 includes CUDA allocator OOM and recovery, without claiming a naturally oversized pipeline request. - -**Next slice:** No acceptance work remains in this plan. Native NVFP4 encoder serving, T16 desktop shutdown, LLaDA, other-platform qualification, and the broad gateway redesign remain deferred follow-ups. - -**Independent companion preparation:** `M3-TIPC` source is complete in Tuldok -`a61daeec83779868cf03b14fb5c811fcdc608fc2`. Exact -`torch-runtime-0.1.6` candidate -`74f9b593dff1e447a73571dc465efd520238ba0c56d2730393a17eee2b97426c` -passes production installation and native GPU/sidecar validation; TIPC-09 is -returned. Real cancellation/reuse on the RTX 5090 Laptop GPU returns TIPC-04, -and the refreshed Tuldok 1280×720 display/save run returns TIPC-10. This does -complete the M3-TIPC real acceptance gate; no runtime publication was required. - -**Acceptance status:** `Accepted` - -**Brief:** [Torch diffusion serving](../../breif/torch-diffusion-runtime.md) - -**Execution ledger:** [execution-ledger.md](execution-ledger.md) - -**Issues:** [issues.md](issues.md) - -**Evidence:** [Baseline and evidence index](reports/baseline.md) - -**Provider correction dependency:** The -[Torch Image Provider Contract Correction](../torch-image-provider-contract/plan.md) -is the sole implementation owner for the reusable generation lifetime and image -live compatibility, private result-evolution, and public projection correction. -This plan retains Tuldok companion adaptation, exact corrected-candidate -qualification, required-real GPU/browser evidence, and distribution. Its -historical evidence remains valid only for the scope and bytes originally -recorded. - -## Objective - -From Tuldok, a user selects an image-generation model served by Pumas, submits a -prompt, and receives an image that is displayed and can be saved for dataset -work. Deliver this using the shared runtime installer and an inference-enabled -Pumas release, while preserving the optional inference-free serving build. - -## Objective acceptance - -| ID | Observable criterion | Kind | Environment | Mode | Status | Evidence | -| --- | --- | --- | --- | --- | --- | --- | -| A1 | Shared runtime controls discover, install, activate, update and remove Torch; failed/cancelled installation preserves the usable version | integration | isolated install root; network for real artifacts | automated and manual | passed | [Packaged upstream acceptance](reports/a1-packaged-acceptance.md) | -| A2 | Nunchaku Z-Image-Turbo produces a decodable PNG through the Pumas gateway; capability discovery excludes text-only models from image selection | integration | RTX 5090 Laptop GPU, complete pipeline | automated and manual | passed | [Real image](reports/nunchaku.md) | -| A3 | Tuldok discovers a served image model, sends a prompt, displays the returned PNG and saves matching image content | end-to-end | real browser, Tuldok, Pumas release, GPU | automated and manual | passed | [Real Tuldok workflow](reports/tuldok.md) | -| A4 | The local FLUX.2 Klein FP8 checkpoint generates through the same Tuldok flow with its memory policy reported | end-to-end | same host, verified matching assets | manual | passed | [FLUX.2 FP8 image](reports/flux2.md) | -| A5 | Invalid inputs, missing assets, OOM, busy/unloaded model, cancellation and runtime exit terminate predictably without corrupting lifecycle or duplicating generation | integration | fault fixtures plus GPU cancellation and recovery | automated and manual | passed | [GPU OOM recovery](reports/a5-gpu-oom-recovery.md), [GPU cancellation and reuse](reports/nunchaku.md), and A5 route/lifecycle fixtures in the execution ledger | -| A6 | Inference-enabled release works; disabled build has no Torch/llama.cpp serving or management routes and no installation/startup side effects or controls | artifact and integration | enabled and disabled release builds | automated and manual | passed | [Release evidence](reports/release-acceptance.md) | -| A7 | Existing llama.cpp installation/serving and Tuldok VLM corner detection still work | regression | fixtures plus available Qwen VLM | automated and manual | passed | [Real VLM and fixture evidence](reports/tuldok.md), [shared manager tests](reports/runtime.md) | - -## Scope and constraints - -- Implement runtime packaging, installation, diffusion adapters, serving lifecycle, - gateway contract, Pumas controls, Tuldok integration, and release verification. -- Reuse VersionManager and its state/progress/cancellation infrastructure. Only - source resolution and installation mechanics vary by runtime. -- Use the existing `inference-plugins` gate and launcher configuration. Python - dependencies remain external to the Rust executable. -- Target the verified Linux RTX 5090 Laptop GPU (approximately 24 GB VRAM) first; - reject unsupported platform combinations clearly. Other-platform qualification - is a follow-up, not an untested promise. -- Preserve concurrent unrelated repository changes and the current model-library - mutation authority. Acquire pipeline assets through that authority. -- Model weights, runtime releases and serving state have distinct owners. -- First version returns one PNG per request. Image editing, batches, streaming - previews, training, dataset orchestration, automatic model eviction, a general - cold-load gateway redesign and LLaDA are outside scope. -- Tuldok repository: `/media/jeremy/OrangeCream/Linux Software/repos/owned/creative-media/Tuldok`. - Implementation must read its current instructions before editing; this plan - does not assume its files remain unchanged. -- Do not assume the previously used port 20617 is the Pumas gateway. It was the - llama.cpp router. Use Pumas's actual advertised/configured gateway address. - -## Binding decisions - -| Decision | Owner | Basis | -| --- | --- | --- | -| Shared update lifecycle; Torch-specific compatible runtime recipe | Pumas app manager | User requirement; existing VersionManager | -| Same optional inference feature gate | Pumas RPC composition and launcher | User requirement; current Cargo feature | -| Stable library model IDs and existing asset acquisition authority | Pumas core | Current architecture and ongoing library work | -| Nunchaku first, local FLUX.2 second; LLaDA deferred | Torch adapter owner | User priorities and local inventory | -| Explicit model load before generation; advertise ready models with capabilities | Pumas serving manager/gateway | Existing loaded-model policy; deferred broader gateway brief | -| Single synchronous image response initially, bounded admission, explicit cancellation ownership | Gateway and Torch job owner | Small usable client contract without permanent job storage | -| Tuldok displays and saves the actual response | Tuldok client | User's end goal | -| Admitted image generation uses the generation-wide no-elapsed-deadline lifecycle; uncertainty is not replay authority | [Torch Image Provider Contract Correction](../torch-image-provider-contract/plan.md) | Explicit product contract `TIPC-GEN-01` | - -## Proposed API contract - -Finalize and document this bounded contract in M2 before integrating Tuldok: - -- `GET /v1/models` retains its existing response and stable IDs; add an additive - capability field containing `image_generation` for eligible ready models. - Keep existing text clients compatible and expose no filesystem paths. -- `POST /v1/images/generations` accepts `model`, nonempty `prompt`, `n: 1`, - numeric `width`/`height`, `response_format: "b64_json"`, and optional integer - `seed` ([public contract](../../contracts/image-generation.md); the former - `size` string is rejected). Provider execution uses the private - [Torch provider protocol](../../contracts/torch-provider-protocol.md). - Validate supported dimensions and pixel/response limits per adapter. - Use documented model-specific defaults for steps and guidance initially. -- Return `{"created": , "data": [{"b64_json": ""}]}`. - Record actual seed/settings in an additive metadata field for reproducibility; - do not promise bitwise deterministic GPU output. -- Reject unsupported options and operation/model mismatches before allocation. - Distinguish invalid input, unavailable model, busy runtime, OOM, cancellation, - uncertain transport loss, and backend failure through stable safe outcomes. - Elapsed duration and response silence are not image-generation failures. -- Reuse existing gateway access policy, routing and provider registry. A Torch - sidecar address is an internal execution detail, not Tuldok configuration. -- Own each request through completion, backend/runtime failure, owner - cancellation or disconnect, or explicit runtime shutdown. Cancellation is a - request until cleanup has stopped work sufficiently for safe reuse; retain the - GPU lease through that point. If interruption requires process termination, - invalidate readiness and make reload explicit. Never retry after an uncertain - result. Bound concurrency and reject excess requests as busy. - -## Simplicity and ownership review - -**Applicability:** `applicable` - -1. **Independent concerns:** The app manager installs runtime versions on disk; - the library resolves model/component identity; the serving manager owns ready - model lifecycle; Torch executes GPU work; the gateway owns transport; Tuldok - owns prompt entry and image presentation. Installation happens on explicit - management actions; generation happens on a client request. -2. **State, identity, value, time, policy and mechanism:** Runtime recipe version - identifies a validated dependency set, not a model revision or API version. - Library IDs and immutable component revisions identify model inputs. Serving - readiness and request leases are transient. Resource policy uses current - telemetry, not cached installation success. Recipe compatibility declares - allowed adapter/sidecar combinations; M1 records the concrete matrix. Changing - runtime requires readiness invalidation/revalidation; changing model assets - requires bundle validation. No second installed-version or model-state store. -3. **Caller/composition knowledge:** Tuldok knows URL, capability, model ID and - image fields only. The RPC composition root wires one Torch provider through - the existing registry. The app manager hides Python/wheel installation; - adapters hide checkpoint layouts. UI does not choose interpreter paths. -4. **Representative changes:** A dependency upgrade changes the runtime recipe - and its qualification evidence. A checkpoint-format change affects its - adapter and asset validation. A public request-field change affects gateway - contract and Tuldok client. Adding an image model must not require another - updater, gateway transport, or UI backend-selection mechanism. -5. **Stable interfaces:** Library IDs, serving observations and the bounded image - contract cross boundaries. Python paths, wheel names, quantization details, - startup order and GPU cancellation stay with their owning implementations. -6. **Independent evolution/failure:** Install tests use isolated roots; adapters - have fixture and GPU checks; gateway tests substitute a controlled sidecar; - Tuldok tests use an HTTP fixture. Real end-to-end evidence is still required. - Sidecar failure invalidates readiness without breaking library operations. -7. **Deletion results:** Replacing the incorrect source-release recipe removes a - broken path. Reusing the manager avoids a second updater and state store. - Removing the Torch adapter would spread pipeline knowledge into transport; - removing the GPU lease would permit unload/use races. No new general plugin - registry, scheduler service, job database or automatic loading framework. -8. **Necessary complexity:** Platform-compatible dependencies stay in the recipe - strategy; model-format variation stays in two concrete adapters; resource - ownership stays in the serving/job lifecycle. These additions compose with - existing installation, library and gateway machinery. Revisit this review if - implementation requires new authorities or shared version knowledge. - -## Evidence and oracle plan - -- A returned image must decode as PNG, have requested allowed dimensions and - originate from the selected real model. An HTTP 200 or base64 string alone is - insufficient. Save prompt, model/component revisions, runtime version, seed, - settings, duration and peak GPU/RAM use beside acceptance images. Visually - inspect prompt relevance; do not use a brittle exact-pixel golden test. -- Tuldok browser acceptance inspects the displayed image and saved decoded content; - a sidecar-only script or mocked browser does not satisfy A3/A4. -- Installation failure fixtures fail during download, dependency installation and - validation; assert old-version usability and absence of a published partial - environment. Restart the manager to prove persisted state recovery. -- Gate tests exercise actual disabled routes/startup and UI build, not just cfg - source searches. The earlier disabled cargo check is baseline evidence only. - -## Milestones - -M1 is `Completed` for qualified upstream `v2.9.1`: packaged discovery, -shared-UI installation, migration from the installed legacy runtime, activation, -removal, cancellation preservation, restart recovery, and the active/default -selection/removal concurrency regressions passed. M2 is `Completed` for its -real Nunchaku gateway and relevant A5 gates. M5 is `Completed` for the A1–A7 -release and optional-build evidence. No Pumas-hosted Torch runtime release is -required. Original M3 and M4 are `Completed` within their recorded evidence; -`M3-TIPC` is `Completed` with its exact-candidate real gate passed. Remaining -work listed at the top of this plan is deferred follow-up, not a blocker to this -acceptance. -Each milestone -updates this directory's ledger, issues and evidence reports. Narrow write sets -against the live checkout before edits; expand the plan for new semantic owners. - -### M1 — Usable Torch runtime through shared installation - -**Goal:** Install and launch a qualified sidecar from the normal Pumas runtime controls. - -**Allowed write set:** `rust/crates/pumas-app-manager/src/version_manager/`, -`rust/crates/pumas-core/src/config.rs` (the actual AppId release-source owner), `rust/crates/pumas-core/src/platform/{mod.rs,filesystem.rs,linux_group.rs}` (expose existing non-replacing publication and owned process-group observation primitives), its runtime tests and `rust/crates/pumas-app-manager/examples/qualify_torch_runtime.rs`, -`launcher-data/plugins/torch.json`, `torch-server/`, runtime packaging scripts -under `scripts/`, `frontend/src/components/app-panels/TorchPanel.tsx`, `frontend/src/components/VersionSelector.tsx` -(shared selector failure feedback), `frontend/src/components/InstallDialogHelpers.ts` -(installed-version visibility independent of release availability) and -`frontend/src/components/app-panels/sections/VersionManagerSection.tsx` if required -for existing shared control integration. - -**Tasks:** Resolve exact supported Python/Torch/CUDA/Diffusers/Nunchaku artifacts -from primary documentation and verify on the GPU. Define a pinned recipe with -artifact integrity and sidecar protocol identity. Discover official release tags -from `pytorch/pytorch`, but expose only tags mapped to a qualified app recipe. -Embed the sidecar and lock with the Pumas app and install Torch from official -hash-pinned wheels. Stage isolated environments, validate imports/device support -and health, publish atomically through existing state, preserve rollback, and -refuse deletion/replacement of an active environment. Handle legacy installs -without deleting user assets. Exercise normal UI install/activate/remove and -install failure/cancellation/restart recovery. - -**Gate:** Healthy real sidecar and existing llama.cpp installer checks before model -loading. Packaged discovery, fresh shared-UI installation, migration from the -installed legacy runtime, activation, removal, cancellation preservation, and -restart recovery passed for the supported upstream release; see -`reports/a1-packaged-acceptance.md`. Only v2.9.1 has a qualified upstream recipe, -so this does not claim an upgrade between two PyTorch upstream tags. Record exact -dependencies, supported tags and official wheel sources in `reports/runtime.md`. -**Re-plan:** No compatible supported official wheel combination or no distributable -sidecar/recipe path. - -### M2 — Nunchaku prompt-to-image through Pumas - -**Goal:** A real Nunchaku image returns through the public Pumas gateway. - -**Allowed write set:** `torch-server/`, -`rust/crates/pumas-app-manager/src/torch_client.rs`, -`rust/crates/pumas-core/src/models/runtime_profile.rs`, -`rust/crates/pumas-core/src/providers/`, `rust/crates/pumas-core/src/serving/`, -`rust/crates/pumas-core/src/models/serving.rs` (existing provider/lifecycle owners), -`rust/crates/pumas-core/src/runtime_profiles.rs`, -`rust/crates/pumas-core/src/runtime_profiles/`, -`rust/crates/pumas-core/src/api/*runtime*.rs`, -`rust/crates/pumas-rpc/src/provider_clients.rs`, -`rust/crates/pumas-rpc/src/handlers/`, `rust/crates/pumas-rpc/src/server.rs`, -relevant tests in these crates, and new image API documentation under `docs/contracts/`. - -**Tasks:** Resolve complete Nunchaku pipeline components through existing library -APIs; use the FP4 checkpoint appropriate to the verified GPU. Add a concrete image -adapter and lifecycle-safe GPU execution. Integrate Torch provider readiness, -load/unload and image capabilities with the existing serving path. Implement the -bounded image contract, error mapping, response limits, and cancellation. The -focused provider correction now solely owns the shared generation lifetime plus -image live compatibility, private result evolution, and gateway projection; -this milestone consumes its accepted source and evidence rather than -implementing a duplicate. -Keep every executable integration under the existing inference gate. Measure a -real prompt before adding the second adapter. - -**Gate:** A2 and the relevant A5 cases, plus regression checks for text routing. -Record request/response, decoded PNG and resource measurements in `reports/nunchaku.md`. -**Re-plan:** Asset format mismatch, resource policy cannot run within host limits, -or existing lifecycle cannot safely represent Torch without additional ownership. - -### M3 — Tuldok generation workflow - -**Goal:** A user generates, views and saves a Nunchaku image from Tuldok. - -**Allowed write set:** Pumas `frontend/src/components/app-panels/`, -`frontend/src/components/model-serve/`, `frontend/src/hooks/useTorchProcess.ts`, `frontend/src/hooks/useServingStatus.ts`, -`frontend/src/utils/runtimeProviderDescriptors.ts`, `frontend/src/types/api-runtime-profiles.ts` -(shared provider declarations and serving status decoder), -associated client bindings only as required by M2 contracts; Tuldok `ai_http.py`, -`image_generation.py` (bounded image transport and cancellation), `app.py` (existing HTTP route owner), `static/app.js`, -`static/index.html`, associated styles, tests and user documentation. - -**Historical tasks:** Expose the gateway URL and managed Torch serving state in Pumas. Add -Tuldok image-generation controls separate from corner detection, capability-filtered -selection-only model list, prompt, size and optional seed, pending/cancel/error -states, image display and save. Decode bounded validated image responses; preserve -existing corner workflow. Provide a useful unsupported-endpoint message -when configured with the llama.cpp router instead of Pumas gateway. - -**Historical gate:** Browser fixture coverage for failure/cancel/output handling -and the recorded real Tuldok-to-Pumas image display/save workflow passed within -the original candidate, resolution, and protocol scope in `reports/tuldok.md`. - -**Status:** `Completed` within that historical scope. - -#### M3-TIPC — Tuldok contract companion - -**Goal:** Align the existing Tuldok image consumer with `TIPC-GEN-01` and return -TIPC-10 without changing discovery, datasets, or VLM transport. - -**Status:** `Completed` - -**Allowed write set:** Tuldok `image_generation.py`, its focused tests, -`tests/browser_images_real.cjs`, relevant user documentation, and this plan's -`reports/tuldok.md`, ledger, and issues. - -**Completed source tasks:** Preserve the already-correct numeric width/height request, requested -dimensions, 1280×720 defaults, and explicit socket/watcher cancellation. Remove -the remaining consumer generation deadline and deadline-specific outcome; -preserve uncertain outcomes without automatic replay; and avoid narrowing -legitimate public metadata to current examples. Tuldok commit `a61daee` passed -all 47 unit tests. - -**Gate:** TIPC-10: a supporting model completes a real 1280×720 Tuldok-to-Pumas -request through the exact installed corrected candidate, displays it, and saves -it. Record new evidence without relabeling the earlier smaller-image result. - -This companion may be prepared against the current public contract independently -of TIPC-M1 source completion, but its required-real gate waits for the exact -installed corrected candidate. - -**Result:** Passed against isolated production-installed -`torch-runtime-0.1.6`. The browser displayed 1280×720, saved exact PNG SHA-256 -`cdf9ae632f621606032d91975f86f960d546b39349a83ce6b851b50390fb52a3`, -and automatically imported it. TIPC-10 is returned. - -**Re-plan:** Tuldok's current app structure or dataset import boundary materially differs. - -### M4 — FLUX.2 through the same path - -**Goal:** The local FLUX.2 Klein FP8 model works through the existing image flow. - -**Allowed write set:** `torch-server/` adapters/tests, M1 runtime recipe only if -qualification requires it, and model-component declarations through existing -library-owned interfaces; existing `serving_torch.rs`, Torch client load DTO and -gateway ready-slot adapter filter for the second concrete adapter. No new client -transport or updater. - -**Tasks:** Verify the actual local checkpoint layout and matching encoder/VAE/ -tokenizer assets. Implement its concrete adapter, model-specific size/settings -validation and measured explicit offload policy. Check both adapters against the -same qualified environment; avoid silently upgrading dependencies at model load. - -**Gate:** A4 through Tuldok, Nunchaku regression, memory/latency and image evidence -in `reports/flux2.md`. -**Re-plan:** Checkpoint requires unsupported conversion or incompatible runtime -versions; decide supported recipe versions before extending machinery. - -### M5 — Release and optional-build acceptance - -**Goal:** Deliver a tested release and prove the library-only build remains optional. - -**Allowed write set:** Relevant tests from M1–M4, `scripts/launcher/`, existing -Cargo feature declarations if gate closure requires changes, related frontend -feature guards, release documentation, and this plan's evidence. Product fixes -return to their owning milestone rather than broadening this slice implicitly. - -**Tasks:** After the focused correction passes its owned gate, construct an -identifiable `torch-runtime-0.1.6` candidate (rechecking that allocation first) -and record source revision, recipe, lock, archive checksum, bundled sidecar -protocol/capabilities, and client interoperability. Install those exact bytes -through production VersionInstaller in an isolated launcher root while preserving -existing installations. Build the normal release and run the actual Tuldok flow -for both models. -Build with `PUMAS_INFERENCE_PLUGINS=false`, check route/control absence and no Torch -startup/install side effects. Exercise runtime failure, cancel followed by another -request, unload during work, insufficient memory, and existing llama.cpp/Tuldok -VLM behavior. Use current GPU telemetry before loads and explicitly manage -competing models. Record usable latency/defaults and known limitations; preserve -evidence rather than declaring success from build completion. - -**TIPC handoff gate:** TIPC-04, TIPC-09, and TIPC-10 were returned individually -after their specific evidence passed. They do not require M5 closeout or a -Pumas-hosted runtime publication. - -**Milestone gate:** All A1–A7 are satisfied with release identity and -reproducible commands in `reports/release-acceptance.md`. No required installed- -artifact, GPU, or browser check may be replaced by mocks. Qualification does not -authorize publication or production-default selection. -**Re-plan:** Any required acceptance fails, the selected model does not support -1280×720, or the reserved recipe identity collides; fix/select a supported model -or identity and rerun only the affected evidence. - -## Blockers and unresolved facts - -M1 source implementation, exact-candidate package qualification, GPU -cancellation/reuse, and browser acceptance are complete for TIPC-04, TIPC-09, -and TIPC-10. The earlier assumption that Torch discovery required a Pumas-hosted -runtime bundle was incorrect. The manager now targets official PyTorch releases -and maps only the qualified `v2.9.1` tag to an embedded, hash-locked recipe. -Packaged discovery, install, migration from the installed legacy runtime, -activation, removal, cancellation preservation, and restart recovery passed; -see [A1 packaged acceptance](reports/a1-packaged-acceptance.md). Only v2.9.1 has -a qualified upstream recipe, so an upstream-to-upstream upgrade is not claimed. -Both complete pipelines now generate through Tuldok. A5 acceptance passed, -including a real -CUDA allocator OOM returning sanitized HTTP 507; follow-up inference succeeded -with the same loaded model, and teardown succeeded. This does not verify a -naturally induced high-resolution pipeline OOM. See [A5 GPU recovery evidence](reports/a5-gpu-oom-recovery.md), -[runtime evidence](reports/runtime.md), and [issues](issues.md). - -## Re-plan triggers - -- Additional installation or model-state authority appears necessary. -- Compatible dependencies cannot support the selected checkpoints or host. -- Concurrent changes alter serving, library acquisition or Tuldok contracts. -- New gateway auto-loading or broader discovery becomes necessary for acceptance. -- Required release/GPU/browser evidence is unavailable or fails. - -## Final acceptance - -- Acceptance status: `passed`. -- Deferred follow-ups: native NVFP4 encoder serving, T16 desktop shutdown, - LLaDA, other-platform qualification, and the broad gateway redesign; revisit - after the user selects the next scope. -- Final status: `Completed`; operation `start` admitted on 2026-09-13. A1–A7 acceptance was completed on 2026-09-23 within the limitations in the linked reports. diff --git a/docs/plans/torch-diffusion-serving/reports/a1-packaged-acceptance.md b/docs/plans/torch-diffusion-serving/reports/a1-packaged-acceptance.md deleted file mode 100644 index d1d5cdfb6..000000000 --- a/docs/plans/torch-diffusion-serving/reports/a1-packaged-acceptance.md +++ /dev/null @@ -1,95 +0,0 @@ -# Packaged upstream Torch acceptance - -Date: 2026-09-23 -Source commit: `5d373bf8791c43f1b995f4ba51a17da1610a6686` -Packaged artifact: `Pumas.Library-0.7.0.AppImage` -SHA-256: `74d6c6143c5342a9492f7afbc30b301f751f870aca04ec05f231ff6ee140f71c` - -The Linux x86_64 AppImage was built from the exact source commit above with a -temporary output-path override. The app ran with an explicit isolated -`PUMAS_LAUNCHER_ROOT` and a separate Electron profile. Tests used a fresh root -and a second disposable root seeded with a physical copy of the host's installed -`torch-runtime-0.1.4`; neither root was the host's active Pumas library. - -## Discovery and install - -The packaged Torch globe fetched 69 releases from `pytorch/pytorch`; the shared -version manager displayed `v2.9.1` as the only installable release because it is -the only upstream tag mapped to a qualified app recipe. No Pumas Torch release -or tag was used. The UI showed the v2.9.1 release date and the install action. - -Installing from that row completed in the packaged app. The registered metadata -identified `releaseTag: v2.9.1`, path `v2.9.1`, Python 3.12.3, and -`dependenciesInstalled: true`. The direct Torch wheel came from the official -PyTorch CUDA 13.0 wheel host and the recipe identity was -`torch-upstream-2.9.1-r1`. The install log reported the locked packages, -including `torch-2.9.1+cu130`, `torchvision-0.24.1+cu130`, and -`nunchaku-1.2.0+torch2.9`. - -The packaged manager's install validation started the embedded sidecar and -reported recipe `torch-upstream-2.9.1-r1`, Torch `2.9.1+cu130`, CUDA `13.0`, -GPU `NVIDIA GeForce RTX 5090 Laptop GPU`, and health -`{"status":"ok","protocol":3,"capabilities":["image_generation"]}`. A -managed profile started from the shared Torch UI; its `/health` endpoint -returned HTTP 200 with protocol 3 and `image_generation`. The profile stopped -through the UI. Restarting the app preserved the installed version and left the -profile stopped. - -## Legacy-runtime migration, cancellation, removal, and restart - -In the second isolated root, the copied `torch-runtime-0.1.4` was selected and -usable before the update attempt. Starting its managed profile through the UI -returned HTTP 200 from `/health` with protocol 1 on the same RTX 5090 Laptop -GPU. The profile was stopped before changing versions. - -The shared UI began installing v2.9.1, reached locked dependency setup, and then -the Cancel installation confirmation was accepted from the in-progress release -row. The manager returned to its version list with only -`torch-runtime-0.1.4` installed. The staging directory was removed; the Torch -metadata still contained only `.1.4`, `lastSelectedVersion` and the active marker -remained `.1.4`, and `defaultVersion` remained unset. No installer or sidecar -process remained. After an app restart, the UI still showed `.1.4` as installed -and v2.9.1 as the available release. - -The same root then completed a second v2.9.1 installation through the shared UI. -With both versions present, the selector switched active runtime to v2.9.1 and -the managed profile started healthy on the RTX 5090. After stopping the profile, -the version manager removed the now-inactive copied `.1.4` runtime. The manager -log recorded removal of its directory. After another app restart, the UI showed -v2.9.1 installed and the profile stopped; metadata contained only v2.9.1, the -active marker and `lastSelectedVersion` were v2.9.1, and the default remained -unset. - -## Result and limits - -A1 passed for the currently qualified upstream recipe: packaged discovery, -shared-UI install, migration from the previously installed runtime, activation, -removal, cancellation preservation, sidecar health, and restart recovery were -observed. The host's installed versions (`0.1.1`–`0.1.4`), active `.1.4`, and -unset default remained unchanged. No runtime was published or tagged, and no -default runtime was changed. - -Only `v2.9.1` currently has a qualified upstream recipe, so this evidence does -not claim an upgrade between two different PyTorch upstream tags. A subsequent -recipe can be tested when another upstream version is qualified. - -## Concurrent version selection and removal - -The packaged trace above exercises selection and removal sequentially. A source -review then identified that concurrent shared-manager requests could change -active or default selection after removal had checked its target but before its -filesystem and cached-state cleanup completed. `VersionManager` now serializes -active/default selection and removal with a dedicated lifecycle mutex; these -selection changes do not wait on the installation mutex held during downloads. - -Deterministic Torch manager regressions verify removal-first active selection -waits and then rejects the deleted tag. The sequential switch-first check makes -removal refuse and preserve the active installation. Another test pauses after -metadata deletion and before state refresh: setting the removed tag as default -waits, then returns `VersionNotFound`. Default-first removal clears the default. -The tests verify runtime files, Torch metadata, `.active-version-torch`, default -selection, and reconstructed manager state. They passed in the changed source -on 2026-09-23. -The AppImage above was built from the prior source commit and does not contain -this additional synchronization fix; the source-level regressions cover the -concurrency behavior. diff --git a/docs/plans/torch-diffusion-serving/reports/a5-gpu-oom-recovery.md b/docs/plans/torch-diffusion-serving/reports/a5-gpu-oom-recovery.md deleted file mode 100644 index 0748a03d8..000000000 --- a/docs/plans/torch-diffusion-serving/reports/a5-gpu-oom-recovery.md +++ /dev/null @@ -1,41 +0,0 @@ -# A5 real CUDA OOM recovery - -**Status:** Passed on 2026-09-22 (America/Vancouver; 2026-09-23 UTC). - -## Setup - -The test used the isolated `torch-runtime-0.1.6` installation at -`launcher-data/cache/torch-qualification/tipc-0.1.6-install`, whose candidate -archive SHA-256 is -`74f9b593dff1e447a73571dc465efd520238ba0c56d2730393a17eee2b97426c`. Its -managed `torch-image-acceptance` profile served the real -`diffusion/nunchaku-ai/nunchaku-z-image-turbo` model on the RTX 5090 Laptop GPU. -The sidecar ran the current branch's `torch-server` source over the candidate's -qualified dependencies and assets; the candidate source files were restored and -SHA-256 checked after the run. - -## OOM and recovery - -A one-shot test hook ran inside the loaded adapter's `generate` call. It queried -`torch.cuda.mem_get_info()` and requested the currently free bytes plus 256 MiB -with a CUDA `uint8` tensor. The actual CUDA allocator raised -`torch.cuda.OutOfMemoryError`. This avoided oversized image dimensions and did -not allocate host memory. - -The public `POST /v1/images/generations` request returned HTTP 507 with code -`out_of_memory` and the sanitized message `Insufficient GPU memory`. The same -profile remained healthy. A separate subsequent request through the gateway -returned a decodable 512×512 PNG: 302,715 bytes, SHA-256 -`cddd2386cb8ca5105325aca2d202db68885dd71402dca04f55949b87f379120d`. It used -seed 42, 8 steps, sequential CPU offload, and completed in 10.309 seconds. - -The model unloaded and the profile stopped successfully. GPU memory was 657 MiB -before the run and 662 MiB after cleanup; the only listed CUDA process was the -existing desktop process. The main launcher remained unchanged with runtime -0.1.1–0.1.4 installed, 0.1.4 active, and no default runtime. No runtime was -published or tagged. - -This verifies a real CUDA allocator OOM followed by successful real inference -recovery. It does not claim that a naturally oversized diffusion request caused -the OOM. Existing [GPU cancellation and reuse evidence](nunchaku.md) covers the -other required real-GPU lifecycle case. diff --git a/docs/plans/torch-diffusion-serving/reports/baseline.md b/docs/plans/torch-diffusion-serving/reports/baseline.md deleted file mode 100644 index cad1a80ae..000000000 --- a/docs/plans/torch-diffusion-serving/reports/baseline.md +++ /dev/null @@ -1,23 +0,0 @@ -# Baseline and evidence index - -Planning baseline recorded 2026-09-13 from repository inspection and the preceding -session's host checks. These facts are not implementation acceptance. - -- Torch already dispatches through the shared app-manager VersionManager and - uses the RPC `inference-plugins` gate. -- The current source-release recipe points to `pytorch/pytorch`; the experimental - `torch-server` does not provide the required complete diffusion-serving path. -- The gateway currently advertises ready loaded models; the broader discovery - redesign is separately deferred in the [gateway brief](../../../breif/unified-inference-gateway.md). -- Tuldok `ai_http.py` currently discovers models and performs vision chat; it - needs a separate image-generation request and browser workflow. -- Earlier host inspection identified RTX 5090 Laptop GPU, approximately 24 GB - VRAM. Recheck live availability before inference qualification. -- Earlier command passed: - `cargo check --manifest-path rust/Cargo.toml -p pumas-rpc --no-default-features --offline`. - No release/gateway absence claim follows from this alone. - -Implementation evidence: [runtime](runtime.md), [Nunchaku](nunchaku.md), -[Tuldok](tuldok.md), [FLUX.2](flux2.md), and -[release acceptance](release-acceptance.md). The facts above describe the -planning baseline, not the current implementation. diff --git a/docs/plans/torch-diffusion-serving/reports/flux2.md b/docs/plans/torch-diffusion-serving/reports/flux2.md deleted file mode 100644 index a33b12180..000000000 --- a/docs/plans/torch-diffusion-serving/reports/flux2.md +++ /dev/null @@ -1,114 +0,0 @@ -# FLUX.2 (real Tuldok acceptance passed) - -The preflight history below records the earlier qualification stages. Final -acceptance evidence is recorded at the end of this report. - -M4 source preparation was admitted during the slow pipeline acquisition; -Nunchaku remains the first real-image gate. Preflight established the following: - -- The local checkpoint is the 9B KV FP8 variant, not a 4B model. Its safetensors - metadata declares per-layer `float8_e4m3fn`, with separate weight/input scales. - A blind BF16 cast would lose those scales and is not an acceptable conversion. -- The [BFL model card](https://huggingface.co/black-forest-labs/FLUX.2-klein-9b-kv-fp8/raw/main/README.md) - supports text-to-image and describes four-step distillation and an 8B Qwen3 - embedder; KV caching targets reference-image editing, outside this request. -- The [BFL reference loader](https://github.com/black-forest-labs/flux2/blob/main/src/flux2/util.py) - selects Qwen3-8B and the FLUX.2 VAE for Klein 9B/KV. -- Public upstream tree metadata reports Qwen/Qwen3-8B at 16,397,461,266 bytes. - The complete FLUX.2-dev repository is 177.64 GB, so acquiring that whole bundle - would be inappropriate for a single VAE dependency. -- [Comfy-Org's separate VAE](https://huggingface.co/Comfy-Org/flux2-dev/tree/main/split_files/vae) - is 336,213,556 bytes. Its 28,056-byte safetensors header contains 251 tensors, - Diffusers down/up-block keys, quantization convolutions and batch-normalization - buffers. Header inspection downloaded no weight tensors. This layout can avoid - a second VAE conversion implementation, subject to actual strict load checks. - -No matching asset acquisition or GPU/PNG acceptance has been claimed. Future -acquisition must use Pumas library authority; runtime execution stays offline. -Evidence JSON lives under `launcher-data/cache/torch-qualification/` with -`*-preflight-tree.json`, `flux2-vae-header-preflight.json`, and the local FP8 header -summary. Official gated tree metadata masks weight hashes; matching sizes alone -are not a weight-identity proof. - -The local checkpoint's 9,078,581,248 parameters strictly match the installed -Diffusers Klein 9B architecture after its existing converter. Actual CPU decoding -also passed strict load and finite-value checks in 20.10 seconds -(`flux-real-cpu-weights.log`). No FLUX GPU execution occurred. - -The adapter follows the [checkpoint format's scale semantics](https://github.com/Comfy-Org/ComfyUI/blob/master/QUANTIZATION.md): -decode FP8 weights with their scalar weight scales into BF16, retain unquantized -weights, validate activation scales, and execute BF16 activations. It explicitly -reports `scaled_fp8_to_bf16_sequential_cpu_offload`; this does not claim FP8 kernel -execution or FP8 resident-memory size. Pumas telemetry admission requires 42 GiB -available system RAM before this model loads. Scale fixtures pass, including -missing, zero, non-finite and nonscalar rejection. - -The adapter reuses the existing Diffusers converter and the common diffusion -cancellation/cleanup method. Qwen3-8B and the separate VAE remain library inputs. -Four steps and guidance 1 use the BFL reference defaults; the dynamic exponential -scheduler matches the [published Klein scheduler](https://huggingface.co/black-forest-labs/FLUX.2-klein-4B/raw/main/scheduler/scheduler_config.json) -and installed Klein pipeline's empirical shift. Real output must still qualify -that configuration for this checkpoint. Rust load transport adds only an optional -VAE component path; gateway/client image transport and updater are unchanged. - -## FP8 text encoder support - -Qwen3-8B acquisition is complete. The user requested reducing encoder storage -and making its role visible. The initial local FP8 artifact contains -9,436,626,944 weight bytes (8.79 GiB), versus 16,381,516,776 BF16 bytes -(15.26 GiB). Native prompt features from the converted encoder were finite. -At this encoder-preparation checkpoint, full FLUX/Tuldok acceptance remained -pending. Real image display/save/import passed later in this report. - -Pumas's existing conversion manager now has a general `fp8` backend and -`safetensors_to_fp8` direction, available in the existing conversion dialog. -It writes Transformers-compatible E4M3FN weights and per-128x128-block float32 -scales, preserves tokenizer/config assets, and keeps embedding/output weights -in BF16. Its CPU-only conversion environment uses the existing setup owner; -it does not install CUDA or introduce a Torch serving updater. Cancellation, -non-replacing publication, provenance and library indexing reuse existing owners. -The original BF16 source is preserved. This is limited to supported Transformers -causal-language-model packages with compatible linear dimensions, not arbitrary -Safetensors checkpoints. - -Both current library entries have explicit FLUX.2 Klein 9B text-encoder names. -No merging, component hiding, or new model-link UI has been implemented. - -### Actual Pumas conversion and native FLUX result - -The general CPU backend completed through the real desktop dialog in 43.132 -seconds (conversion `conv-1`). Its final output has 9,437,473,248 weight bytes -(8.79 GiB), including FP32 block scales. This supersedes the initial prototype -size above; the prototype import and staging weights were removed. Evidence: -`fp8-managed-conversion.json`, `fp8-managed-artifact.json`, -`fp8-conversion-complete-desktop.png`, `fp8-conversion-desktop.json`. - -Torch runtime 0.1.4 loaded the Pumas-converted package using Transformers FP8 -linear layers. A real FLUX generation with the resolved VAE file completed in -14.174 seconds (14.149 runtime-reported), four steps, guidance 1, seed 42, 512x512. -The PNG visibly matches the red teapot/yellow lemon prompt. This is a native -runtime result, not final gateway/Tuldok acceptance. Evidence: -`flux-fp8-native-load.json`, `flux-fp8-native-image.json`, `flux-fp8-native.png`. -The diffusion transformer still uses scaled FP8-to-BF16 execution; the text -encoder uses FP8 weights/activations. Sequential CPU offload is active for both. - -## Final release and Tuldok acceptance — passed - -Pumas release SHA-256 -`b11742c95e7dc68d82abd790618a6cba9e012dbc95e7c8ad8cb60f9165b45b74`, -Torch runtime 0.1.4, and gateway `http://127.0.0.1:38035/v1` served both -Nunchaku and FLUX.2. The actual Tuldok browser discovered FLUX by capability, -submitted the teapot/lemon prompt, displayed a 512x512 image and saved/imported -matching PNG bytes. A4 is passed. - -- End-to-end generation: 8.843 seconds; runtime: 8.697 seconds. -- Four steps, guidance 1, seed 42. Visually inspected prompt-relevant PNG. -- PNG SHA-256: `3d17e882d0b4b7b4d67e37e0df8a2cf8833756563971cb965397344b5be9a190`. -- Eleven Pumas telemetry samples: highest observed GPU usage 1,996,488,704 bytes, - highest observed host RAM usage 46.7773%. Sampling can miss brief peaks. -- Evidence under `launcher-data/cache/torch-qualification/`: - `tuldok-flux2-fp8-real/{saved.png,display.png,result.json}`, - `flux2-fp8-browser.log`, `flux2-fp8-browser-telemetry.json`, - `final-fp8-flux-load.json`, and `final-fp8-nunchaku-load.json`. - -No bitwise-determinism or arbitrary-checkpoint compatibility claim is made. diff --git a/docs/plans/torch-diffusion-serving/reports/fp4-conversion.md b/docs/plans/torch-diffusion-serving/reports/fp4-conversion.md deleted file mode 100644 index ffa5ed8ae..000000000 --- a/docs/plans/torch-diffusion-serving/reports/fp4-conversion.md +++ /dev/null @@ -1,63 +0,0 @@ -# NVFP4 conversion extension - -The existing conversion dialog offers Safetensors (NVFP4), using the existing -`SafetensorsToNvfp4` direction, backend setup owner, cancellation, temporary -output publication and indexing. No model-specific converter was introduced. - -The former backend changed an FP8 recipe and called ordinary `save_pretrained`, -which did not establish packed FP4 export. It now uses Model Optimizer 0.40.0's -NVFP4 recipe and `export_hf_checkpoint`. Output validation requires NVFP4 config, -packed byte weights, and block/global scales across the exported shards. - -## Focused evidence - -- Real CUDA conversion of a small locally serialized Qwen3 model: seven packed - weight tensors; each contains two FP4 values per byte. -- Reopened Safetensors, decoded using ModelOpt's reference NVFP4 decoder, loaded - all model parameters strictly, and ran a finite GPU forward pass. This proves - storage/reload correctness, not native FP4 matrix multiplication or 8B quality. -- Pumas telemetry before the probe: GPU total 25,651,314,688 bytes, used - 2,044,723,200 bytes; RAM 47.15% used of 66,815,029,248 bytes. -- Conversion dialog tests: 9 passed, including FP8 and NVFP4 routing. Frontend - type check, frontend build and Electron build passed. - -Ignored local artifacts under `launcher-data/cache/torch-qualification/`: -`nvfp4-format-roundtrip.log`, `nvfp4-roundtrip-result.json`, -`nvfp4-telemetry.json`, `nvfp4-ui-tests.log`, `nvfp4-ui-types.log`. - -## Serving boundary - -The qualified Torch runtime uses Transformers 4.57.6, which does not have a -ModelOpt NVFP4 quantizer. The working FLUX pipeline remains on its FP8 text -encoder. The dialog explains this limitation. NVFP4 conversion does not claim -NVFP4 encoder serving support. Existing Tuldok/disabled-artifact acceptance is -retained; no repeated broad diffusion or disabled-build matrix for this -conversion-only change. - -Release `a64bfc5d0574b6d8fdb3a6466c60d5a8857e13996e1a18f00bde698494a6852e` -built successfully and is running in the real desktop. The NVFP4 option and -retained managed setup state were visually checked in -`nvfp4-conversion-desktop.png`. Both existing image models were restored -successfully through the release gateway at `http://127.0.0.1:43571/v1`; -`nvfp4-release-{nunchaku,flux}-load.json` records those responses. -The initial managed installation reached the shared 15-minute command limit -while downloading CUDA wheels. Pip did not retain these large wheels in its -HTTP cache. The NVFP4 recipe now allows 45 minutes for dependency installation; -other recipes keep their existing limit, and shared cancellation/child cleanup -remain unchanged. Completed temporary NVIDIA wheels were retained only after -matching official PyPI SHA-256 hashes, to avoid repeating those downloads. -The final managed installation completed successfully (operation -`39cc9ed5-71c9-458c-96b6-87e59dcb9a03`). The live release reports NVFP4 and FP8 -backends ready. The deployed converter and its freshly installed environment -then converted the small Qwen3 package, validated seven packed weight tensors, -and passed strict saved-weight reload plus a finite GPU forward using ModelOpt -reference dequantization. Evidence: `nvfp4-managed-setup-result.json`, -`nvfp4-final-backend-status.json`, `nvfp4-installed-roundtrip.log`. - -The actual dialog was visually checked on the preceding build with identical -frontend assets. Final desktop CDP capture was unavailable because its debugging -port was occupied during restart; the running application and live RPC remain -available. No extra restart was performed solely for another screenshot. -The 8B BF16 and FP8 library models remain intact; no full 8B NVFP4 conversion or -native NVFP4 encoder inference is claimed. T16 records the observed pre-existing -shutdown issue and the operational cleanup of the previous installer. diff --git a/docs/plans/torch-diffusion-serving/reports/nunchaku.md b/docs/plans/torch-diffusion-serving/reports/nunchaku.md deleted file mode 100644 index f2cea4035..000000000 --- a/docs/plans/torch-diffusion-serving/reports/nunchaku.md +++ /dev/null @@ -1,126 +0,0 @@ -# Nunchaku evidence - -A2 and A5 passed within their recorded scopes. The image-specific TIPC-04 -cancellation/reuse gate also passed. A5 includes public failure mapping, -managed lifecycle cases, a real CUDA allocator OOM, and post-OOM generation; -it does not claim a naturally oversized pipeline request. See the -[A5 GPU recovery report](a5-gpu-oom-recovery.md). - -Source includes an offline Nunchaku FP4 rank-128 adapter with sequential CPU -offload, device admission/unload exclusion, cancellation checkpoints, bounded -image requests and PNG output. Pumas uses the existing provider registry, -managed runtime profiles, process-ownership receipts and serving operations. -The public image contract is in `docs/contracts/image-generation.md`. - -Verification so far: - -- Rust check passes with the Torch provider and image gateway. -- Sidecar host suite: 21 tests passed, including busy/unload exclusion and a - cancelled HTTP task retaining its lease until the worker stops. -- Gateway host suite: 24 tests passed, including existing text/embedding routing - and rejection of invalid image inputs. Sandbox socket creation failed before - handler execution; host tests provide the applicable integration evidence. -- Pipeline acquisition uses Pumas `start_model_download_from_hf`, download ID - `96e36a17-aa05-4e7f-a508-c09e06417be3`, selected artifact - `tongyi-mai--z-image-turbo__bundle_3af3fa2de99a`. It is still downloading. -- The library resolves that bundle to - `diffusion/tongyi-mai/tongyi-mai--z-image-turbo__bundle_3af3fa2de99a`. - The implementation resolves its library ID from the exact upstream repository, - rejecting absent or ambiguous matches rather than inferring a storage path. -- Current release gateway used for library acquisition is - `http://127.0.0.1:18767/v1`. It now runs the M2 release identified in the ledger. - -Required next evidence includes corrected runtime native/GPU qualification, -complete library assets, a real release gateway PNG, cancellation followed by -another generation, busy/unloaded/OOM behavior, and process-exit invalidation. - -Further evidence: - -- Sidecar host suite now passes 22 tests, including repeated cancellation during - a model load retaining its device lock until the loader returns. -- A real Axum/client/backend TCP fixture confirms client disconnect closes the - gateway backend request. This proves transport propagation, not GPU cancellation. -- The local FP4 checkpoint header identifies - `NunchakuZImageTransformer2DModel`, `fp4_e2m1_all`, rank 128. The adapter checks - these fields before allocating model weights. -- Real library descriptor resolution currently chooses the INT4 rank-256 file as - its generic entry point; the concrete adapter chooses the qualified FP4 sibling - inside that same library-owned model directory. No model files are copied or - acquired by the runtime adapter. - -## Native kernel compatibility qualification - -A real FP4 transformer forward in runtime 0.1.1 failed with -`TypeError: argument of type 'int' is not iterable`. Nunchaku 1.2 forwards patch -sizes positionally; Diffusers 0.37 inserted ControlNet parameters at those -positions. A weight-free reproduction observed `controlnet_block_samples=1` and -`return_dict=2`, identifying the cause without changing checkpoint or GPU state. -This direct binding evidence justified skipping a broad hypothesis search in the -diagnosing-bugs workflow. Native regression tests use the real dependency classes. - -`nunchaku_compat.py` retains Nunchaku's packed rotary hooks and supplies Diffusers -options by name. Both boundary tests pass, including hook cleanup after an -exception. Repeating the original real-checkpoint/GPU probe produced finite -`[16, 1, 64, 64]` output, total load/forward time 16.17 seconds, peak Torch allocated -memory 4,412,111,872 bytes. Logs: `native-nunchaku-kernels.log` (failure), -`nunchaku-binding-red.log`, `nunchaku-native-boundary-{red,green}.log`, and -`native-nunchaku-kernels-fixed.log`. This random-latent probe is native kernel -evidence, not a generated PNG or full pipeline acceptance. The corrected payload -was installed and qualified as 0.1.2; installed environments were not patched in place. - -Model admission now uses the library record's exact qualified upstream repository -identity (including the upstream organization rename), rather than one -machine-specific library ID. Library IDs remain unchanged and are used for -serving/discovery. The concrete FP4 file and header checks still apply. This lets -fresh acquisitions with the current library naming scheme use the same adapter. - -The installed 0.1.2 Python environment passes four native-dependency tests, -including OOM/backend-error mapping, lease release followed by an explicit new -request, and deadline cancellation waiting for the worker to stop. These use -controlled workers, not GPU OOM or real image inference. Log: -`native-current-tests.log`. Actual GPU cancellation remains required. - -## Real release and Tuldok image passed - -Release SHA-256 `764198b4fa47f7ab117d1eb92f5f38ff8a8ed1ca02b476744584838c80b7bef6` -served the complete Nunchaku pipeline using installed runtime 0.1.2 and managed -profile `torch-image-acceptance`. The gateway is `http://127.0.0.1:18767/v1`. -The real run exposed and fixed duplicate profile launch, startup health waiting, -and generic descriptor shard paths being passed where the pipeline directory was -needed. Component resolution now uses the indexed, validated library package. - -Tuldok discovered the image model, submitted a red-teapot/yellow-lemon/blue-table -prompt at 512×512 with seed 42, displayed the result, downloaded matching PNG -bytes and preserved them through collection import. Browser elapsed time was -11.047 seconds; runtime generation reported 10.972 seconds, eight steps, -guidance zero and sequential CPU offload. Visual inspection confirmed the prompt. -PNG SHA-256: `497f4ea4645bb2d529b3db1b6112f3ad99145d03c8e7cdfde8ede5526cbe8e02`. - -Evidence under `launcher-data/cache/torch-qualification/`: -`tuldok-nunchaku-real/{display.png,saved.png,result.json}`, -`nunchaku-real-load.json`, `nunchaku-browser-real.log`, and -`nunchaku-browser-telemetry.json`. One-second Pumas samples observed GPU usage up -to 988,807,168 bytes and RAM usage up to 20.57%; sampling can miss brief peaks. -The pipeline used real local weights and no mock backend. A2 and A3 are passed. - -## Exact-candidate cancellation and reuse - -TIPC-04 passed separately against production-installed exact -`torch-runtime-0.1.6` archive SHA-256 -`74f9b593dff1e447a73571dc465efd520238ba0c56d2730393a17eee2b97426c` -and Pumas `ab3a95a9369a5471127003fcd8e6fff529596cb5`. The runtime loaded the real -FP4 rank-128 pipeline on the RTX 5090 Laptop GPU in 15.255 seconds. - -A live 1280×720 generation was disconnected after admission. Runtime evidence -records cancellation requested at `23:30:56.981`, with the worker/device cleanup -completed at `23:30:57.584`. A following request was admitted only after that -completion and returned HTTP 200 with one 265,041-byte PNG in 7.276 seconds; -decoded PNG SHA-256 is -`4fc58b0a9d21b33380006600af8cc26afc8f33577d7cf6b3fc6180937b96d013`. -Evidence is the isolated profile `runtime.log` plus -`launcher-data/cache/torch-qualification/tipc-0.1.6-tipc-04-reuse-response.json`. - -The model was unloaded, the isolated profile and gateway stopped, and GPU -occupancy returned to the pre-run baseline. The main launcher retained runtimes -`0.1.1`–`0.1.4`, selected `0.1.4`, and no default. No candidate was published or -installed into the main version store. diff --git a/docs/plans/torch-diffusion-serving/reports/release-acceptance.md b/docs/plans/torch-diffusion-serving/reports/release-acceptance.md deleted file mode 100644 index d4d7bc22b..000000000 --- a/docs/plans/torch-diffusion-serving/reports/release-acceptance.md +++ /dev/null @@ -1,90 +0,0 @@ -# Release acceptance evidence - -A6 and A7 passed within the recorded artifact scope. The sections below retain -chronological evidence; early limitations are superseded by later acceptance -where explicitly recorded. A1 packaged discovery, shared-UI installation and -migration, activation, removal, cancellation preservation, and restart -acceptance passed for the supported upstream PyTorch recipe; see [the A1 report](a1-packaged-acceptance.md). -It does not require a Pumas-hosted Torch release. A5 GPU allocator OOM and -post-OOM recovery have passed; the plan records their scope and remaining limits. - -## Historical M1 inference-disabled release - -Built successfully on 2026-09-13 using: - -```bash -CARGO_BUILD_JOBS=4 cargo build --manifest-path rust/Cargo.toml -p pumas-rpc --release --no-default-features --offline --target-dir launcher-data/cache/torch-qualification/disabled-target -``` - -Artifact SHA-256: `a1a33e7d1577f191a9a11380f0272611e70970b8272b70cad39a1ef0f5c50edc`. -Started with an isolated `disabled-root` on loopback port 18766. `/health` -returned 200; `/v1/models`, `/v1/chat/completions`, and -`/v1/images/generations` returned 404. RPC `torch_get_status`, `launch_torch`, -`launch_llama_cpp`, `get_available_versions` and `install_version` returned -JSON-RPC -32601 (method not supported). No Torch/llama runtime files were created -in that root. Raw route responses and build/startup logs are retained under -`launcher-data/cache/torch-qualification/`. - -The inference-disabled frontend build succeeded. Interactive control absence has -not yet been verified. This evidence is partial A6, not full acceptance. - -## Historical M1 inference-enabled release - -The release build succeeded with default features. Artifact SHA-256 before the -subsequent dependency-repair correction: -`12c5c1211f8d1755e18a8a52035a969828a4614e662c04b16a45671e468dc355`. -No real image or Tuldok browser acceptance has run on it. - -## M2 release artifacts and disabled desktop - -Fresh enabled RPC SHA-256: -`822354ce36b3b44ef514be405fd9ebb92fe08513cf1188a492756b42cb9145fe`. -Fresh disabled RPC SHA-256: -`4e22caf1dd2a6a304374f239b2e40ceb012774c02754fe0aa71001a1eaaf276c`. - -At this checkpoint, the disabled artifact ran against `disabled-m2-root` on port 18769. Health was -200, models/chat/images routes were 404, and the five inference management calls -returned -32601. Neither Torch nor llama.cpp installation directories appeared. -Raw evidence: `disabled-m2-checks.json` and `disabled-m2-release.log`. - -Built `pnpm --dir frontend build:library-only` and `pnpm --dir electron build`, -then launched the actual Electron shell with `PUMAS_RPC_BINARY` pointing at this -disabled release and an isolated launcher root/user-data directory. The backend -started on port 40519. Inspected the rendered desktop and its button catalogue: -no Torch/llama tabs, runtime install/start controls or serving controls appeared. -The model-library import/search controls remained present. Evidence: -`disabled-desktop.png`, `disabled-desktop-controls.json`, `disabled-desktop.log`. -This completes the disabled portion of A6 for these artifacts. Enabled real-model -acceptance was still pending, so A6 was not yet complete. - -## Real llama.cpp/Tuldok regression - -A7 passed against the enabled artifact above. See [Tuldok evidence](tuldok.md): -real Qwen VLM, gateway, browser display, unsaved suggestion and saved annotation -provenance. The test-owned model was unloaded afterward; user profiles and source -dataset were preserved. Shared installer regression suite: 90 passed. - -## Final enabled FP8 release - -Release SHA-256 `b11742c95e7dc68d82abd790618a6cba9e012dbc95e7c8ad8cb60f9165b45b74` -is running in the actual desktop on the main library root, gateway -`http://127.0.0.1:38035/v1`, with managed Torch runtime 0.1.4. Both image models -load. Real Tuldok FLUX/FP8 generation/display/save/import passed in 8.843 seconds; -Nunchaku's real Tuldok pass is retained in its report. A6 is passed using this -enabled workflow and the previously qualified disabled artifact above; the -disabled artifact was not rebuilt for the subsequent conversion-only changes. -The new general FP8 conversion backend uses the existing explicit setup owner -and CPU dependencies; it adds no Torch serving/management routes outside the gate. - -The real desktop FP8 conversion completed in 43.132 seconds. Focused frontend -checks: 21 existing conversion tests and the added FP8 selection case passed; -TypeScript and Electron builds passed. General CPU FP8 output reloaded in the -managed GPU runtime with finite inference, including a zero-weight-block case. -At this historical artifact-evidence checkpoint, A1 upstream discovery and -installation, and the remaining A5 GPU fault cases, were still open. Later source -work targets qualified tags from `pytorch/pytorch` and installs official pinned -wheels without requiring a Pumas-hosted Torch release. A5 GPU allocator OOM and -post-OOM recovery passed; see [the A5 recovery report](a5-gpu-oom-recovery.md). -Packaged-desktop discovery and shared-UI installation, migration, activation, -removal, cancellation preservation, and restart acceptance passed on -2026-09-23; see [the A1 report](a1-packaged-acceptance.md). diff --git a/docs/plans/torch-diffusion-serving/reports/runtime.md b/docs/plans/torch-diffusion-serving/reports/runtime.md deleted file mode 100644 index 105e8dd60..000000000 --- a/docs/plans/torch-diffusion-serving/reports/runtime.md +++ /dev/null @@ -1,227 +0,0 @@ -# M1 runtime implementation and qualification - -Status: native/GPU/sidecar qualification and packaged-app upstream discovery, installation, legacy-runtime migration, activation, removal, cancellation preservation, and restart acceptance passed for the CUDA 13.0 `v2.9.1` recipe. See [packaged upstream acceptance](a1-packaged-acceptance.md). Only v2.9.1 currently has a qualified upstream recipe, so an upgrade between two PyTorch upstream tags is not claimed. - -## Implemented source - -- `VersionManager` still owns discovery, installed state, active/default selection, - progress and cancellation. Torch discovery now queries `pytorch/pytorch` and - exposes only the qualified upstream `v2.9.1` release. The upstream tag maps to - the independent recipe `torch-upstream-2.9.1-r1`. -- The app embeds the sidecar and dependency lock. `VersionInstaller` installs the - direct SHA-256-pinned Torch and torchvision wheels from the official PyTorch - wheel host, installs the remaining hash-locked dependencies, checks - recipe/platform/Python/protocol identity, and runs GPU/import/sidecar validation - before atomic non-replacing publication and shared metadata registration. -- The existing platform directory publication primitive is exposed to the app - manager; its implementation and model-library ownership are unchanged. -- Failed staging is removed. Previously installed runtime files and metadata are - preserved. Process cancellation kills the installer process group and waits for - termination. Download cancellation also covers a stalled HTTP response. -- Installation serialization now remains held for the installation task's lifetime; - failed release resolution cannot leave a phantom `installing` tag. -- Running Torch environments cannot be switched away from or removed. Torch uses - `.active-version-torch` so its selection cannot overwrite llama.cpp's marker. -- Legacy source installations missing runtime files lose only their stale installed - metadata; files remain available for user recovery. - -## Qualified recipe - -Upstream tag `v2.9.1`, recipe `torch-upstream-2.9.1-r1`, sidecar protocol 3, -Linux x86_64, CPython 3.12, NVIDIA sm_120. Dependencies include Torch 2.9.1+cu130, torchvision 0.24.1+cu130, -Nunchaku 1.2.0+torch2.9, Diffusers 0.37.0, Transformers 4.57.6, -Accelerate 1.12.0 and PEFT 0.18.1. The complete transitive pins and artifact hashes -are in `torch-server/runtime/requirements.lock`. Native/GPU/sidecar qualification passed on this host; model generation -qualification still belongs to M2/M4. - -Primary inputs: - -- [Nunchaku installation](https://nunchaku.tech/docs/nunchaku/installation/installation.html): - Blackwell requires CUDA >=12.8 and FP4 weights. -- [Nunchaku Z-Image example](https://raw.githubusercontent.com/nunchaku-ai/nunchaku/main/examples/v1/z-image-turbo.py): - concrete transformer/pipeline classes and Turbo settings. -- [Stable release](https://github.com/nunchux-ai/nunchaku/releases/tag/v1.2.0): - official API requests for the historical `nunchaku-tech` and `nunchaku-ai` names - redirect to `nunchux-ai`; the CPython 3.12 Torch 2.9 Linux wheel has SHA-256 - `6196fbea888d6719fd7aff7ec58f1618ff37c35d4542f2c595aadd2a242e500f`. - -Lock command: - -```bash -uv pip compile torch-server/runtime/requirements.in --generate-hashes --emit-index-url --python-version 3.12 --python-platform x86_64-unknown-linux-gnu --index-strategy unsafe-best-match --output-file torch-server/runtime/requirements.lock --cache-dir launcher-data/cache/torch-qualification/uv -``` - -`--require-hashes --only-binary=:all:` is enforced at installation. Runtime updates -never resolve new dependencies during model loading and never acquire model assets. - -## Current evidence - -- Existing app-manager suite passed before the new fixtures (79 tests). -- Added real loopback archive and Python subprocess fixtures: checksum failure, - dependency failure, validation failure, previous-runtime usability after manager - restart, process-group cancellation, legacy-file preservation, selection-marker - isolation, running-runtime removal refusal and release-resolution cleanup. -- Latest app-manager regression suite: 87 passed. A repeated cancellation test - initially exposed child termination lag; it passes after reusing the existing - pinned process-group observation and reaping the leader last. -- App-manager Clippy with `--all-targets -- -D warnings` passed. -- Torch unit suite: 18 passed. Ruff check and format check passed. -- The first complete dependency installation failed its native import validation: - Nunchaku 1.2.0\+torch2.9 requires `libcudart.so.13`. The original CUDA 12.8 - candidate was rejected and removed without publication. Revised the candidate - to the official Torch 2.9.1 CUDA 13.0 build; host driver is 595.84. -- The corrected real installation completed successfully in - `launcher-data/cache/torch-qualification/install`, using the production installer - and a locally served unpublished candidate bundle. The recipe's Torch and - torchvision artifacts came from the official PyTorch wheel index; other - dependencies use the pinned sources. This historical bundle qualification is - not public release discovery or packaged-app acceptance. -- The first real attempt exposed missing extraction-root creation. It failed before - installation, published no runtime, and was corrected before the second attempt. - -Current upstream installer reproduction (use an empty, isolated root): - -```bash -cargo run --manifest-path rust/Cargo.toml -p pumas-app-manager --example qualify_torch_runtime -- launcher-data/cache/torch-qualification/upstream-install -``` - -The example uses the sidecar embedded in the app and downloads the official -hash-pinned wheels. It does not test GitHub release discovery or the packaged -desktop UI. Installation also requires the supported Python, Linux, network, and -GPU prerequisites. The preceding local archive-server workflow was for the -historical unpublished candidate bundle and is no longer the current installer -reproduction. - -## Upstream release and wheel contract - -The official release is `pytorch/pytorch` tag `v2.9.1`; its GitHub release -metadata identifies the source release, while installable wheels are hosted -separately. The managed installer uses direct, SHA-256-pinned Torch and -torchvision wheels from the official PyTorch wheel host. -The Pumas app embeds the serving sidecar and lock. No Pumas-hosted Torch release -or tag is required or created. Only `v2.9.1` is currently mapped to a qualified -recipe; other upstream versions remain unavailable until their full recipe is -qualified. The packaged globe exposed v2.9.1 as the sole installable upstream -tag, and the shared-UI install, migration, activation, removal, cancellation, -health, and restart checks passed; see [packaged upstream acceptance](a1-packaged-acceptance.md). - -## Live host baseline - -At initial inspection, Pumas was PID 661433 with gateway `http://127.0.0.1:37941/v1`. Its `/v1/models` -returns two ready Qwen VLM IDs. Port 20617 belongs to the llama.cpp router. -`get_system_resources` on `/rpc` returned GPU total 25,651,314,688 bytes and used -22,808,625,152 bytes (23.89 GiB total, approximately 2.65 GiB free). -No model was unloaded by this implementation. After continuation, those processes -and the gateway listener were no longer present. A separate baseline Pumas release -was started against an isolated telemetry root on port 18765. Its current -`get_system_resources` response reports 4,213,178,368 bytes used, approximately -19.96 GiB free. Port 18765 is this isolated instance, not a configured Tuldok gateway. -The installation validates only small CUDA execution and sidecar health, not -pipeline fit. Current telemetry must be queried again before model generation. - -## Historical M2 overlap checkpoint - -At this checkpoint, the adapter payload was being completed before runtime -publication, and shared-UI acceptance was pending; M2 source changes alone were -not GPU acceptance. The later packaged shared-UI checks passed as recorded in -[the A1 report](a1-packaged-acceptance.md). The Python lease suite passed 21 -tests on the host. The sandbox could not reliably deliver the threaded -event-loop wakeups used by the cancellation fixture; host evidence is retained -separately. Shared dependency checks recognize the direct-wheel package name -and refuse in-place repair of an installed Torch bundle. - -[Official PyTorch previous-version instructions](https://pytorch.org/get-started/previous-versions/) -list Torch 2.9.1 and torchvision 0.24.1 with CUDA 13.0. The corrected hash lock -uses that distribution. Production staged validation completed successfully: -Torch 2.9.1\+cu130, CUDA 13.0, RTX 5090 Laptop GPU, healthy sidecar protocol 1. -The installer atomically registered `torch-runtime-0.1.0` in the isolated root. -The bundle hash was `328dc486fb7dd0bcb28746d001418d539d1e9077f6b3fd06c37bf0b66a994caf`. -Subsequent source changes still need a new bundle installation before final -generation/browser acceptance. No public runtime release was created. - -## Runtime 0.1.1 and shared desktop selection - -The production installer qualified and registered `torch-runtime-0.1.1` beside -0.1.0. SHA-256 `1c2ae39c58ad3d8654cf2249d42fb8edec3c002db207e765614946f257f0b721`. -Log: `runtime-0.1.1-install.log`. Native dependencies are unchanged; the payload -includes current cancellation handling. The relocated 0.1.0 environment also -passed CUDA execution and protocol health (`runtime-0.1.0-relocated-health.log`). - -The actual enabled Electron desktop, backed by the release RPC on isolated root -`install`, listed both versions. Selecting 0.1.0 and then 0.1.1 updated shared -`lastSelectedVersion` metadata accordingly. At that historical checkpoint, -discovery still pointed at the Pumas repository and required its custom bundle -assets. The corrected source now discovers supported upstream PyTorch tags and -installs official wheels. The later packaged-app discovery and shared-UI -installation acceptance is recorded in [the A1 report](a1-packaged-acceptance.md). - -The current 90-test app-manager suite passes on the host. Four HTTP-fixture tests -cannot bind sockets inside the sandbox; they passed on the host with the rest. - -The shared desktop created a managed Torch profile, started its native sidecar -on port 13786, and stopped it. Switching versions while that profile ran was -refused and active selection remained 0.1.1. A checksum-corrupted 0.1.2 candidate -failed before publication while the 0.1.1 sidecar remained healthy; metadata still -contained only 0.1.0/0.1.1 (`real-failed-update-preservation.json`). After stopping -the profile, the desktop removed inactive 0.1.0 from the isolated root. - -Live desktop checks exposed and fixed two shared UI gaps: switch failures were -only logged, and installed versions disappeared when the remote catalogue was -empty. Both now have regression coverage (8 shared UI tests passed) and installed -rows were verified in the actual desktop. No remote releases were invented. - -The production installer also installed 0.1.1 into the actual launcher root for -upcoming image acceptance (`main-runtime-0.1.1-install.log`). NVIDIA wheel URLs -were refetched despite pip caching, including repeated fetches from the same URL; -the earlier progress explanation about different index URLs was incorrect. - -Runtime 0.1.2's first main-root installation failed during an NVIDIA wheel stream -read timeout. The staged directory was removed; 0.1.1 and legacy user files -remained. This coincided with repeated Hugging Face network retries; pipeline -transfer subsequently recovered to about 26 MB/s at 75%. Explicit installation -retry completed (`main-runtime-0.1.2-install-retry.log`): native GPU validation, -protocol health, atomic publication and shared registration passed. The main -gateway was gracefully restarted and shared `switch_version` selected 0.1.2. -At this runtime-install checkpoint, real-image acceptance remained pending. -Later Nunchaku and FLUX/Tuldok real-image results are recorded in their reports. -Subsequent Ruff formatting changed only whitespace in the compatibility and -validation modules; the next runtime payload included that formatting. - -## Corrected runtime 0.1.6 exact-candidate qualification - -TIPC source `826a270958f7182bd8108c879b4b7fa1da5cab7d` supplies the candidate -sidecar; no candidate-owned product path differs between that commit and the -packaging head. The immutable recipe is protocol `3` with -`["image_generation"]`. Requirements-lock SHA-256 is -`d4073f8e8a1d8b20b48a275a2c63a6d2c084369e831f093b8903a0047c4ca0f4`. - -The exact archive is -`launcher-data/cache/torch-qualification/assets/0.1.6/pumas-torch-runtime-linux-x86_64.tar.gz`, -SHA-256 `74f9b593dff1e447a73571dc465efd520238ba0c56d2730393a17eee2b97426c`. -It installed through the production `VersionInstaller` into isolated root -`launcher-data/cache/torch-qualification/tipc-0.1.6-install`; the installed -runtime is 5.2 GiB. - -The first attempt exposed that the strict Rust recipe decoder had not evolved -with the required capability field. Fix -`ab3a95a9369a5471127003fcd8e6fff529596cb5` consumes additive capabilities and -requires `image_generation`. Its regression first reproduced the exact failure, -then passed; all 107 app-manager tests pass. The same archive bytes were reused, -so the fix did not obscure artifact identity. - -Production staged validation passed with CPython 3.12.3, Torch 2.9.1+cu130, -CUDA 13.0, RTX 5090 Laptop GPU capability `(12, 0)`, real CUDA execution, and a -live sidecar health response with status `ok`, protocol `3`, and capability -`image_generation`. TIPC-09 is passed. Existing runtime installations were not -changed; the candidate was not installed into the main launcher root, selected, -activated, published, or made a default. - -The installed candidate then served the real Nunchaku FP4 rank-128 pipeline from -an isolated launcher/model index. A disconnected 1280×720 request logged -cancellation requested at `23:30:56.981` and completed at `23:30:57.584`; a -following request began only after cleanup and produced a valid PNG in 7.276 -seconds. TIPC-04 passed. The refreshed Tuldok flow then generated, displayed, -saved, and imported a real 1280×720 result in 10.036 seconds; saved PNG SHA-256 -is `cdf9ae632f621606032d91975f86f960d546b39349a83ce6b851b50390fb52a3`. -TIPC-10 passed. The model/profile/gateway were stopped afterward, GPU occupancy -returned to baseline, and main-root runtime selection remained `0.1.4`. diff --git a/docs/plans/torch-diffusion-serving/reports/tuldok.md b/docs/plans/torch-diffusion-serving/reports/tuldok.md deleted file mode 100644 index 3fe8c6ed9..000000000 --- a/docs/plans/torch-diffusion-serving/reports/tuldok.md +++ /dev/null @@ -1,89 +0,0 @@ -# Tuldok workflow evidence - -A3 passed: the actual browser discovered Nunchaku on release gateway 18767, -generated and displayed a prompt-matching 512×512 PNG in 11.047 seconds, saved -matching bytes and imported them into a collection. Evidence: -`launcher-data/cache/torch-qualification/tuldok-nunchaku-real/` contains -`display.png`, `saved.png` and `result.json`; see [Nunchaku details](nunchaku.md). - -## Corrected-candidate 1280×720 acceptance - -TIPC-10 passed separately against refreshed Tuldok -`a61daeec83779868cf03b14fb5c811fcdc608fc2`, Pumas -`ab3a95a9369a5471127003fcd8e6fff529596cb5`, and production-installed exact -`torch-runtime-0.1.6` archive SHA-256 -`74f9b593dff1e447a73571dc465efd520238ba0c56d2730393a17eee2b97426c`. - -The real headless browser discovered -`diffusion/nunchaku-ai/nunchaku-z-image-turbo`, submitted the red ceramic -teapot/yellow lemon/blue table prompt at 1280×720 with seed 42, displayed the -result at 1280×720, saved the exact response PNG, and automatically added it to -the temporary collection. Browser elapsed time was 10.036 seconds; runtime -generation reported 9.553 seconds, eight steps, guidance zero, and sequential -CPU offload. Saved PNG SHA-256 is -`cdf9ae632f621606032d91975f86f960d546b39349a83ce6b851b50390fb52a3`. -Visual inspection confirmed the prompt. Evidence: -`launcher-data/cache/torch-qualification/tipc-0.1.6-tuldok-real/` contains -`display.png`, `saved.png`, and `result.json`. This new result does not relabel -the earlier 512×512 evidence. - -Implemented a separate Generate images workspace. Discovery admits only models with -`image_generation`; the gateway URL is independent of the existing VLM settings. -Requests validate prompt, dimensions and seed, permit one operation, never retry, -and propagate cancellation/disconnect. Responses must decode as bounded PNGs with -matching dimensions before display. Save PNG preserves response bytes; Add to -collection uses the existing dataset source-image boundary. - -Verification on 2026-09-13: - -- Python suite: 21 passed, including transport, response validation, cancellation, - and existing corner detection behavior. -- New real-browser fixture: discovered the image model while excluding a VLM; - displayed 512×512, saved matching bytes and imported matching source content; - malformed output preserved the previous image; cancellation closed the backend - request; the following request succeeded; four actions made exactly four requests. -- Existing `node tests/browser.cjs`: passed camera, timer, labels, validation, - corner dragging, metadata, export/import, responsive layout, all three AI - providers and unsaved suggestions. -- Visually inspected the new browser screenshot. The fixture image is synthetic - transport evidence and does not establish model inference or prompt relevance. - -Evidence under `launcher-data/cache/torch-qualification/`: -`tuldok-tests.log`, `tuldok-browser-images.log`, -`tuldok-vlm-browser-regression.log`, and `tuldok-browser-fixture/`. -Fixture saved PNG SHA-256: -`2cea36f05c163fbbb9d1ce96d01f61b7079ff7d394fd38724112fa4095be04a8`. - -Pumas shared provider declarations now admit Torch profiles and mixed Torch/llama -serving status. The Torch panel uses shared runtime profiles and exposes the -advertised Pumas gateway URL. Type checking and 58 existing serving tests passed; -the mixed-provider regression was being added. At that source-only checkpoint, -shared desktop and real model acceptance remained pending. - -## Real VLM regression - -The real Tuldok browser passed corner suggestion and save through the M2 Pumas -release gateway `http://127.0.0.1:18767/v1`. Model: -`vlm/qwen35/huihui-ai--huihui-qwen3_8-27b-abliterated-gguf__files_c9865f62d5e8`, -llama.cpp `b10883+vulkan`, separate managed profile `torch-acceptance-vlm`, -4096 context, GPU layers -1. An existing book photo was imported into a temporary -dataset; the user's source dataset was unchanged. In 80.512 seconds, the VLM -identified the book and returned four visible corners. The browser displayed an -unsaved suggestion, then saved it with `llamacpp` and exact model provenance. -Screenshot and JSON: `tuldok-vlm-real/`; log: `tuldok-vlm-real.log`. - -Earlier attempts are retained as failures: the 9B package lacked an image -projector, and an IQ4_KS package used unsupported GGML type 133. A subsequent -profile cleanup initially returned an internal error; the following managed -launch succeeded. No model files or user runtime profiles were altered to work -around these failures. - -## FLUX.2 with Pumas-converted FP8 encoder — A4 passed - -The real browser flow passed against release -`b11742c95e7dc68d82abd790618a6cba9e012dbc95e7c8ad8cb60f9165b45b74` -and gateway `http://127.0.0.1:38035/v1`: capability discovery, prompt submission, -512x512 display, PNG save and exact-byte collection import. Generation took -8.843 seconds. Evidence: `tuldok-flux2-fp8-real/` under the qualification cache. -Both image models remain served. Existing VLM and library-only evidence was -retained rather than expanding verification contrary to the user's instruction. diff --git a/docs/plans/torch-diffusion-serving/reports/upstream-v210-cu130-flux2-e2e.md b/docs/plans/torch-diffusion-serving/reports/upstream-v210-cu130-flux2-e2e.md deleted file mode 100644 index a299a3044..000000000 --- a/docs/plans/torch-diffusion-serving/reports/upstream-v210-cu130-flux2-e2e.md +++ /dev/null @@ -1,65 +0,0 @@ -# Real upstream Torch 2.10 CUDA FLUX.2 and Tuldok trial - -Date: 2026-09-23 America/Vancouver (2026-09-24 UTC). Pumas source commit: -`28c4ae1fa2839ade4cecb9a0da34cedfa863e000` on -`work/torch-version-management`. Tuldok source commit: -`a61daeec83779868cf03b14fb5c811fcdc608fc2`. - -This is a real GPU and Tuldok browser result using the current Pumas RPC binary. -Pumas install, selection, startup trial, model load, and cleanup were invoked by -RPC. The Pumas desktop UI was not exercised in this run. An isolated launcher -root under `launcher-data/cache/torch-qualification/v210-e2e-root/` kept the -main library's Torch state unchanged. Its model directory linked to the existing -local model assets; Pumas indexed 89 real models from that directory. - -## Exact environment and installation - -- Upstream stable `v2.10.0` was previewed without a Pumas recipe and installed - from 66 resolved, hash-locked binary artifacts. The resolved Torch wheel was - `torch-2.10.0+cu130` for CPython 3.12 Linux x86_64, SHA-256 - `858f0cbcc78d726fea9499eb3464faa98392fa093845a3262209bd226b7844d6`. - Its URL and every other artifact URL/hash are retained in the isolated - runtime's `resolution.json` and `requirements.txt`. -- The chosen optional adapter was FLUX.2: Diffusers 0.37.0, Transformers - 4.57.6, Accelerate 1.12.0, and PEFT 0.18.1. The host used Python 3.12.3, - an NVIDIA GeForce RTX 5090 Laptop GPU with 24,463 MiB, and driver 595.84. - No interpreter provisioning or source build occurred. -- The managed installer published exactly one `v2.10.0` runtime without - selecting it or setting a default. Install probes passed exact Torch import - (`2.10.0+cu130`), CPU and CUDA tensor operations, sidecar app health/protocol - 3, and NVIDIA sm_120 visibility. FLUX.2 imports passed; model execution was - correctly reported as inconclusive at install time. -- Explicit selection succeeded. The managed profile `torch-image-acceptance` - passed its separate owned-listener, `/health`, and protocol-3 startup trial, - advertising `image_generation`. It was generation `1` in this process. - -## Real model and Tuldok result - -Pumas loaded library model -`diffusion/black-forest-labs/flux_2-klein-9b-kv-fp8` through the managed -Torch profile and advertised it at `http://127.0.0.1:18778/v1`. The checkpoint -`flux-2-klein-9b-kv-fp8.safetensors` had SHA-256 -`33f7da5625a00798349a719742999d3c7dd20c1a7eda14663922c363640728f1`. -The serving RPC returned `loaded: true` and one loaded model. - -The actual Tuldok headless browser discovered this model from Pumas, sent the -red-teapot/yellow-lemon/blue-table prompt at **1280×720**, seed 42, displayed -the generated PNG at 1280×720, saved its bytes, and automatically added the -image to its temporary collection. Browser elapsed time was 20.732 seconds; -generation metadata reported 20.212 seconds, four steps and guidance 1. The -saved PNG is decodable at 1280×720, visually matches the prompt, and has -SHA-256 `54d5cf36b9156b4bad71b4702a42cb61eea6beaff1200a227b855390deb00555`. -Evidence is in `v210-e2e-root/tuldok-flux2-real/{result.json,saved.png,display.png}`. - -FLUX.2 then unloaded, leaving zero served models. The exact managed sidecar -generation stopped. After an isolated Pumas restart, `v2.10.0` remained -installed and selected, the default remained unset, and no model was served. -A fresh startup trial passed after restart and was stopped. Both test Pumas -servers were terminated. The main library still had its prior installed -`torch-runtime-0.1.1`–`0.1.4` set, selected `torch-runtime-0.1.4`, and unset -default. - -This result demonstrates one concrete non-2.9.1 install, startup, real model -load, and Tuldok image inference path. It does not cover Pumas desktop UI -installation/selection, Nunchaku on Torch 2.10, other Python/build combinations, -failed trials, cancellation, or switching in the real desktop. diff --git a/docs/plans/torch-diffusion-serving/reports/upstream-v214-cu132-flux2-klein-e2e.md b/docs/plans/torch-diffusion-serving/reports/upstream-v214-cu132-flux2-klein-e2e.md deleted file mode 100644 index 148d504d4..000000000 --- a/docs/plans/torch-diffusion-serving/reports/upstream-v214-cu132-flux2-klein-e2e.md +++ /dev/null @@ -1,40 +0,0 @@ -# Torch 2.14 CUDA FLUX.2 Klein and Tuldok acceptance - -Date: 2026-09-26 America/Vancouver. Pumas source: `work/torch-version-management`, after `b1ff6b54` and the FP8-specific admission repair in this change. This trial used the isolated launcher root `launcher-data/cache/torch-qualification/v214-flux2-e2e-root/`, not the main desktop launcher root. Its managed runtime is upstream Torch `2.14.0+cu132`, managed Python 3.14.7, adapter `flux2`, Diffusers 0.37.0 and Transformers 4.57.6. The selected image profile was `torch-image-acceptance`. - -## Why the checkpoint size was misleading - -The FLUX.2 Klein checkpoint is 9,818,935,984 bytes (9.14 GiB) on disk. The installed adapter expands its scaled FP8 transformer weights to BF16 and also loads the Qwen3-8B encoder and standalone VAE. Pumas selected the library-managed FP8 Qwen3 package, whose config declares `quant_method: fp8` and 128×128 blocks. The previous unconditional 42 GiB available-RAM admission rejected this host before model load at about 39 GiB available. The repaired admission permits 38 GiB only when both the selected library record identifies FP8 and the safely resolved Qwen3 config matches. BF16 and unknown variants retain 42 GiB. - -## Real bounded memory and image runs - -All runs used the installed runtime and real library assets, no mocked progress or image data. The native probe is `scripts/acceptance/flux2_memory_probe.py`; the managed acceptance runner is `scripts/acceptance/flux2_v214_rpc_acceptance.py`. They require a systemd cgroup memory limit and disabled swap. The managed runner starts a fresh Pumas RPC on port zero, verifies model readiness in `/v1/models`, calls `/v1/images/generations`, runs the actual Tuldok browser test when requested, and unloads/stops task-owned processes. - -| Run | Result | Cgroup peak | Limit pressure / OOM | -| --- | --- | ---: | --- | -| Native 512×512 | PNG, seed 42, four steps; SHA-256 `8351e2b416e5651d64039238a76426e4c777c054b92511648894f7799b0fcb60` | 27,054,182,400 B | 0 / 0 at 32 GiB cap | -| Native 1280×720 | PNG, seed 42; SHA-256 `dd8c7b98590851c4595f56ce432658e88beca8832d47897f1f03528601e65578` | 34,359,738,368 B | 74 / 0 at 32 GiB cap | -| Managed RPC/gateway 512×512 | Loaded and advertised image model; endpoint returned the same SHA-256 as native; unload and profile stop passed | 30,644,625,408 B | 0 / 0 at 32 GiB cap | -| Managed RPC/gateway plus Tuldok browser | 512×512 gateway request passed; Tuldok discovered, generated, displayed, saved and imported a real 1280×720 PNG | 36,507,394,048 B | 490 / 0 at 34 GiB cap | - -The 1280×720 runs touched their cgroup caps and incurred memory reclaim; their peaks are **capped observations**, not uncapped workload maxima. There were no cgroup OOM or OOM-kill events. During the full Tuldok trial, the active guard measured at least 22,444,679,168 bytes (20.9 GiB) of host `MemAvailable`; the RPC and Torch sidecar were verified in the same bounded scope. The 38 GiB Pumas check is an admission heuristic for this qualified FP8 encoder path, not a memory reservation or guarantee for arbitrary image dimensions. - -The real Tuldok browser requested 1280×720, seed 42, four steps and guidance 1. It reported 13.995 seconds for the browser job, displayed the decoded image at 1280×720, saved its PNG, and automatically added it to the collection. Saved PNG SHA-256: `ba32e3506ebee5a9e48c35c506777fa6b946b3ea9d7c45c86d1b6befd454750f`. Visual inspection shows the requested red teapot and yellow lemon on a blue table; the image also contains a second red vessel. Retained evidence is under `launcher-data/cache/torch-qualification/v214-flux2-e2e-root/tuldok-flux2-v214-real/{result.json,saved.png,display.png,browser.log}`. This evidence directory is local and ignored by Git. - -Five focused Rust admission tests, Rust formatting, a rebuilt debug RPC binary, syntax checks for both acceptance scripts, the native image runs, managed gateway runs, and real Tuldok browser acceptance passed. Independent read-only review found no remaining blocker in the FP8 classifier or test cleanup. All task-owned RPC, sidecar and browser processes stopped after the runs. - -## Desktop deployment state - -At the time of this isolated trial, the main selected `v2.14.0` runtime was -still the earlier Core (`adapter: none`) installation. A new local Linux -AppImage and deb were -built with the repaired release RPC. The AppImage SHA-256 is -`b05e198d0a29ec5049b7afaaa9678afd41bde861e7ce34d5f7e27fabdc60711c`; -the deb SHA-256 is -`af8d0e8ae81e087806218aa254a1a28a7be656d75a04c0211c22bd7b8d0f17c6`. -Both extracted packages matched their staged RPC/resources and passed RPC -`/health` smoke tests. The main runtime was subsequently replaced through the -managed installer, and the real AppImage load/gateway/Tuldok flow passed on -2026-09-27 as recorded in the -[version-manager inventory](upstream-version-manager-progress.md). Nothing was -published. diff --git a/docs/plans/torch-diffusion-serving/reports/upstream-version-manager-progress.md b/docs/plans/torch-diffusion-serving/reports/upstream-version-manager-progress.md deleted file mode 100644 index fff8e3be9..000000000 --- a/docs/plans/torch-diffusion-serving/reports/upstream-version-manager-progress.md +++ /dev/null @@ -1,1060 +0,0 @@ -# Upstream Torch version manager progress - -Date: 2026-09-27 (America/Vancouver). This is an implementation and evidence -inventory. Torch 2.14 FLUX.2 Klein now has real 1920×1080 AppImage gateway and -Tuldok browser acceptance from the main launcher root. The prior -[A1 packaged acceptance](a1-packaged-acceptance.md) applies only to its original -`v2.9.1` / CPython 3.12 / CUDA 13.0 / Linux x86_64 combination. The earlier -Torch 2.10 Tuldok result is separate from the Torch 2.14 results below. - -## 2026-09-27 — Recover Nunchaku serving after FLUX - -After unloading FLUX, the user tried to serve -`diffusion/nunchaku-ai/nunchaku-z-image-turbo` from the selected main-root -`v2.14.0+cu132` FLUX-only runtime. Its sidecar log recorded -`ModuleNotFoundError: No module named 'nunchaku'` before checkpoint loading. -The selected runtime's probe had marked Nunchaku `not selected`; generic -`image_generation` protocol capability alone did not mean every adapter was -installed. The selected Nunchaku wheel is pinned by -`torch-server/resolve_runtime.py` and the bundled lock to Nunchaku -`1.2.0+torch2.9`, CPython 3.12, Torch 2.9.1+cu130, and Linux x86_64. Commit -`04e4ce2b7` introduced that exact URL/hash and compatibility check on -2026-09-23. The original CUDA 12.8 candidate failed a real native import -because it required `libcudart.so.13`; the corrected CUDA 13.0 recipe is -recorded in [the runtime report](runtime.md). This is the currently qualified -binary combination, not a permanent Nunchaku restriction. The official -[Nunchaku releases](https://github.com/nunchux-ai/nunchaku/releases) include -newer Torch-targeted wheels, but no Torch 2.14/Python 3.14 wheel was qualified -for this Pumas runtime. - -Through the rebuilt AppImage's managed RPC, Pumas installed the pinned -`v2.9.1` `bundled` runtime alongside the preserved `v2.14.0` install. Its -Torch/CUDA and both adapter import probes passed; real model inference remained -unverified until the tests below. A managed protocol-3 startup trial and real -Nunchaku model load passed. A 1280×720 gateway image also passed. The next real -1920×1080 request failed before inference because the installed Z-Image -pipeline requires dimensions divisible by 16. `NunchakuZImage` now opts into -the shared adapter's round-up and center-crop behavior: infer at 1920×1088, -return exactly 1920×1080. A native regression test reproduced the old failure -and passed with the fix; the existing FLUX dimension test still passed. -Independent read-only review found no lifecycle or output-validation blocker. - -The pre-fix 2.9.1 environment was preserved under -`launcher-data/cache/torch-qualification/main-v214-nunchaku-repair-20260927/pre-dimension-backup/`. -Pumas removed the inactive version and reinstalled it with the rebuilt embedded -sidecar through a fresh managed preview. The second installer log is -`launcher-data/logs/install-v2.9.1-1790507472804.log`; its materialized -`diffusion.py` matches current source. The rebuilt release RPC SHA-256 is -`4f50eb364c895021bc127803cfd9e7fca89e8059d07c35911e8452eefe5efe64`. -The local, unpublished AppImage SHA-256 is -`d8caa386a95d904e349c4dcaaf8bf54432fc9b842633ae3c7857ff4c688053d8`; -the AppImage and deb passed the Linux artifact checker. - -The repaired managed gateway loaded Nunchaku and returned a real 1920×1080 -PNG in 20.081 seconds, SHA-256 -`513295f98937498f028a1bff8af879f578347b410a99fe27538b95befa16fbfe`. -The **rebuilt AppImage's own** RPC then loaded Nunchaku. A task-owned Tuldok -browser discovered it, generated a real 1920×1080 image, displayed it, saved -it, and automatically imported it into its temporary collection in 20.751 -seconds; saved PNG SHA-256 -`a70255be804e829430f10e244deed53f004bed7edf9ac18a4081b7ef6fc71fdc`. -The displayed image was visually inspected. Ignored evidence is under -`main-v214-nunchaku-repair-20260927/tuldok-appimage-1920x1080/`. The gateway -was `http://127.0.0.1:44581/v1` in this session; its port changes on restart. -The model load used the AppImage RPC, not a repeat click through its UI. - -At this checkpoint `v2.9.1` is the active Torch version for Nunchaku, while -`v2.14.0` remains installed and the configured default for FLUX. Torch version -selection is global: the two versions cannot serve models simultaneously, and -changing the active version requires unloading models and stopping the Torch -profile. The current managed 2.9.1 bundled runtime passed both adapter import -probes, but real FLUX generation in **that exact new runtime** was not rerun -here. No release was published. - -## 2026-09-27 — Repair Tuldok's 1920×1080 generation failure - -After the main-root FLUX installation below, Tuldok requested 1920×1080 from -the AppImage. The sidecar log showed all four GPU inference steps completing, -then `/api/images/generate` returned HTTP 502. Diffusers rounded the requested -1080 height down to 1072 because FLUX requires multiples of 16; the sidecar's -exact-size check correctly rejected that image. Subsequent health/slot checks -passed, so this was a response-size failure rather than a sidecar crash. - -The FLUX adapter now rounds pipeline dimensions **up** to multiples of 16, -then center crops the result to the requested size. Its 1920×1080 request -therefore generates at 1920×1088 and returns an exact 1920×1080 PNG. Other -adapters retain their existing dimension behavior, and both sidecar and gateway -PNG size checks remain in force. The native regression test failed against the -old behavior and passed after the repair; three focused FLUX tests and ten image -request contract tests passed. Independent read-only review found no lifecycle -or security blocker. - -The previous managed FLUX runtime was backed up under -`launcher-data/cache/torch-qualification/main-v214-flux-repair-20260927/pre-dimension-backup/`. -With its profile stopped, Pumas switched to the installed fallback and used its -preview/remove/install flow to materialize the repaired `v2.14.0+cu132` FLUX -sidecar. The new runtime was selected and defaulted. The installer log is -`launcher-data/logs/install-v2.14.0-1790505527380.log`; its source -`diffusion.py` matches the repaired source file. The rebuilt release RPC has -SHA-256 `36af552359f5ef1b522976bbc6cc2c61f0810fbcd69fd5757a2c676ae78e1e92`. -The rebuilt local, unpublished AppImage has SHA-256 -`f12b98fc6d5c2dbfe2b469228ca90d1fdc7ebe09e000e95b6c45461a4885f9a8`. - -The managed gateway loaded and advertised the real FLUX checkpoint, then -returned a 1920×1080 PNG in 23.389 seconds (SHA-256 -`702fc7d018b7d4b933497c3db6bb3c067f0219f137b91d9ea70e69b7ac8a8a19`). -The **rebuilt AppImage's own** RPC loaded the same model. A temporary -1920×1080 variant of Tuldok's real browser acceptance script discovered it -through the AppImage gateway, generated a real image, displayed it at the -requested size, saved it, and automatically imported it into the collection. -The Tuldok job took 23.526 seconds and its saved PNG had the same hash. The -local ignored evidence is under -`main-v214-flux-repair-20260927/tuldok-appimage-1920x1080/`, including -`result.json`, `saved.png`, and `display.png`. The screenshot was visually -inspected. This acceptance used a task-owned Tuldok browser instance and the -AppImage RPC; it did not click the AppImage's model-serving UI again. The -observed gateway was `http://127.0.0.1:41253/v1`; its port changes on restart. -The user's separately running Tuldok instance on port 8091 then submitted its -own 1920×1080 FLUX request to that same gateway. Job -`c06969191f5542e09c84931737fbc661` completed with one image and no error; -`/api/samples` contained `synthetic-c0696919-00001.png` at 1920×1080 in -session `2026-09-12-desk`. The user also confirmed image generation worked. -No release was published. - -## 2026-09-27 — Repair the real AppImage FLUX model load - -The user launched the local `Pumas.Library-0.7.0.AppImage` and tried to serve -FLUX.2 Klein. Its Electron log recorded a real sidecar load failure: -`No module named 'diffusers'`. The AppImage bundled the repaired RPC, but the -main selected/default `v2.14.0` installation was the earlier Core recipe with -`adapter: none`. The FLUX-enabled 2.14 installation from the previous trial -was in an isolated launcher root, so it was not available to this AppImage. - -The failed profile, Electron log, Core runtime, selection/default metadata and -profile metadata were preserved under -`launcher-data/cache/torch-qualification/main-v214-flux-repair-20260927/core-backup/`. -With the Torch profile stopped, Pumas selected the existing `torch-runtime-0.1.4` -fallback, cleared the default, removed the inactive 2.14 entry through RPC, -and installed `v2.14.0` again through its managed preview/install flow with -`cu132`, Python 3.14 and `flux2`. The new main-root probe passed Torch -`2.14.0+cu132`, CPU/CUDA operations, sidecar health, and FLUX imports. The -installer log is `launcher-data/logs/install-v2.14.0-1790504224408.log`. -Pumas then selected/defaulted the new 2.14 runtime; its managed startup trial -passed protocol 3 and health. - -The local packaged RPC loaded FLUX Klein from the main root, advertised it in -`/v1/models`, and returned a real 512×512 PNG. Tuldok browser generation, -display, save and automatic collection import passed at 1280×720. The same -checks then passed using the **running AppImage's own** RPC and gateway; its -Tuldok result took 14.7 seconds and saved PNG SHA-256 -`ba32e3506ebee5a9e48c35c506777fa6b946b3ea9d7c45c86d1b6befd454750f`. -At completion, the AppImage remained running with FLUX ready in `/v1/models` -and the `torch-image-acceptance` profile running. The gateway URL observed in -that session was `http://127.0.0.1:41009/v1`; its port is assigned at startup. -Local ignored evidence is in `main-v214-flux-repair-20260927/`, including -`tuldok-appimage/{result.json,saved.png,display.png}` and before/after RPC -snapshots. No new source or release build was needed, and nothing was published. -The successful model load was invoked through the AppImage's RPC; a second -manual click through its model-serving UI was not part of this check. - -## 2026-09-26 — Real Torch 2.14 FLUX.2 Klein endpoint and Tuldok acceptance - -The [exact v2.14/cu132/FLUX.2 report](upstream-v214-cu132-flux2-klein-e2e.md) -records a real isolated managed runtime with the library's FLUX.2 Klein 9B KV -FP8 checkpoint, FP8 Qwen3-8B encoder, and standalone VAE. Although the -checkpoint is 9.14 GiB on disk, the adapter expands transformer weights to -BF16 and the first high-resolution image touched a 32 GiB test limit. A native -512×512 and 1280×720 PNG both generated. The previous 42 GiB admission was -repaired to permit 38 GiB only for a selected validated FP8 Qwen artifact with -matching in-package Qwen3 FP8 config; BF16 and unknown variants retain 42 GiB. - -The rebuilt source RPC loaded FLUX in a fresh isolated launcher root and -advertised it in `/v1/models`. Real `/v1/images/generations` requests returned -decoded PNGs. The actual Tuldok browser discovered the image model, generated -at 1280×720, displayed the image, saved it, and imported it into its collection. -The full run used a 34 GiB capped scope with no OOM events; 490 memory-limit -reclaim events show pressure at the cap. The host stayed at least 20.9 GiB -available during that run. The model, profile, RPC and browser were stopped. - -This qualified the isolated v2.14+FLUX tuple and the Pumas endpoint/Tuldok path. -At this 2026-09-26 checkpoint the main selected v2.14 installation was still -Core (`adapter: none`). The 2026-09-27 managed replacement and packaged desktop -acceptance above supersede that deployment gap. No release was published. - -## 2026-09-26 — Repair pip rate collection across versions and keep it visible - -The latest `install-v2.14.0-1790467476710.log` selected `2.14.0+cu134` but -failed package resolution before wheel transfer. It had no rate to report. The -previous collector also missed otherwise successful downloads: the managed -pip 26.2.1 release removed `_prepare_download`, and pip 24's legacy helper -uses `resp` rather than the strictly required `response` parameter name. - -The worker now instruments pip's imported `response_chunks` stream and keeps a -fallback for older `_prepare_download` versions. If neither API exists, it -reports monitoring unavailable. A real throttled 2 MiB wheel installed through -the managed CPython 3.13.15 / pip 26.2.1 path; pip reported 2.5 MB/s and the -sidecar recorded two positive-rate samples. The legacy pip path has mocked -regression coverage, not a live install result. - -The install dialog shows the network status during package resolution and -installation, and the header keeps it visible beside queued model activity. -Zero-progress dependency work remains indeterminate (so the overall 95% does -not look frozen), and explicitly inactive transfers no longer show a stale -sampled rate. Astra High's read-only review approved these repairs. Verification -passed: 741 frontend tests, typecheck/build, 58 resolver tests and Ruff, 231 -app-manager tests, 262 RPC unit tests, 17 RPC integration tests, 180 Electron -tests (1 skipped), contract generation check, Rust formatting, artifact checks, -and packaged Linux RPC `/health` smokes. - -The rebuilt local Linux v0.7.0 AppImage SHA-256 is -`a656a3937335e1b45ef30c25f7a133c728520347cfdc50d5a1539d0e9a493135`; the deb -SHA-256 is `e33d418fc848e83e3c256cc07e1d87fab80f6243c1ece1bd4cedcf5e834f7c35`. -The packages are unpublished, so the toolbar-linked release is unchanged. No -fresh Torch installation or Tuldok generation was performed. This collector -measures pip package transfers; managed Python/bootstrap and other Pumas -network producers remain uncovered. - -## 2026-09-26 — Installed Torch 2.14 image-serving gate check - -The selected local `v2.14.0` is `2.14.0+cu132` on managed Python 3.14.7 with -`adapter: none`. Its environment has no Diffusers, Transformers, Accelerate, or -PEFT distribution. A real CUDA tensor on the host RTX 5090 returned `5`; the -managed Pumas `trial_torch_runtime` RPC passed startup, health, protocol 3, and -the sidecar's `image_generation` handshake, then the trial profile was stopped. -The public Pumas `GET /v1/models` returned an empty model list. A direct socket -startup of the exact installed sidecar also returned HTTP 200 from `/health`. - -The library has the FLUX.2 Klein checkpoint, Qwen3-8B component package, and -standalone VAE. A real `serve_model` RPC for the FLUX checkpoint returned -`insufficient_memory` before model load: Pumas measured 66,815,033,344 bytes -total RAM at 38.48% usage, below the existing 42 GiB available-RAM gate. The -gateway still advertised no image model afterward. The temporary RPC and -sidecar processes were stopped. These checks do **not** qualify v2.14 image -generation or Tuldok display/save: the installed Core recipe lacks a supported -image adapter, and this host currently fails FLUX admission. - -The desktop Torch install preview previously hardcoded `adapter: none` despite -the managed installer supporting a separate `flux2` choice. The preview now -offers that choice when reported by the manager, preserves the manager's -supported default, sends the selected adapter to the one-use preview, and -rejects a returned selection for a different adapter. Existing installed tags -remain immutable; enabling images for the current v2.14 tag requires a managed -replacement after an isolated v2.14+FLUX qualification and enough available -RAM. No installed runtime, model, or public release was replaced here. - -Verification for the preview change passed 23 focused frontend tests, TypeScript, -ESLint on the touched files, production frontend/Electron builds, Linux artifact -checks, and extracted AppImage/deb resource plus RPC-health smokes. Independent -read-only review found no blocking issue in its adapter authorization or stale -request handling. The rebuilt local, unpublished AppImage SHA-256 is -`f1d452c7bdb116e63634188c9756506c3bea66944fdee13a3ef15fb49890494b`; -the Debian package SHA-256 is -`b010a8e86cddd5c07cd19e28da56b0c09f9e5f62613af5d6b82bd1192fe574b3`. -Neither package was used for a v2.14+FLUX install or real Tuldok generation. - -An isolated follow-up under -`launcher-data/cache/torch-qualification/v214-flux2-e2e-root/` used the real -`preview_torch_runtime` and `install_version` RPC flow for -`v2.14.0`/`cu132`/Python `auto`/`flux2`. The first attempt was cancelled before -completion to avoid a redundant large-wheel transfer from an empty isolated -cache; a private copy of the existing managed pip cache was used for the second -attempt. That attempt installed 67 resolved, hashed artifacts and completed -successfully. Its managed Python 3.14.7 probe passed exact Torch -`2.14.0+cu132` import, CPU and CUDA operations, and FLUX adapter imports -(Diffusers 0.37.0, Transformers 4.57.6). The adapter probe is correctly -`inconclusive` until a model loads. The isolated runtime was explicitly selected, -and its owned Pumas Torch profile passed the protocol-3 startup trial. - -The isolated `serve_model` call reached the existing 42 GiB FLUX RAM admission -gate and returned `insufficient_memory`; Pumas measured 39.16 GiB available RAM -and 23.17 GiB free GPU memory. No model was loaded or advertised by -`/v1/models`. The isolated profile and RPC server were stopped. The exact -resolution, lock, probe, and install log remain in that qualification root. -This confirms the managed v2.14+FLUX dependency and startup path but leaves -Pumas image generation and Tuldok display/save untested until the RAM gate can -pass. The main selected `v2.14.0` installation remains the earlier Core recipe. - -## 2026-09-26 — Bounded live transfer and packaged code check - -The latest successful `install-v2.14.0-1790470772611.log` used cached wheels, -including Torch, and therefore offered no network transfer rate to display. -To check the uncached collector without reinstalling Torch, a 2 MiB local wheel -was served in 32 KiB chunks with 40 ms spacing and installed through the real -managed CPython 3.14.7 / pip 26.2.1 progress worker. Polling its progress file -captured 11 distinct snapshots, including eight active snapshots with positive -rates (first about 936 kB/s). The final snapshot cleared the rate. The local -HTTP source was intentionally omitted from the copyable URL field by the -HTTPS-only source rule; byte and rate measurements remained available. - -The local AppImage (`a656a3937335e1b45ef30c25f7a133c728520347cfdc50d5a1539d0e9a493135`) -contains a frontend bundle byte-identical to the current built bundle and a -backend containing the `response_chunks` pip collector. Focused checks passed: -52 frontend presentation tests, 58 resolver tests, 11 Rust progress tests, -and six RPC installation-progress tests. -The resolver's legacy-pip test fixture was corrected to create the removed -`_prepare_download` attribute when running against pip 26. This evidence -confirms the live worker and packaged files, while the earlier Playwright check -remains a mocked-renderer acceptance. It does not establish a simultaneous -real-transfer, packaged-RPC, renderer observation; no new release build is -required for these findings. - -## 2026-09-26 — Torch download speed visibility repair - -The latest reported log, `install-v2.14.0-1790465718491.log`, selected -`2.14.0+cu134` but pip could not find that package, so the attempt stopped -before downloading wheel files. It therefore had no transfer speed to display. -A worker test with a real delay between pip chunks confirmed that the backend -does publish a positive rate during an active wheel transfer. - -The missing speed was also a UI issue. The progress dialog hid its network row -until the first rate sample or source URL arrived, and the Torch-only header -discarded rates when there was no concurrent model download. The dialog now -shows “Waiting for package transfer…” while packages are being resolved and -“Measuring speed…” while an active transfer awaits its first sample. Once a -sample arrives, the Torch-only header displays the measured rate. Regression -tests cover the pending, pre-sample, and measured-rate states. - -Verification passed: all 729 frontend tests, frontend typecheck and production -build, 56 Torch resolver tests, Ruff, Linux artifact validation, and extracted -AppImage/deb resource and backend `/health` smoke tests. The local Linux v0.7.0 -AppImage SHA-256 is -`a16cd9e3a1d5cc30060c36e041fd7a4cab79f3b915ff33a449204e835369c982`; the deb -SHA-256 is -`cb51f204379d68405696fa9ae30356559f8f996234b7960088eabb078a5db68e`. These -packages are unpublished and do not update the toolbar-linked release. No new -Torch installation or Tuldok image run was performed. The cu134 resolution -failure is separate from this display repair. - -## 2026-09-26 — Torch 2.14.0 staged RECORD failure and repaired local package - -The reported install log shows that Torch 2.14.0+cu132 and its dependencies -downloaded and pip installed into private staging; the failure occurred during -Pumas' staged-file manifest validation. SymPy 1.14.0's wheel places -`isympy.1` under `share/man/man1` using pip's valid `../../share/...` target -scheme. Pumas previously recognized the `../../bin/...` scheme only, so it -misclassified this in-stage file as a path escape. - -The resolver now maps the known pip target scheme roots (`bin`, `share`, -`Scripts`, and `Include`) into the stage before applying containment, file, -size, and hash validation. Regression coverage accepts the SymPy share entry -and still rejects paths into `/etc` or outside the stage. Python tests replayed -the cached SymPy wheel and validated 1,573 staged files. Verification also -passed 54 resolver tests, Ruff, 231 app-manager tests, 725 frontend tests, -frontend typecheck/build, Rust formatting, RPC health, Linux artifact checks, -and extracted AppImage/deb resource and backend health smoke tests. - -The rebuilt local AppImage is 154,937,978 bytes, SHA-256 -`9125fc53b9ff0d6bfbc02e2f3394e799418883dc3e80a262ce2758065ddae76e`; the deb -is 120,530,972 bytes, SHA-256 -`777488fcf931a1e72e5508d35ed2c4caa7b65adb6e87e744dd0367b8bba880d3`. These -are local, unpublished candidates and do not update the toolbar-linked release. -The rebuilt desktop package has not yet been used for a fresh full Torch -install, and this repair provides no new CUDA, Tuldok image, Windows, or macOS -runtime evidence. - -The same work adds a shared network activity registry used by Torch wheel -downloads and installer progress. Any direct HTTPS source host and path is -copyable unless the URL contains embedded credentials, a query, or a fragment; -those potentially secret-bearing sources still expose payload rates without -displaying the URL. Copyable means safe to display, not officially sourced or -hash-validated. Generic DownloadManager and Hugging Face producers, OS-level -supplementary sampling, and native cross-platform permissions remain -unimplemented; network monitoring acceptance is partial. - -## 2026-09-26 — Replace the long Torch check with the real install attempt - -The owner rejected the previous multi-minute compatibility check. For the -normal Core Torch desktop/API path, selection now creates a local one-use token; -installation does not refetch GitHub release metadata, scan every build/Python -combination, or run `pip --dry-run` before it starts. The install task becomes -visible and cancellable, provisions Pumas-managed CPython, and runs a real -binary-only pip install into private staging. Package resolution and large -wheel downloads are part of that installation task, rather than a separate -check whose results are discarded before downloading again. - -Linux automatic selection makes a bounded sequence of up to four -driver-compatible CUDA install attempts, followed by CPU. Windows and macOS use -CPU automatically. Python candidates come from the pinned uv catalog in -newest-first order. Only conclusive missing-wheel/dependency errors permit the -next candidate; network, integrity, timeout, and ambiguous failures stop. Each -successful pip report is checked against official artifact sources and hashes, -staged distribution names/versions, the interpreter/host identity, and a full -installed-file manifest before staged Python runs or files are published. The -generated requirements lock records the result for provenance and repeatable -future installs; dynamic installs do not run pip with the old pre-install -`--require-hashes` preview lock. - -Focused Rust/Python tests and read-only security/lifecycle reviews cover this -source path. The existing AppImage UI install report below used the previous -preview flow and is not acceptance for this change. A rebuilt local Linux -AppImage/deb now passes artifact checks and extracted-backend `/health` smoke; -manual Torch installation through that package remains pending. The fixed -`v2.9.1` bundled adapter remains a separate pinned recipe; image/Tuldok support -claims are unchanged. - -## Scope handoff authorized 2026-09-24 - -The repository owner selected the broad release-management scope after reviewing -this inventory. Every stable upstream `vMAJOR.MINOR.PATCH` tag is discoverable -independently of Pumas qualification when GitHub pagination completes within the -20-page / 120-second request budget. A page failure or exhausted budget returns -an error without a partial list presented as complete. Installation is offered for -an exact official CPU, CUDA, or ROCm binary wheel plus fully resolved dependencies -on Linux x86_64 with an already installed CPython 3.10–3.13. This records the -original Linux-only scope and is superseded for the in-progress install flow by -the 2026-09-25 managed-CPython authorization below. The normal path provisions -stable native CPython 3.10+ from a pinned provider. The previous implementation -chose the newest candidate through an exact wheel/dependency preview; the -direct-install path and its narrower acceptance are recorded above. -On the previous runtime source at `21041697`, Torch 2.14.0 CPU/Core RPC -install/restart and native QA passed on Linux x86_64, Windows x86_64, and macOS -arm64 in manual run -[36229508586](https://github.com/MrScripty/Pumas-Library/actions/runs/36229508586) -on runtime commit `21041697`; each target provisioned Pumas-managed CPython -3.14.7 and installed 25 hashed official artifacts. The earlier Linux v0.7.0 -AppImage UI install/progress flow passed locally under the preview-based path; -it does not validate the direct-install change. The broader support claim -remains bounded by packaged Windows/macOS installation, provider -cancellation/tamper, and non-CPU runtime gates. CPython notices are -generated for all three desktop targets, with fail-closed provider-pin, -archive-mapping, and exact legal-file checks. Pumas does not compile Torch from -source; XPU remains outside this -provider contract. A release with no compatible wheel is discoverable but -correctly rejected for that tuple. - -The fixed qualified `v2.9.1` / CUDA 13.0 / Python 3.12 bundled preset remains a -separate recipe. The current manager path provisions its Python 3.12 base -interpreter from the managed depot; the previous host-interpreter condition is -historical. Other exact combinations, including alternate `v2.9.1` -combinations, use dynamic retained previews and do not inherit the preset's -qualification. The serialized follow-up and acceptance contract live in the -[Torch upstream version management plan](../../torch-upstream-version-management/plan.md); -the current-standards coordination entry is [PRG-I17](../../current-standards-remediation-2026-09-03/issues.md). - -## Cross-platform runtime expansion authorized 2026-09-24 - -Windows x86_64 (`x86_64-pc-windows-msvc`) and macOS arm64 -(`aarch64-apple-darwin`) Torch release-manager paths are implemented in the -current candidate branch under the separate -[cross-platform runtime plan](../../torch-cross-platform-runtime-management/plan.md). -The current runtime source passed v2.14.0 CPU/Core RPC install/restart, exact -wheel, managed identity, and lifecycle checks on all three targets in manual run -[36229508586](https://github.com/MrScripty/Pumas-Library/actions/runs/36229508586) -at `21041697`, including the current metadata-lock follow-up. Per-target logs -and JSON evidence are retained in the linked plan. A preceding run -[36223106097](https://github.com/MrScripty/Pumas-Library/actions/runs/36223106097) -at `07f7e9f6` also verified the 913-second macOS `Retry-After` case but predates -the lock follow-up. Broader support remains gated on packaged desktop and other -incomplete plan requirements. An earlier run at `032045ad` passed Linux but -stopped at Windows/macOS release-list preflight because of a harness retry cap; -the corrected harness completed the latest run. A Windows GNU test-target -compile also passed, but remains compile-only evidence. No macOS compile was -available in this Linux session. The existing -Pumas artifact targets show these target architectures are shipped; they do not -establish Torch runtime behavior. - -The official Torch 2.14.0 CPU index lists Windows x64 local-version wheels -(`2.14.0+cpu`) and native macOS arm64 plain-version wheels (`2.14.0`, -`macosx_14_0_arm64`). The manager must retain upstream distribution version -separately from release and build identity. The official CUDA 13.2 index -contains Windows x64 wheel candidates; that alone does not establish driver -compatibility or CUDA image inference. macOS MPS is a runtime capability, not a -separate wheel channel. These observations are recorded in the linked plan's -[target research](../../torch-cross-platform-runtime-management/reports/target-wheel-research.md). - -No new FLUX.2, Nunchaku, or Tuldok image-generation support is implied. The -current image result stays limited to its recorded Linux tuple until a separate -target/model acceptance proves otherwise. - -## 2026-09-25 — Managed Python and desktop discovery repair - -The install flow no longer requires host-installed Python or a Python choice. -PyTorch wheels do not declare one Python version for an entire release: each -official wheel declares its compatible CPython ABI and platform tags. Pumas -uses its pinned provider catalog to provision stable native CPython candidates -from newest to oldest. Under the previous preview-based path, the manager -retained the first interpreter whose exact selected Torch wheel and complete -dependency profile resolved. The normal install now learns that compatibility -from each real staged pip install. CPython 3.10 is the minimum; no upper minor -cap is configured. A newer candidate is skipped only after a definite wheel or -dependency incompatibility. Provider, network, and incomplete-scan failures -remain inconclusive. See the -[managed Python provider report](../../torch-cross-platform-runtime-management/reports/managed-python-provider.md). - -The manager now defaults every target to Core Torch (`none`). Linux exposes -Pumas' FLUX.2 dependencies only as an explicit advanced profile, and the -qualified v2.9.1 bundled recipe is also opt-in. Windows and macOS expose Core -only until a platform-specific adapter is accepted. UI copy states that Pumas -installs a private Python runtime and does not require Python on the host. - -The reported `Unknown API method: get_torch_release_options` is emitted by the -Electron `api:call` allowlist before a request reaches Rust. The registration -fix is in commit `6a726eac`, with a regression test covering allowlist admission -and payload validation. The local Linux 0.7.0 candidate contains the registration -in its Electron bundle. Its AppImage and deb pass the artifact checker and -bundled RPC health smoke. A package built before that commit still shows the -reported error; the toolbar-linked package has not been replaced or published -by this local build. - -Current host verification: `pumas-app-manager` passed 179 tests and Clippy; -`pumas-rpc` passed 256 unit tests, 17 integration tests, and 2 intent tests -(10 ignored). The RPC suite needs loopback permission; it passed when rerun -outside the sandbox's socket restriction. Electron passed 12 test files -including the RPC registration regression; the Torch preview passed 14 tests -with frontend typecheck/lint; the full 98-test Python suite and Ruff passed. -Rust formatting and `git diff --check` passed. A fresh release build from -`ce9170d4` passed headless startup smoke and artifact validation; both the -AppImage and deb passed bundled RPC health smoke. The packaged Electron bundle -contains `get_torch_release_options`, and the packaged backend contains the -uv 0.12.18 provider pin. - -The v2.14.0 live scan and full Core dependency preview pass through Pumas RPC in -an isolated Linux launcher root. Pinned uv 0.12.18 downloaded with its -published Linux SHA-256 and provisioned managed CPython 3.14.7. The recommended -`cu132` / `python3.14` / `none` preview resolved 44 artifacts. A CPU Core -preview resolved 25 artifacts; its retained resolution installed Torch 2.14.0, -passed installed-identity and CPU-operation checks, and was explicitly selected. -The latter run removed Python, pip, and PyPy from the backend's child `PATH` and -deleted its temporary launcher root afterward. At the time of this Linux-only -run, CUDA/device execution, sidecar lifecycle, and native Windows/macOS runtime -acceptance remained pending; later Linux lifecycle and three-platform native -acceptance are recorded below. - -The live report exposed two stale compatibility assumptions. uv's actual -python-build-standalone catalog URLs use -`releases.astral.sh/github/python-build-standalone/...`, and current official -PyTorch indexes return wheel files directly under `/whl/{channel}/`; the Rust -validators now accept those exact official forms while retaining host, channel, -filename, tag, and nesting checks. The uv pin now uses published 0.12.18 and -version/hash-scoped cache paths, preventing a previous bootstrap from being -mistaken for the new pin. The missing Electron RPC allowlist registration was -already fixed in `6a726eac`; toolbar-linked release publication remains -separate from these local builds. - -## 2026-09-25 — Managed Torch 2.14.0 CPU/Core lifecycle acceptance - -This run supersedes the earlier statement that v2.14.0 sidecar lifecycle was -unverified. Through Pumas RPC in an isolated Linux x86_64 root, uv 0.12.18 -provisioned CPython 3.14.7 and the retained CPU/Core preview resolved 25 exact -artifacts. With an empty backend child `PATH`, the installer verified Torch -2.14.0 identity and CPU operation; the installed sidecar dependencies passed; -the runtime was selected; a managed CPU profile passed startup, health, and -protocol 3; and its owned generation was stopped before graceful backend -shutdown. The acceptance verified the venv's actual base interpreter, private -depot containment, executable hash, and provider archive digest. - -The retained [acceptance evidence](../../torch-cross-platform-runtime-management/reports/v2.14.0-linux-cpu-rpc-acceptance/) -contains the exact runtime record, wheel resolution, pip report, installed probe, -acceptance summary, and RPC log. At the time of this Linux-only acceptance, -Windows/macOS were covered by an opt-in native CI matrix but had not run; the -later three-platform manual acceptance is recorded below. This does not -establish CUDA/device execution, packaged desktop installation, an image -adapter, or Tuldok behavior for v2.14.0. - -## 2026-09-25 — Native test coverage and desktop RPC diagnosis - -The production automatic Python preview now has a platform-neutral regression -test for newest-first candidate selection, fallback only after definite wheel -or dependency incompatibility, and stopping on inconclusive resolver or -interpreter-provisioning failure. Windows and macOS provider tests cover -cancellation, timeout, descendant draining, and closed admission. The native -quality workflow runs those provider tests on all three OSes and has a guarded -Windows/macOS run for the fallback test. At the time of this entry, Linux -app-manager verification passed all 180 library tests; Windows GNU test-target -checking was compile-only, and Windows MSVC/macOS tests still needed native -runners. Later native run results are recorded below. - -The reported `Unknown API method: get_torch_release_options` identifies an -older Electron bundle: the current source and local Linux candidate register -the method, but the toolbar-linked package has not been replaced. The managed -runtime path already provisions private CPython automatically; users do not -select a Python version or need Python on the host. Keep the toolbar-linked -release update, native Windows/macOS install and lifecycle acceptance, provider -license attribution, and packaged desktop Torch installation open. Do not -extend the Windows/macOS runtime support claim until their native gates pass. - -The public [`v0.7.0` prerelease](https://github.com/MrScripty/Pumas-Library/releases/tag/v0.7.0) -was published on 2026-09-17, and its installer assets date from that build. The -local Linux 0.7.0 candidate was rebuilt on 2026-09-25 with the RPC allowlist -repair. The reported error is raised by Electron IPC validation before the Rust -Torch manager runs, so no Python/build selection can correct that installed -bundle. The public toolbar-linked release remains unchanged. - -## Current branch behavior - -- Stable upstream `vMAJOR.MINOR.PATCH` releases are discovered independently of - Pumas qualification. Torch pagination continues until a short end-of-list page, - with a 20-page / 120-second budget; a page error, deadline, or exhausted page - budget fails without returning a partial list as complete. Non-Torch release - listing restores the target base's one-page / 100-item budget. A new cache records - completeness; an old unmarked Torch cache containing exactly 100 or 1,000 - entries is refreshed because these counts match earlier one-page and - ten-page caps. Prereleases, nightlies, and source builds remain outside this - scope. The v2.14.0 CPU/Core RPC install, managed-provider, restart, and - sidecar acceptance passed on Linux x86_64, Windows x64, and macOS arm64 in - manual run [36229508586](https://github.com/MrScripty/Pumas-Library/actions/runs/36229508586) - on `21041697`, including the metadata-lock follow-up. This is historical - evidence for that source, not qualification of later stacked PR candidates. - This does not close packaged-desktop, non-CPU, image-adapter, or Tuldok gates; - see the linked cross-platform plan. Installed local releases remain visible - when upstream discovery fails. -- The qualified 2.9.1 recipe remains a fixed CUDA 13.0 / CPython 3.12 bundled - preset. The updated manager provisions its CPython 3.12 base from the pinned - provider catalog. Other stable releases try stable native CPython candidates - from newest to oldest (3.10 minimum, no upper minor cap) against exact official - CPU/CUDA/ROCm wheels and complete dependencies. The UI has no Python selector - and shows the Pumas-provisioned interpreter after preview. Provider/network failures remain - inconclusive and cannot trigger a downgrade. Clean-host managed CPython - provisioning and CPU/Core installation pass without host Python on Linux, - Windows, and macOS. One installed build/interpreter/adapter combination is - supported per upstream tag; a different combination requires a fresh preview. -- For the accepted v2.14.0 CPU/Core runs, dynamic install choices come from a - bounded scan of the official PyTorch - wheel directory and exact per-channel indexes for the selected release and - managed CPython candidate tags. A release/build/Python pair is offered only when that - exact Torch wheel exists for the target host and interpreter tags. Partial - scans remain inconclusive; - they do not turn an unobserved wheel into a confirmed absence. The desktop uses - the manager recommendation without requiring build, Python, or image-profile - selections, and advanced settings contain only returned exact pairs. On a - NVIDIA+Intel host, CUDA and CPU may be shown while ROCm is filtered out. - Automatic CUDA selection requires a complete scan and an installed NVIDIA - driver meeting the documented Linux minor-compatibility floor for the channel; - unknown/newer channel families remain advanced. Minor compatibility can limit - features and PTX, so device and model checks still run after installation. - ROCm remains an advanced choice because PCI detection and an `amdgpu` binding - alone do not establish that a particular GPU supports a particular ROCm wheel. - An incomplete scan recommends an exact CPU wheel provisionally when present. -- The desktop asks the manager for available choices and a retained preview - before installation. Dynamic previews show every resolved wheel URL, version, - and SHA-256. Core runtime (`none`) is the default dependency profile. Linux - may offer Pumas' FLUX.2 image dependencies as an explicit advanced profile; - they are not an upstream Torch component. Neither profile implies - qualification for image generation on every release. - The manager retains the exact pip resolution, Python distribution source and - version, uv pin, target, and interpreter fingerprint; installation consumes - that retained identity without resolving again. - Previews expire after 30 minutes and the in-memory store retains at most 32; - expired reports are discarded when read. - Resolver results use a typed outcome across the RPC and desktop boundary: - unsupported, invalid-report, network-inconclusive, and generic-inconclusive - outcomes remain distinct, including timeouts. The closed qualification value - is validated across the generated contract. The install request contract - accepts both `app_id`/`appId` and optional `preview_id`/`previewId` forms. - After a definite unsupported preview, the desktop can search a bounded set of - official Torch indexes for wheel matches across the pinned managed CPython - catalog. These discovery results are independent of host-installed Python. - These leads are explicitly incomplete: dependencies and adapters are unchecked, - and choosing one starts a fresh exact preview. Nunchaku's known wheel is - confined to the fixed 2.9.1 preset. -- Installation stages a hash-locked environment, checks the exact installed - Torch version and build, and runs core Torch/CPU/sidecar probes before - publication. A selected adapter import failure is recorded as partial feature - availability without invalidating an otherwise usable Torch environment. - Installation never selects or defaults the runtime. A failed stage is removed; - an unregistered published directory is quarantined for a safe retry. Cleanup - keeps at most two manager-marked quarantine directories, removes a tag's old - quarantine after successful retry, and logs cleanup errors without blocking - installation. The version manager tracks cleanup tasks and drains them during - RPC shutdown; direct `VersionInstaller` users have an explicit async drain. - The shared completion survives cancellation of a drain waiter. -- The saved probe reports concrete capabilities separately: Torch import, CPU - tensor operation, sidecar app construction and protocol, CUDA operation, - selected image adapter imports, and untested socket startup/image generation. - The saved probe is available through the explicit **Inspect active Torch - runtime** action; that choice clears when the active tag changes or the - version manager opens. Explicit selection and serving perform lightweight identity - checks; model serving is the socket - startup and image execution attempt. Probe evidence is tied to its recorded - environment and hardware context, with staleness diagnostics. -- An explicit startup trial is available after selecting an installed runtime - and an enabled managed TorchServe profile. It checks exact Torch identity, - launches an owned sidecar, attributes its listener, and checks health and - protocol. The trial returns scoped socket/protocol evidence to the desktop - and releases the selection/removal lease after launch admission. Its client - outcomes omit internal error details. The trial does not qualify image - generation or persist an acceptance result. A failed or cancelled trial - stops only its admitted process generation. The - desktop exposes a generation-conditional Stop action after a successful trial. - -## 2026-09-24 release-specific choices follow-up - -The reported `v2.14.0` rejection was caused by applying a global `cu134` build -choice to every release. Official wheel discovery confirmed that `v2.14.0` has -exact CPU and CUDA `cu126`, `cu130`, and `cu132` wheel candidates and no -`cu134` candidate; Python changes cannot make the absent build/release pair -exist. The manager's release-options RPC now scans official channels and -returns exact installed-interpreter matches. It filters choices by detected PCI -display vendor, ranks Python 3.12 then 3.13, 3.11, 3.10 when several exact -matches are available, and uses conservative driver policy for automatic CUDA -recommendation. NVIDIA's published minor-compatibility floors are used for -CUDA 13.x, 12.x, and 11.x; unrecognized families and ROCm are not automatically -recommended. The current execution sandbox detects GPU vendors but cannot -communicate with the NVIDIA driver, so its automatic choice is CPU where an exact -CPU wheel exists. This is not a claim about the driver's availability to the -unsandboxed desktop process. - -At that time the flow selected Pumas' FLUX.2 image dependency profile by -default. The current flow defaults to core Torch (`none`) and makes FLUX.2 an -explicit advanced profile on Linux. Exact package resolution still determines -whether FLUX.2 can be installed for a given Torch release, and a passing -package preview does not prove device use, image generation, or Tuldok -compatibility. The existing real Tuldok evidence remains limited to Torch -2.10 / CUDA 13.0 / Python 3.12 / FLUX.2; no v2.14.0 image result or all-release -inference claim is added by this implementation. - -## Earlier evidence retained from the previous report - -The counts and direct-resolver experiments in this subsection predate the -2026-09-24 upstream manager acceptance and are historical evidence, not the -current-tree verification summary. - -- Deterministic Python resolver/probe fixtures: 20 passed. Ruff checks passed. - The fixtures include wrong Torch and torchvision builds, origin/hash rejection, - missing wheels, network-inconclusive failures, scoped adapter failure, and a - FastAPI route object without a `path` attribute, and bounded probe identity - inputs that exclude the virtual environment's source tree. New fixtures check - bounded official-wheel alternatives without treating them as full resolution. -- Rust `version_manager::` tests: 102 passed, including legacy migration, - cancellation, orphan recovery, selection, and preview process-group cleanup. - Focused owned-launch cancellation and trial retrial tests passed. RPC - install-contract tests: 7 passed. Frontend suite: 693 passed; Electron - suite: 12 passed. Frontend and Electron typechecks/build and lint passed. - Rust format, workspace check, Clippy, and no-default-features check passed - (the latter emitted dead-code warnings for disabled feature paths). - The full Rust gate then failed in 66 existing `pumas-library` - core tests outside this branch's write set (1349 passed); a representative - failed download test passed when rerun alone. The broad gate is not green. - These checks do not substitute for desktop acceptance. -- **Real isolated CPU tuple:** official `torch-2.10.0+cpu` CPython 3.12 wheel - (`manylinux_2_28_x86_64`, SHA-256 - `ee40b8a4b4b2cf0670c6fd4f35a7ef23871af956fecb238fbf5da15a72650b1d`) - resolved with 25 binary wheels from the PyTorch/PyPI indexes. The hash-locked - set installed into an isolated `/tmp` virtual environment. The exact Torch - import, CPU tensor multiplication, in-process Pumas sidecar health/protocol - probe, and a real sidecar socket `/health` request passed (`protocol: 3`). - The probe result was `core_status: passed`, `adapter_status: not selected`. - This was a direct isolated resolver/environment exercise, not a managed - desktop installation or image inference run. -- **Additional real resolver checks:** official `torch-2.9.0+cpu` CPython 3.12 - Linux x86_64 resolved with 25 wheels; the Torch wheel SHA-256 was - `28f6eb31b08180a5c5e98d5bc14eef6909c9f5a1dbff9632c3e02a8773449349`. - It was not installed. For `v2.10.0` with an unavailable selected `cu118` build, - bounded official-index discovery returned three `cu126` Torch wheel leads - matching installed CPython 3.12, 3.10, and 3.11. Those leads were not full - dependency resolutions or install trials. -- The host has an NVIDIA GeForce RTX 5090 Laptop GPU with 24,463 MiB and driver - 595.84. The default execution sandbox has no `/dev/nvidia*` device nodes, so - `nvidia-smi` fails there; a read-only unsandboxed query confirms the host GPU - is available. The existing Pumas `2.9.1+cu130` environment reports CUDA 13.0, - detects the RTX 5090, and completed a CUDA tensor multiplication outside the - sandbox. This check is evidence only for that existing runtime. The default - sandbox also cannot resolve the wheel host, although elevated network access - resolved the real CPU tuple. -- **Real upstream CUDA and image tuple:** the current Pumas RPC binary installed - `v2.10.0+cu130` with Python 3.12 and the FLUX.2 adapter in an isolated root, - selected it explicitly, passed a managed sidecar startup trial, loaded the - real FLUX.2 Klein 9B KV FP8 checkpoint, and served a 1280×720 PNG to the - actual Tuldok browser. Display, save, automatic temporary collection import, - model unload, generation-specific stop, and restart/retrial passed. See the - [exact environment and image evidence](upstream-v210-cu130-flux2-e2e.md). - Pumas controls were exercised through RPC, so this does not complete the - required Pumas desktop UI acceptance. - -## Open implementation gaps - -- Build choices are candidate official indexes, not a precomputed compatibility - matrix. Wheel alternatives are discovered after an unsupported preview, but - they remain leads until the selected combination passes full retained preview. -- The fixed 2.9.1 preset preview highlights three direct wheels; its full - embedded hash lock is available in the preview report and is checked during - installation. It does not expose one exact transitive wheel URL per package - before installation. -- The saved deep probe is scoped to installation; there is no on-demand deep - re-probe. The standalone startup trial checks socket health and protocol but - does not execute a model. Read-only freshness checks compare the resolved lock, - shipped sidecar Python files, interpreter binary, full installed distribution - set, GPU identity, and available driver metadata. A changed context marks - the saved result stale but does not rerun the expensive model operation. - -## Runtime-manager acceptance status - -The superseding [Torch upstream version management plan](../../torch-upstream-version-management/plan.md) -is the current PR acceptance gate for the authorized runtime-management scope. -Its U4 criterion permits a real older-release RPC lifecycle plus the composed -desktop control test, matching the user's approved “desktop or API” scope. The -actual desktop-driven FLUX.2/Tuldok repeat below remains a separate desktop -product claim; it is not required to prove the RPC installation path. - -U1–U4 were accepted for the earlier Linux x86_64 flow using a host-installed -CPython interpreter. Managed-Python provisioning supersedes that setup, so this -record is historical evidence and does not satisfy the current clean-host -acceptance gate. On Linux x86_64, the Pumas RPC flow discovered 63 stable tags, -previewed `v2.9.0` / CPU / CPython 3.12 as -25 exact wheel artifacts with URLs and SHA-256 hashes, installed it from the -retained resolution, inspected a passing core probe, and explicitly selected it. -A managed Torch profile then passed startup, health, and protocol 3 checks as -owned generation `1`; the generation-conditional stop succeeded. The host -interpreter was `/usr/bin/python3.12` on x86_64 Linux with glibc 2.39. The Torch -wheel was `2.9.0+cpu` with SHA-256 -`28f6eb31b08180a5c5e98d5bc14eef6909c9f5a1dbff9632c3e02a8773449349`. -The adapter was `none`; no image generation was attempted. The probe result was -passed, non-stale, with core status passed and adapter status not selected. - -The historical RPC lifecycle summary and complete 25-artifact manifest are -retained in the [acceptance evidence JSON](../../torch-upstream-version-management/reports/v2.9.0-cpu-rpc-acceptance.json). -The original isolated launcher root and temporary acceptance file were under -`/tmp/pumas-torch-upstream-e2e-20260924-accepted`. This closes PRG-I17's runtime -management acceptance for the earlier Linux/Python scope. It does not claim -clean-host managed-Python provisioning or a real interactive Pumas desktop run. - -## Historical pre-U6 branch gates - -These counts describe the earlier PR branch before the release-specific U6 -changes below. They remain useful as the prior baseline, not as the current-tree -verification result. - -- Python resolver: 18 tests passed, including Rust/Python ordered build-vocabulary - parity; Ruff passed. The `pumas-app-manager` library suite passed 136 tests, - including shutdown admission, manager/direct-installer drain, and cancelled- - waiter retry coverage. - The focused `pumas-library` configuration test passed. The focused GitHub - module: 17 passed, including pagination limits, failure/no-partial-list, - cache completeness, request coalescing, cancellation takeover, and stale - completed-channel replacement. Rust format and `git diff --check` passed. -- `pumas-rpc` passed 253 unit tests, 17 integration tests, and 2 intent - integration tests (12 tests are ignored); the install-alias export test passed - with `export-contract`. Frontend passed 125 test files / 699 tests, typecheck, - and lint. Electron passed all 12 test files, including install alias coverage; - its generated contract check, 41-test contract-conformance suite, and build - passed. - The desktop composed projection test covers discovery failure, preview, - install, explicit selection, startup health, and generation-owned stop. -- The original PR #3 GitHub Build run at `3688c0c` failed four gates: workspace - Clippy type complexity, a desktop projection timing race, Ruff formatting, and - a headless observer test ordering race. The current tree fixes each cause. The - desktop now waits for the selected release to render; the observer test cancels - only after the held read starts; Ruff formatting and the installer alias are - corrected. -- Python source QA now passes Ruff check/format and all 77 tests in - `unittest discover -s torch-server/tests`. The executor-sensitive lifecycle - fixtures use test-owned pools (and an event-loop poll for the model-load fixture) - while retaining real worker execution and the lease/cancellation assertions. - Frontend passes 125 test files / 699 tests, typecheck, and lint. -- `cargo fmt`, workspace `cargo check`, and workspace Clippy pass. The - `pumas-library --no-default-features` and `pumas-rpc --no-default-features` - package test gates also pass. The full default-feature workspace test phase is - not locally qualified: this sandbox run recorded 1,361 passed, 66 failed, and - 6 ignored. Representative failures are loopback binds returning `EPERM` and - SQLite writes rejected as read-only, so this environment cannot establish the - status of those existing core tests. GitHub Build run 274 for commit `9b76db7` - completed successfully on 2026-09-24; all five executed jobs passed, including - the default-feature Rust quality and no-inference headless gates. - -## 2026-09-24 U6 release-specific gates - -- The live official-index command - `python3.12 -I torch-server/resolve_runtime.py --release-options --version 2.14.0 --interpreter python3.10 --interpreter python3.11 --interpreter python3.12` - completed with - `completeScan=true` for installed CPython 3.10, 3.11, and 3.12. Exact - candidates were CPU, `cu126`, `cu130`, `cu132`, `rocm7.2`, and `rocm7.14` - for each interpreter; there was no `cu134` candidate. The manager filters - those raw upstream results against detected display vendors, so an - NVIDIA-plus-Intel host retains CPU/CUDA and does not offer ROCm. CUDA - auto-recommendation also requires a complete scan and a recognized NVIDIA - driver floor. This sandbox cannot query the NVIDIA driver, so it does not - establish which CUDA channel the unsandboxed desktop will recommend. -- Full Python suite: 84 tests passed; `ruff check torch-server` and - `ruff format --check torch-server` passed. `pumas-app-manager`: all 149 tests - passed, including the 14 release-options, driver-floor, incomplete-scan, and - legacy-alternatives filtering tests. `pumas-rpc`: 256 unit tests, 17 - integration tests, and 2 intent integration tests passed; 10 integration and - 2 live-network intent tests were ignored. Rust formatting and manager Clippy - with warnings denied passed. -- Frontend: all 126 test files and 708 tests passed; typecheck and lint passed. - The focused preview tests cover automatic recommendation, exact-release - advanced choices, a null recommendation, Pumas-owned FLUX.2 labeling, and - rejection of CPU-host CUDA/ROCm or mismatched alternatives. Electron's - generated desktop contract check passed. The independent Sol xhigh review - found no issue in the repaired host/release filtering or retained-preview - boundary; the Astra high final review found no remaining implementation - finding and requested this historical/current inventory split. -- The live scan confirms wheel availability only. A direct full resolver attempt - for `v2.14.0` / `cu132` / FLUX.2 ran for several minutes without returning a - result and was interrupted; this establishes neither success nor a dependency - incompatibility. A completed retained dependency preview, install, managed - startup, and Tuldok image generation have not been established here. The - existing actual image result remains limited to Torch 2.10 / CUDA 13.0 / - Python 3.12 / FLUX.2. - -## Separate desktop and image-serving claim - -1. The real FLUX.2 GPU/Tuldok result is exercised through RPC and remains scoped - to the exact `v2.10.0` / CUDA 13.0 / Python 3.12 / FLUX.2 tuple in the linked - report. It does not prove the same actions through the actual Pumas desktop. -2. A real desktop-driven repeat of preview, install, selection, startup trial, - and model load would close that separate desktop claim. It is not required by - the upstream runtime-manager U4 gate, which was accepted through RPC plus the - composed desktop projection test. -3. General user-defined PyTorch model plugins, all-release image generation, and - image-adapter qualification remain out of scope. - -The first serving scope is the existing Nunchaku Z-Image and FLUX.2 Klein image -models. A general user-defined PyTorch model plugin contract is a separate -decision. Merge or source presence alone does not establish Tuldok inference. - -## Managed CPython provider follow-up — 2026-09-25 - -Torch 2.14.0 CPU/Core passed the native Linux RPC install and managed sidecar -lifecycle using Pumas-provisioned CPython 3.14.7. A fresh RPC process reopened -the same data root and reverified the exact Python identity and active profile, -a fresh CPU tensor operation through the persisted managed venv, the retained -RPC probe report, the sidecar trial/stop, and graceful shutdown; see the -[restart acceptance evidence](../../torch-cross-platform-runtime-management/reports/v2.14.0-linux-cpu-rpc-restart-acceptance/README.md). -The acceptance script's cold-start release-options wait now covers managed -CPython provisioning as well as the subsequent wheel scan. -This does not expand the -existing Tuldok/image qualification beyond its recorded Torch 2.10 tuple. -The uv 0.12.18 MIT/Apache notices are included in release attribution. The -Linux, Windows, and macOS CPython 3.14.7 full-archive license collections are -retained in the -[cross-platform runtime plan](../../torch-cross-platform-runtime-management/reports/managed-python-license-collection/README.md). -The Windows archive has native selection evidence from -[run 36214227835](https://github.com/MrScripty/Pumas-Library/actions/runs/36214227835) -on commit `a0658131`: that install selected CPython 3.14.7, and its full-archive -SHA-256 matches the retained Windows full-archive manifest. The current -Windows and macOS installs also selected CPython 3.14.7; their install-artifact -identities and separate full-archive license manifests are retained in their -acceptance reports below. Windows/macOS selected-provider notices still need -release-attribution integration. Native RPC installation now passes on all -three targets; packaged desktop Torch installation remains unproven. Local v0.7.0 -Linux AppImage and deb packages were rebuilt -with the updated uv notices and passed extracted-resource and bundled RPC -`/health` smoke checks; this did not update the public toolbar-linked release. - -## 2026-09-25 — Exact Torch wheel and cross-platform preflight follow-up - -Manual native run -[36223106097](https://github.com/MrScripty/Pumas-Library/actions/runs/36223106097) -on `07f7e9f6` passed v2.14.0 CPU/Core resolution, install, fresh CPU operation, -retained-probe revalidation, second-session identity check, and sidecar -trial/stop on Linux x86_64, Windows x64, and macOS arm64. Each platform retained -25 hashed artifacts and passed graceful shutdown using managed CPython 3.14.7. -The [Linux](../../torch-cross-platform-runtime-management/reports/v2.14.0-linux-cpu-rpc-restart-acceptance/README.md), -[Windows](../../torch-cross-platform-runtime-management/reports/v2.14.0-windows-cpu-rpc-restart-acceptance/README.md), -and [macOS](../../torch-cross-platform-runtime-management/reports/v2.14.0-macos-cpu-rpc-restart-acceptance/README.md) -reports retain the exact wheel/dependency artifacts and managed runtime identity. -The macOS release preflight honored a 913-second Retry-After and found the -requested tag on its second attempt within the 1800-second total budget. - -PR run -[36223095054](https://github.com/MrScripty/Pumas-Library/actions/runs/36223095054) -passed all required PR checks, including native QA; RPC E2E is skipped on PR -events. Provider notice integration, packaged desktop Torch installation, -CUDA/MPS execution, and v2.14.0 Tuldok/image generation remain open. The -separate v2.10 image qualification is unchanged. - -## 2026-09-25 — Torch metadata and lifecycle review repairs - -The current PR branch now serializes Torch metadata reads and writes across -independent manager processes with a permanent `.torch-versions.lock`. The -guard covers install/removal, explicit and default selection, validation, and -startup cleanup/normalization. A snapshot uses one metadata generation; when a -writer owns the lock, readers return the last coherent cached generation, and -startup avoids reading a transitional active-version marker. Blocking workers -retain their lock lease until writes finish even if their async caller is -canceled. Read-only Astra high and Sol xhigh reviews found no remaining -blocking issue in these concurrency, cache, startup, or Windows lock-error -paths. A failed metadata write followed by a failed active-marker rollback is -still a best-effort error case. - -Local verification on this branch passed 200 `pumas-app-manager` tests and the -Rust default-member suite, all-target/all-feature Clippy with warnings denied, -Rust formatting, Windows GNU app-manager test compilation, 713 frontend tests, -48 desktop-contract tests, 179 Electron tests (one platform-dependent skip), -53 managed-Python acceptance fixtures, Ruff, Python compilation, and -release-attribution validation. PR run -[36223095054](https://github.com/MrScripty/Pumas-Library/actions/runs/36223095054) -passed all required PR checks; RPC E2E is skipped on PR events. Manual run -[36223106097](https://github.com/MrScripty/Pumas-Library/actions/runs/36223106097) -passed current-revision CPU/Core RPC install/restart on all three targets. -Packaged desktop Torch installation, provider-license integration, CUDA/MPS -execution, and v2.14.0 Tuldok/image generation remain unverified. X1–X7 retain -their partial/pending states until their full evidence gates pass, and the local -Linux packages have not updated the public toolbar-linked release. - -## 2026-09-26 — Torch metadata lock contention follow-up - -A PR review identified a user-visible race: status snapshots briefly hold the -exclusive `.torch-versions.lock`, so a selection, removal, or installation -could fail immediately with `WouldBlock` during normal UI polling. Mutations -that acquire this shared lock now retry only `WouldBlock`, asynchronously, every -20 ms for at most 500 ms. A longer-lived owner still causes a bounded failure; -other I/O errors return immediately. The change covers install, active/default -selection, and removal. Read snapshots remain nonblocking, and startup -normalization defers only expected lock contention. Existing stage and detached -worker lock leases are unchanged. - -Regression coverage exercises short lock handoff, the 500 ms bound, propagation -of non-contention errors, startup error classification, and manager mutation -call sites. The current local `pumas-app-manager` library suite passes 205 tests; -workspace check and Clippy, Rust formatting, 44 Torch resolver tests, Ruff, and -`git diff --check` pass. The full local workspace test could not complete cleanly -in this environment: 1432 `pumas-library` unit tests pass with four test threads, -but the `intent_api_tests` fail while creating their local API TempDirs with -`PermissionDenied`/temporary-storage errors. Astra high and Sol xhigh read-only -reviews found no lock-lifecycle blockers. The initial three-platform native RPC evidence -above predates this lock follow-up. Subsequent native run -[36229508586](https://github.com/MrScripty/Pumas-Library/actions/runs/36229508586) -passed all three native legs on `21041697`, as recorded in the platform -`v2.14.0-*-current-source-cpu-rpc-restart-acceptance` reports. Those report names -refer to the source tested then, not later PR candidates. PR run 36225003150 -passed on `66ccbfe7` before the follow-up; each resulting PR candidate needs -its own applicable checks. - -The Torch QA job now disables checkout credential persistence. Security review -confirmed the job has `contents: read` and that PR caches use the PR merge-ref -scope; no cache-mode change was needed ([GitHub cache scope](https://docs.github.com/en/actions/reference/workflows-and-actions/dependency-caching)). - -## 2026-09-26 — CPython release attribution and desktop RPC diagnosis - -The release attribution generator now includes target-scoped CPython full- -archive license supersets for Linux x86_64 GNU, Windows x86_64 MSVC, and macOS -arm64. It derives the target set from `artifact-plan.json`, links each native -restart runtime report to its separate Python Build Standalone full-archive -manifest, preserves the selected install-only URL and uv identity separately, -and records the raw 19-file license set and `PYTHON.json` for each platform. -The generated inventory contains 371 package entries and 78 hashed inputs; -all 57 legal files are covered by the source manifests. Windows CRLF text is -preserved in the generated UTF-8 notice. Generation and packaging checks bind -each target to its exact Rust uv enum arm, pinned archive hash, and reviewed -Python Build Standalone release/flavor; they reject incomplete or duplicate -legal-file lists and malformed archive hashes. Attribution integrity, release -tests, Ruff, the Electron packaging hook, and the focused Electron RPC allowlist -regression pass. The broad local Electron suite hits `EPERM` when one test -binds its loopback HTTP server inside this sandbox; the same failure does not -affect the focused RPC or packaging tests. - -The reported `Unknown API method: get_torch_release_options` is confirmed to -come from Electron's `api:call` allowlist before Rust dispatch. The public -`v0.7.0` tag lacks that method in `electron/src/rpc-method-registry.ts`; the -current branch contains it and the regression test passes. The toolbar-linked -public release is still v0.7.0, so it has not received the branch's updated -bridge. The latest current-branch local Linux AppImage/deb candidates include -the updated bridge and generated CPython notices, pass extracted-resource hash -checks, and start their packaged backends through `/health`. Their SHA-256 -values are -`a28f302822ce99a9d687797606574c93a5afb9c184f293526b16b972294a670b` (AppImage) -and `d8effc33ba37466171c5fae0178e2555064850e40544c93249966fedbf4bce88` (deb). -The packaged Linux RPC backend passed Torch 2.14.0 CPU/Core install and restart -using managed CPython 3.14.7 and 25 hashed official artifacts; see the -[packaged backend acceptance](../../torch-cross-platform-runtime-management/reports/v2.14.0-linux-packaged-cpu-acceptance/README.md). -The latest AppImage also passed the real UI install flow for Torch v2.14.0 -cu132: at the first sampled install state, the header named the current phase, -the dialog showed Cancel, setup bars were indeterminate with no `aria-valuenow`, -and the runtime reached Ready. The exact report records the 44-artifact review, -managed CPython 3.14.7, CPU tensor result 5, and the warm-cache limit: -[packaged UI acceptance](../../torch-cross-platform-runtime-management/reports/v2.14.0-linux-appimage-cu132-ui-acceptance/README.md). -These are local candidates and have not been uploaded to the toolbar-linked -release. Packaged Windows/macOS installation, provider cancellation/tamper/retry, -CUDA/MPS execution, and v2.14.0 Tuldok image generation remain open. diff --git a/docs/plans/torch-image-provider-contract/execution-ledger.md b/docs/plans/torch-image-provider-contract/execution-ledger.md deleted file mode 100644 index bc52ffbb0..000000000 --- a/docs/plans/torch-image-provider-contract/execution-ledger.md +++ /dev/null @@ -1,533 +0,0 @@ -# Execution Ledger: Torch Image Provider Contract Correction - -**Plan:** [plan.md](plan.md) - -## 2026-09-20 — Reconcile planning authority - -- Operation: planning reconciliation only; production implementation was not - admitted or performed. -- Reviewed Pumas `74d4f7f0a5345e2dba476313d9cb409f4fceeb61`, adopted - Coding-Standards `366c1d90a24bbfb50973f62b155a5f3396c0f107`, and Tuldok - `6e9e6ec32d4dd719af0e051baafacecd190864c2`. -- Reconciled the user-added standalone draft into the canonical focused plan. - Chose separate ownership because the active Tuldok image plan is at broader - distribution acceptance and this correction has an independent bounded write - set and acceptance gate. -- Inspected the operative 600-second sidecar and Rust-client deadlines, the - inoperative image branch of the documented 615-second gateway policy, current - protocol-2 handshake/recipe, permissive Rust result decoding, strict public - request and safe projection, serving/listing compatibility checks, immutable - installer/qualifier, installed recipe inventory, and current release inventory. -- Inspected Tuldok's current numeric width/height request, 1280×720 defaults, - image display/save, request-abort cleanup, explicit-resume/no-automatic-retry - behavior, and remaining 630-second consumer deadline. These findings narrow - its companion work; they do not overwrite historical evidence. -- Selected protocol `3` and reserved `torch-runtime-0.1.6`, both subject to a - collision recheck before implementation/construction. Initially recorded an - image-only deadline precedence; the clarification below supersedes that scope. -- Assigned every TIPC acceptance claim one evidence owner. TIPC-M1 owns the - coherent provider correction; the existing Tuldok image plan owns exact- - candidate, GPU cleanup, and 1280×720 user-workflow evidence. -- Preserved unrelated local `docs/breif/future.md`. No code, tests, runtime, - lock, installation, activation, publication, commit, or external mutation was - performed. -- Validation: all relative Markdown links in the changed plan artifacts resolve; - `git diff --check` passes; the then-current TIPC acceptance claims each have - one table-row evidence owner; the superseded draft path is absent; repository - status shows only plan documentation changes plus the preserved unrelated file. - -## 2026-09-20 — Make lifetime generation-wide - -- User clarification: an admitted generation never fails merely because it has - run for a long time. The image lifetime is the reusable policy for text and - future generation, not a narrow exception. -- Source inspection found a shared gateway-client total timeout and 120-second - per-request deadlines on `/v1/chat/completions` and `/v1/completions`, in - addition to the already-recorded image limits. -- Replaced `TIPC-EX-01` with generation-wide `TIPC-GEN-01`; added TIPC-12 and - assigned this plan the single reusable generation transport/lifecycle seam. - Text shapes, sampling, usage, and other broader remediation remain with their - existing owner. -- Coding-Standards was not modified because this repository task remains limited - to Pumas planning; the explicit Pumas generation contract takes precedence - over the generic remote-operation deadline requirement for generation. -- No production implementation or runtime mutation was performed. -- Validation: TIPC-01 through TIPC-12 each have one evidence owner, reciprocal - plan references agree, and no prospective Pumas plan assigns an elapsed - deadline to generation. - -## 2026-09-20 — Tighten proof and handoff boundaries after review - -- Reviewed committed reconciliation `c93a648c6b96785ab82dd63c47452002b784d23b` - and current source; unrelated untracked `docs/breif/future.md` remains untouched. -- Kept the generation-wide policy and separated its Pumas transport proof from - provider-native cleanup. Current chat/completions registration is Ollama and - llama.cpp through one generic buffered handler; Torch remains image-only at - the public registry. One controlled transport case may cover the shared - implementation only when route tests prove every registered path uses it. -- TIPC-12 no longer claims Ollama/llama.cpp worker cleanup. Their serving owners - retain that obligation; Torch image cleanup remains TIPC-03/04; unregistered - synchronous Torch text remains with broader Torch remediation. -- Restored acceptance kind, environment, and mode; marked TIPC-M1 `Planned` and - composed-design applicability `applicable`; added independence reasoning and - supporting Rust, Ruff, Python unit, and native gates. -- Explicitly admitted `torch-server/tests_native/test_image_failures.py` and - directed its obsolete deadline trigger to become cancellation/disconnect - cleanup evidence, separate from the controlled-clock lifetime regression. -- The diffusion plan now preserves original M3 as completed within its recorded - scope, marks `M3-TIPC` planned, and returns each TIPC handoff as soon as its - own evidence passes rather than waiting for M5 or publication-dependent A1. -- Planning documentation only; no production source, tests, runtime, or release - state changed. - -## 2026-09-20 — Admit TIPC-M1 and prepare parallel Passeur allocation - -- Canonical admission: `docs/plans/torch-image-provider-contract/plan.md`, - operation `start`, milestone `TIPC-M1`. The plan and milestone moved from - `Planned` to `Active`; acceptance remains pending. -- Integration owner: local branch - `refs/heads/integration/torch-image-provider-contract`, created from exact - Pumas base `74214cc9ed755356ead124cd72fb04f0eb84fda4`. -- Shared contract supplied to both initial Pumas assignments: Torch protocol - `3`; strict closed numeric requests; required canonical result fields with - unknown additive private result fields allowed inside the whole-payload - bound; no elapsed, total, read, or idle generation deadline; disconnect is a - cancellation request rather than proof of stopped work; resources remain - owned through sufficient cleanup; transport loss is uncertain and never - authorizes automatic replay. Non-generation budgets remain independently - owned. -- Planned assignment `TIPC-M1-R` (Pumas): Rust generation transport, - TorchClient handshake/result/error interpretation, serving/listing/admission, - installer consistency, focused Rust tests, and public/generation contract - documentation. Primary write set: - `rust/crates/pumas-app-manager/src/torch_client.rs`, - `rust/crates/pumas-app-manager/src/version_manager/installer/{torch.rs,torch_tests.rs}`, - `rust/crates/pumas-rpc/src/handlers/{serving_torch.rs,openai_gateway.rs,openai_gateway_images.rs,openai_gateway_tests.rs}`, - `rust/crates/pumas-rpc/src/server.rs`, `docs/ARCHITECTURE.md`, - `docs/contracts/{generation-lifetime.md,image-generation.md}`, and - `docs/adr/0002-torch-image-provider-protocol.md`. Read-only context includes - the canonical plan, private protocol, sidecar sources, repository guidance, - and routed standards. It must not edit the plan directory, Torch sidecar, - dependency locks, runtime defaults, Tuldok, or unrelated provider semantics. - Deliverable: ordinary committed Muse contribution with focused app-manager - and RPC evidence for TIPC-01/02/05–08/11/12 within the Rust/public boundary. -- Planned assignment `TIPC-M1-P` (Pumas): Python sidecar lifetime, - cancellation/cleanup custody, protocol-3 advertisement, bundled recipe/live - qualification, controlled-clock and native cleanup regressions, private - protocol and sidecar documentation. Primary write set: - `torch-server/{image_api.py,serve.py,validate_runtime.py,README.md,runtime/runtime.json,tests/**,tests_native/test_image_failures.py}` - and `docs/contracts/torch-provider-protocol.md`. Read-only context includes - the canonical plan and Rust client/gateway owners. It must not edit the plan - directory, requirements lock, Rust source, public runtime defaults, Tuldok, - or production installations. Deliverable: ordinary committed Muse - contribution with Ruff, Python unit, controlled lifetime, and available - native cleanup evidence for the sidecar portions of TIPC-01/03/05–07/11. -- `TIPC-M1-R` and `TIPC-M1-P` are independent after the recorded protocol - agreement and are intended for one Pumas batch at exact implementation base - `96f859443460ad8e4799d563528aaba113ccff21`, targeting - `refs/heads/integration/torch-image-provider-contract`. Serial integration - order is R then P unless returned commit assumptions require a repair - assignment. Shared plan lifecycle, ledger, issues, final contract - reconciliation, candidate construction, GPU allocation, and qualification - roots remain coordinator-owned and serialized. -- Planned companion assignment `M3-TIPC-T` (Tuldok): governing Pumas plan - `docs/plans/torch-diffusion-serving/plan.md`, operation `continue`, milestone - `M3-TIPC`; exact Tuldok base - `6e9e6ec32d4dd719af0e051baafacecd190864c2`; target - `refs/heads/integration/torch-image-provider-contract`. Write set is `image_generation.py`, - `tests/test_image_generation.py`, `tests/browser_images_real.cjs`, and - relevant Tuldok user documentation. Preserve numeric dimensions, 1280×720, - socket/watcher cancellation, and no replay; remove the 630-second generation - deadline and closed metadata examples. Exact-candidate browser/GPU evidence - waits for integrated Pumas source and exclusive qualification ownership. -- Planned secondary assignment `FE-GET-APP-STATUS` (Pumas): governing - `docs/plans/current-standards-remediation-2026-09-03/frontend-and-ui/plan.md`, - operation `continue`, only the admitted `get_app_status` producer/generated - response, actual preload, and `usePlugins` consumer correction. Its exact - generated/shared write set must be inventoried before delegation; it is not a - Torch prerequisite and will not overlap initial product workers. -- Passeur intake: installed Passeur revision - `b0c162d779f52b1c7bb19274013d56d634020513` and Muse Code/SDK `1.3.0`; profile - defaults are two active workers and eight queued. The only discovered profile - belongs to the Passeur repository itself. No Pumas or Tuldok project profile - exists, and this Codex session exposes none of `delegate_to_muse`, - `delegate_to_muse_batch`, `muse_result`, or `muse_finalize`. No worker was - dispatched. Separate project registrations and a Codex restart are required; - the missing Tuldok server does not broaden or block independent Pumas scope, - while the missing Pumas implementation server prevents source execution. -- Because Passeur rejects any dirty configured source checkout and the primary - Pumas checkout intentionally retains unrelated untracked - `docs/breif/future.md`, the coordinator created the clean, repository-linked - source worktree `/media/jeremy/OrangeCream/passeur_cache/pumas-coordinator-source` - on `refs/heads/passeur/pumas-coordinator` at the admitted implementation base. - It belongs to this orchestration only, is not an integration target, and must - remain clean and retained until Passeur resources are finalized; afterward - its exact head must remain reachable before ordinary safe worktree/branch - retirement. No existing `.muse` or other-owner worktree was changed. -- Preserved unrelated untracked `docs/breif/future.md`. No product/test source, - runtime installation, candidate, GPU process, launcher root, publication, or - remote state changed. -- After completing all independent intake and allocation work available in the - current session, set the plan and `TIPC-M1` to `Blocked`: creating verified - project profiles requires the user's subscription confirmation, named Codex - MCP registration changes require configuration authority, and newly - registered tools cannot appear until Codex restarts. The blocker does not - authorize direct implementation or another delegation mechanism. - -## 2026-09-20 — Configure project-scoped Passeur servers - -- User confirmed `muse-spark-1.3-contributor` is the intended model and uses the - intended subscription, and authorized Pumas/Tuldok profiles plus named Codex - registrations. -- Configured Pumas profile - `/home/jeremy/.config/muse-bridge/projects/57bbd005b8a2f399ae95fd99.json` - for clean coordinator source - `/media/jeremy/OrangeCream/passeur_cache/pumas-coordinator-source` and task - root `/media/jeremy/OrangeCream/passeur_cache/pumas-tasks`. -- Configured Tuldok profile - `/home/jeremy/.config/muse-bridge/projects/00ba9d9685e64d372f3403fe.json` - for the canonical Tuldok checkout and task root - `/media/jeremy/OrangeCream/passeur_cache/tuldok-tasks`. -- Both profiles enable implementation, use Muse Code/SDK `1.3.0`, retain the - documented two-worker/eight-queue limits and 30-minute task budget, and carry - current `user_confirmed` subscription provenance. Doctor maps them to Pumas - Git common-directory identity `6aaae9e5ae2b753918ac7478` and Tuldok identity - `6240622ff4d89463e085c67b`, respectively. -- Added distinct Codex servers `passeur_pumas` and `passeur_tuldok`. Both enable - exactly `delegate_to_muse`, `delegate_to_muse_batch`, `muse_result`, and - `muse_finalize`, with 10-second startup and 2100-second tool timeouts. Existing - MCP registrations and the Passeur repository's own profile were preserved; - the pre-field-update Codex configuration is backed up at - `/home/jeremy/.codex/config.toml.passeur-multi-backup-20260920`. -- `codex mcp get` and both Doctor runs passed. Doctor is non-inference evidence: - it does not prove provider parallelism, elicitation, sandbox enforcement, - hooks, signing, or a live Muse turn. The current Codex process still exposes - none of the newly registered tools, so the plan remains `Blocked` pending the - documented restart rather than attempting direct implementation. - -## 2026-09-20 — Post-restart MCP attachment diagnostic - -- The user reported restarting the session and authorized `continue`. -- The active conversation runtime still exposes neither `passeur_pumas` nor - `passeur_tuldok`; its complete callable-tool inventory contains none of the - four Passeur operations. -- A read-only MCP SDK diagnostic started the configured Pumas server, advertised - elicitation capability, listed tools, and closed it without invoking a task. - The server successfully returned the installed schema-version-2 definitions - for `delegate_to_muse`, `delegate_to_muse_batch`, `muse_result`, and - `muse_finalize`. This proves server startup and tool registration only; it - does not prove a live Muse turn, subscription execution, approval routing, or - parallelism. -- Therefore the remaining blocker is Codex conversation attachment, not the - Passeur profile, MCP server, repository route, or schema. Direct Muse shell - execution or a custom client that accepts approval prompts would bypass the - required human elicitation path and remains prohibited. The plan stays - `Blocked` until a newly created Codex conversation exposes both registered - namespaces. - -## 2026-09-20 — Live delegation reveals Passeur/Muse identity incompatibility - -- The new conversation exposes both `passeur_pumas` and `passeur_tuldok`, each - with the expected four schema-version-2 operations. The prior attachment - blocker is therefore resolved. -- Rechecked the recorded bases and allocations before dispatch. Pumas - coordinator source remains clean at - `96f859443460ad8e4799d563528aaba113ccff21`; Tuldok remains clean at - `6e9e6ec32d4dd719af0e051baafacecd190864c2`; protocol `3` and - `torch-runtime-0.1.6` have no new source allocation. The primary Pumas checkout - still contains only the preserved unrelated `docs/breif/future.md`. -- Dispatched Pumas batch keys `TIPC-M1-R` and `TIPC-M1-P`. Both stopped before a - Muse session with `SS1.4.1`: Passeur supplied `clientInfo.name` as - `muse-bridge`, while Muse 1.3 requires `^[a-z0-9_]+$`. Dispatched Tuldok key - `M3-TIPC-T`; it stopped before worker start because its `context_files` - incorrectly named the cross-repository Pumas plan. All three allocations had - zero commits and zero changed files and were explicitly archived/retired. -- Applied the diagnosing-bugs loop to the tooling boundary. A direct handshake - reproduced the exact error with `muse-bridge` and passed with `muse_bridge`. - Local Passeur commit `4f4ef0f` now uses `muse_bridge` in the adapter and - `muse_bridge_probe` in the probe, with a focused adapter regression. The - ignored `dist/` runtime was rebuilt. The full Passeur suite passed (53 core - tests and 35 Vitest tests), TypeScript check passed, build passed, and - `git diff --check` passed. The pre-existing unrelated - `passeur-parallel-workers-changes.zip` remains untouched. -- Retried with fresh Pumas keys `TIPC-M1-R-v2`/`TIPC-M1-P-v2` and Tuldok key - `M3-TIPC-T-v2`, limiting Tuldok `context_files` to files present in that - repository. The already-attached MCP server processes retained the old - Passeur module and reproduced the same initialization failure. These three - allocations also had zero commits and zero changed files and were explicitly - archived/retired. -- No custom MCP client was used to delegate, no approval path was bypassed, and - no product source, test, runtime installation, candidate, GPU process, - launcher root, publication, or remote state changed. `TIPC-M1` remains - `Blocked` until Codex restarts the two attached MCP processes and the recorded - assignments are retried against the rebuilt Passeur runtime. - -## 2026-09-20 — Corrected runtime passes; resumed thread omits namespaces - -- The user reported restarting and authorized continuation. Pumas remains at - plan commit `63863942`, its clean coordinator source remains at - `96f859443460ad8e4799d563528aaba113ccff21`, and Tuldok remains clean at - `6e9e6ec32d4dd719af0e051baafacecd190864c2`. The unrelated untracked Pumas - `docs/breif/future.md` and Passeur - `passeur-parallel-workers-changes.zip` remain untouched. -- Both named registrations remain enabled with the expected commands, profiles, - tool allowlists, startup timeout, and task timeout. Passeur remains at local - compatibility commit `4f4ef0f`, and its ignored built adapter contains the - corrected `muse_bridge` identity. -- This resumed conversation exposes neither Passeur namespace in its callable - tool inventory. A forced sandboxed resource/startup probe closed during MCP - initialization; a minimal sandboxed reproduction reported Passeur's generic - repository-in-use error while attempting to acquire its external state lease. -- Host-visible process inspection found no Passeur or Muse process, and state - inspection found no surviving repository lock. A read-only MCP SDK handshake - against the exact configured Pumas command with normal state access - initialized successfully and listed `delegate_to_muse`, - `delegate_to_muse_batch`, `muse_result`, and `muse_finalize`. -- Official Codex documentation confirms that configured stdio MCP servers and - their enabled-tool allowlists are loaded through Codex configuration; it does - not provide a supported mechanism for injecting a missing namespace into an - already-running conversation. A custom client remains prohibited because it - would bypass Passeur's human approval elicitation. -- No task was dispatched, no task resource or lease remains live, and no product - source or Tuldok state changed. `TIPC-M1` remains `Blocked` until a newly - created conversation explicitly naming both configured servers exposes their - callable tools. - -## 2026-09-20 — Named servers run, but their operations remain unexposed - -- The user created another conversation and explicitly requested the configured - `passeur_pumas` and `passeur_tuldok` servers. The complete callable-tool - inventory still omits both namespaces and all eight task operations. -- `codex mcp get` resolves both enabled stdio registrations with the recorded - project/profile arguments, four-tool allowlists, 10-second startup timeout, - and 2100-second tool timeout. Both project Doctors pass; they remain - non-inference diagnostics. -- Host-visible process inspection found one live exact-command Passeur process - for Pumas and one for Tuldok, both parented by the Codex host. Passeur - inspection shows only the four previously archived, retired, zero-change - Pumas attempts. No Muse worker or product task is live. -- Built a sub-second deterministic feedback loop with a bounded read-only MCP - SDK initialization against the exact registered Pumas command. In the managed - sandbox it closes with MCP `-32000` and empty stderr. Outside that sandbox the - same duplicate startup closes with `Another coordinator or offline mutation - owns this repository`, proving that the already attached Pumas process holds - the repository coordination lease. Resource listing fails for the same - duplicate-start reason; it is not a substitute for the omitted task tools. -- The diagnosis rules out a missing profile, dead registered process, stale - orphan lock, or SDK-version-only failure. The blocker is the Codex - host-to-model callable inventory: the server processes are attached and own - their resources, but their task operations were not supplied to this model - turn. Killing those owners or using a custom client would be destructive or - bypass required elicitation and was not attempted. -- Official Codex MCP documentation records a one-second default grace for - optional servers during initial tool-catalog construction; servers marked - required instead use their startup timeouts. The configured Passeur entries - specify 10-second startup timeouts but are not required, and no global grace - override is present. This is the leading host-side explanation for live - processes with omitted tools. Changing the global configuration and starting - another session requires explicit authority and remains untested. -- Material external tooling drift was recorded before dispatch: the clean - Passeur source is now `49724a8` (`feat: add discoverable startup runtime`), - while the ignored configured `dist/` still presents the older CLI surface; - its `--version` invocation prints the old usage text. The compatibility fix - commit `4f4ef0f` remains in its ancestry. Rebuild/registration reconciliation - is required after callable attachment is restored and before fresh task keys - are allocated. -- Pumas remains at `05855f1b`, its clean coordinator source remains at - `96f859443460ad8e4799d563528aaba113ccff21`, and Tuldok remains clean at - `6e9e6ec32d4dd719af0e051baafacecd190864c2`. The unrelated untracked - `docs/breif/future.md` remains untouched. No delegation, product edit, - candidate, GPU/browser action, publication, or remote mutation occurred; - `TIPC-M1` remains `Blocked` pending exposure of the existing named servers' - callable operations. - -## 2026-09-20 — Callable Passeur execution, source integration, and controlled acceptance - -- This conversation exposed all four configured operations for both - `passeur_pumas` and `passeur_tuldok`, resolving the recorded attachment - blocker. `/status` and `/usage` in an interactive Muse UI remained blank - because Passeur launched headless Muse SDK workers rather than UI-owned - sessions; task worktrees, live child processes, and Passeur results supplied - the authoritative observations. -- Initial Pumas dispatch was rejected by `PROJECT_IN_USE`. Host process - inspection identified two older-session Passeur coordinators holding the - Pumas and Tuldok leases, distinct from this conversation's configured - processes. After explicit approval, only the two stale coordinators were - terminated; the current Pumas and Tuldok servers remained live. -- Pumas batch assignments: - - Rust `TIPC-M1-R-v4`, task - `a6f404a7-91bf-4f23-8d9a-ee03242e7fd9`, produced commit - `92aa516d99a33a6259c0ddf586bf21829d00af9e`. Passeur rejected the delivery - because `pumas-app-manager/src/lib.rs` was a newly proved public re-export - owner outside the original write set and the worker report was malformed. - Independent compilation then found four custom-error signatures incorrectly - using the crate's one-parameter `Result` alias. - - Repair `TIPC-M1-R-REPAIR-v1`, task - `693c0b78-3e0a-4153-a380-ac038e98f2a5`, made the four correct - `std::result::Result` edits but timed out before committing. - - Python `TIPC-M1-P-v4`, task - `1066fb46-8ccd-47cc-a522-ba2e87aee4e1`, made a useful uncommitted - `image_api.py` partial and timed out. - Host inspection confirmed both timed-out workers had exited. The Pumas - coordinator was stopped with approval, both shutdowns were reconciled - offline, and all three resources were finalized as retained evidence rather - than inaccurately marked integrated. Their reviewed work was adapted into the - accepted Pumas commit below. -- Applied the diagnosing-bugs loop to the one failing Rust silent-transport - regression. The ranked leading hypothesis was confirmed: starting Tokio time - paused let the bounded connection timer auto-advance before POST admission. - The test now waits for backend admission before pausing and advancing 300 - controlled seconds; the production transport was unchanged. -- Integration review added the missing live process/profile identity fence. - Image listing and admission now require one stable owned observation before - and after strict handshake plus ready-slot verification; a same-URL process - replacement is rejected by generation/PID identity. Unit TCP fixtures answer - the newly required slot query and explicitly prove same-endpoint replacement. -- The sidecar now has no generation deadline. It polls an independently owned - thread-wrapper task, requests cancellation on disconnect/owner cancellation, - records requested/pending/completed/failure diagnostics, and retains the - device lease until the wrapper reaches a terminal state. Controlled time - proves successful work 601 seconds beyond its start. The native deadline - fixture now exercises disconnect cancellation and HTTP 499 instead. -- The existing repeated load-cancellation regression exposed the same shield - problem in `ModelManager.load`: a second cancellation could indefinitely - interrupt cleanup. `torch-server/model_manager.py` was recorded as a newly - proved load/device-custody owner and now polls its independent executor task, - preserves custody, clears abandoned objects, marks the slot failed, and then - re-raises owner cancellation. -- The bundled source recipe is now `torch-runtime-0.1.6`, protocol `3`, with an - exact `image_generation` capability list. Sidecar health advertises the same - values; qualification rejects recipe protocol, capability, status, or live - handshake drift. Requests stay closed; private results require all canonical - typed fields, allow bounded additive data, and public projection exposes only - gateway-owned fields. -- Accepted Pumas source commit: - `826a270958f7182bd8108c879b4b7fa1da5cab7d`. Verification passed: - - `cargo test --manifest-path rust/Cargo.toml -p pumas-app-manager`: 106 passed; - - `cargo test --manifest-path rust/Cargo.toml -p pumas-rpc --features inference-plugins`: - 241 unit, 16 active integration, and 2 active intent tests passed; 12 - environment/network tests remained explicitly ignored; - - Ruff lint and format checks passed for all 23 Torch-server files; - - 37 Torch-server unit tests passed. The managed Codex seccomp environment - cannot join even an idle Python default executor at interpreter teardown, - so an equivalent temporary runner skipped only executor teardown and used - explicit process exit after the complete suite result; - - Rust formatting and `git diff --check` passed. - No qualified native Torch environment exists in this checkout, so - `tests_native/test_image_failures.py` is updated but its required native run - remains the only TIPC-03 evidence gap. -- A dispatch race allocated two Tuldok attempts: - `M3-TIPC-T-v4` (`219a705e-2561-4710-914a-fc0cb8fccac9`) and - `M3-TIPC-T-v5` (`a06f60b6-3ee0-4019-9cde-b75f085e9854`). Both timed out with - unconfirmed shutdown and uncommitted work. Host inspection confirmed both - workers exited; the idle Tuldok coordinator was stopped with approval and - both records were reconciled. Only the broader v5 contribution was reviewed, - adapted, and integrated; v4 was not combined with it. -- Accepted Tuldok companion commit: - `a61daeec83779868cf03b14fb5c811fcdc608fc2`. It removes the 630-second - consumer deadline, bounds connection establishment only, distinguishes - pre-connect failure from uncertain response loss, never retries - automatically, tolerates additive public metadata without persisting unknown - fields, and updates the real browser flow to 1280×720 display/save evidence. - The complete Tuldok unit suite passed: 47 tests. One server-observation - assertion was stabilized by waiting for the fixture handler to observe EOF - after the client worker had already stopped. -- Both Tuldok timed-out resources were finalized as retained audit evidence; - v5 maps to accepted commit `a61daee`, while v4 remains an explicitly - non-integrated alternate. No task worktree or branch was deleted. -- Source-controlled acceptance now passes TIPC-01, TIPC-02, TIPC-05–TIPC-08, - TIPC-11, and TIPC-12. TIPC-03 is partial pending its qualified native run. - TIPC-04, TIPC-09, and TIPC-10 remain with the Tuldok image plan's exact - candidate/GPU/browser handoff. No candidate was built, no runtime was - installed or activated, no GPU process was started, and nothing was - published. Unrelated `docs/breif/future.md` remains untouched. - -## 2026-09-20 — Qualified native cleanup and exact candidate installation - -- Both refreshed Passeur namespaces attached to their repository services and - accepted durable tasks. Pumas task - `e4323220-4f72-4b5e-9194-4e7c308abcc4` reached permission input, but the host - surfaced no approval UI and recorded each presentation as `abort`, including - read-only runtime and validation-tool probes. Tuldok review task - `e66351c3-1b33-4c97-aae2-d9849fe92b75` completed three native turns without a - valid terminal disposition. Both workers made no changes and were stopped; - host process inspection confirmed no task worker remained. No custom client - or programmatic permission answer was used. -- After the user explicitly authorized the original runtime probe, ordinary - workspace execution found installed runtimes `0.1.1`–`0.1.4`, each using - CPython 3.12.3, Torch 2.9.1+cu130, CUDA 13.0, FastAPI, and Pillow. The updated - native suite ran with the `0.1.4` interpreter outside the managed seccomp - environment and passed both tests in 0.524 seconds. The sandbox run had - reproduced its known executor-join hang after the first passing case. TIPC-03 - is now passed. -- Rechecked `torch-runtime-0.1.6`: repository references remained the planned - recipe/contract/tests only, no installed or candidate `0.1.6` existed, and - the accepted product paths were unchanged between `826a2709` and the plan - head. Packaged those exact product bytes with requirements-lock SHA-256 - `d4073f8e8a1d8b20b48a275a2c63a6d2c084369e831f093b8903a0047c4ca0f4`. - Candidate archive SHA-256 is - `74f9b593dff1e447a73571dc465efd520238ba0c56d2730393a17eee2b97426c`. -- The first production `VersionInstaller` attempt failed deterministically before - dependency setup: its strict Rust `RuntimeRecipe` decoder did not admit the - required `capabilities` field. A focused installer fixture reproduced the - exact failure. Fix `ab3a95a9369a5471127003fcd8e6fff529596cb5` now decodes - additive capabilities and requires `image_generation`; a missing-capability - fixture proves rejection without disturbing previous runtimes. The focused - regression and all 107 app-manager tests pass. -- The unchanged exact archive then installed through the production installer - into fresh isolated root - `launcher-data/cache/torch-qualification/tipc-0.1.6-install`. Native validation - reported CPython 3.12.3, Torch 2.9.1+cu130, CUDA 13.0, RTX 5090 Laptop GPU - capability `(12, 0)`, successful CUDA execution, and a live sidecar health - response `{status: ok, protocol: 3, capabilities: [image_generation]}`. The - installed runtime occupies 5.2 GiB. TIPC-09 is passed. -- Existing `torch-runtime-0.1.1`–`0.1.4` installations remained intact. The - candidate was not installed into the main launcher root, activated, selected - as a default, published, or used to unload any model. At this checkpoint, - TIPC-04 GPU cancellation/reuse and TIPC-10 browser display/save remained. The - unrelated untracked `docs/breif/future.md` remains untouched. - -## 2026-09-20 — Exact-candidate GPU and Tuldok acceptance - -- The managed approval reviewer rejected adding `0.1.6` to the main shared - Torch version store without narrower authorization. The acceptance therefore - kept the existing production-installed candidate in its isolated launcher root. - Real qualification-only model directories linked the two existing packages; - copied metadata and the required 4.2 GB Nunchaku checkpoint made executable - artifact discovery local to that root. The main model library, installed - runtime inventory, `torch-runtime-0.1.4` selection, and default remained - unchanged. -- Built inference-enabled `pumas-rpc` from - `ab3a95a9369a5471127003fcd8e6fff529596cb5`; binary SHA-256 is - `97ee58c8042d22fcb27f47b3b07ce54faa7f16cfec050b552b911c03e0a9bcfe`. - The isolated gateway selected its sole `torch-runtime-0.1.6`, advertised - protocol 3 plus `image_generation`, and loaded the real Nunchaku FP4 rank-128 - pipeline on the RTX 5090 Laptop GPU in 15.255 seconds. -- A live 1280×720 generation was disconnected after admission. The exact - candidate logged cancellation requested at `23:30:56.981` and cancellation - completed at `23:30:57.584`; the following request was admitted only after - that completion and returned HTTP 200 with one valid PNG in 7.276 seconds. - Its decoded PNG is 265,041 bytes with SHA-256 - `4fc58b0a9d21b33380006600af8cc26afc8f33577d7cf6b3fc6180937b96d013`. - TIPC-04 is passed. Persistent evidence is the isolated profile's - `runtime.log` and - `launcher-data/cache/torch-qualification/tipc-0.1.6-tipc-04-reuse-response.json`. -- Refreshed Tuldok source - `a61daeec83779868cf03b14fb5c811fcdc608fc2` then ran its required-real browser - fixture through the same gateway and candidate. It discovered Nunchaku, - generated the red-teapot/yellow-lemon/blue-table prompt at 1280×720 with seed - 42, displayed 1280×720, saved the exact response PNG, and automatically added - it to the temporary collection. Browser elapsed time was 10.036 seconds; - runtime generation was 9.553 seconds with eight steps, guidance zero, and - sequential CPU offload. Saved PNG SHA-256 is - `cdf9ae632f621606032d91975f86f960d546b39349a83ce6b851b50390fb52a3`. - Visual inspection matched the prompt. Evidence is under - `launcher-data/cache/torch-qualification/tipc-0.1.6-tuldok-real/`. TIPC-10 is - passed. -- The served model was unloaded, its isolated profile stopped, and the isolated - gateway exited cleanly. Host inspection found no remaining qualification - gateway or sidecar; GPU process occupancy returned to the pre-run 35 MiB - baseline. Nothing was published, no main runtime was added or selected, and - no old installation was removed. With TIPC-01 through TIPC-12 passed, this - focused plan is accepted. Broader distribution acceptance remains separately - owned. diff --git a/docs/plans/torch-image-provider-contract/issues.md b/docs/plans/torch-image-provider-contract/issues.md deleted file mode 100644 index 0d948e5ae..000000000 --- a/docs/plans/torch-image-provider-contract/issues.md +++ /dev/null @@ -1,238 +0,0 @@ -# Issues: Torch Image Provider Contract Correction - -**Plan:** [plan.md](plan.md) - -## TIPC-I01 — Elapsed generation deadlines contradict the product contract - -- Finding: the sidecar and Rust image client each enforce 600 seconds. A - 615-second gateway policy remains documented/configured but the current image - branch bypasses that generic request wrapper. -- Disposition: TIPC-M1 removes operative deadlines and stale image policy while - retaining independently owned connection/startup/load/install policies. -- Evidence: TIPC-01 and TIPC-02; implementation must trace the real route rather - than treating every documented timeout as operative. - -## TIPC-I02 — Protocol 2 cannot distinguish the corrected lifetime - -- Finding: the client, bundled sidecar, and source recipe use protocol `2`. - Existing compatibility checks precede load and filter listing, but an older - live protocol-2 sidecar can accept the same request while retaining the old - deadline; handshake defaults and process replacement also permit ambiguity. -- Disposition: evolve the existing mechanism to strict protocol `3`, bind - compatibility to current process/profile identity, recheck before admission, - and retain independent capability and ready-slot checks. Do not add a lifetime - capability, registry, or cache in parallel. -- Evidence: TIPC-05 and TIPC-06. - -## TIPC-I03 — Result documentation is stricter than the current decoder - -- Finding: Rust currently accepts additive private result fields, while the - private protocol document describes a closed result. Required values and the - whole response still need canonical validation and bounds. -- Disposition: preserve permissive additive decoding, validate all required - semantics, enforce the bound over the whole payload, and keep unknown private - data out of public projection and diagnostics. -- Evidence: TIPC-07 and TIPC-08. - -## TIPC-I04 — Cancellation request is not resource-safe completion - -- Finding: current sidecar structure waits for worker cleanup, but cancellation, - disconnect, wrapper-drop, and process-failure states require real-route proof; - socket failure alone cannot establish that external GPU work stopped. -- Disposition: retain worker/device custody through sufficient cleanup, expose - requested/pending/completed/failure states through existing mechanisms, refuse - unsafe reuse, and preserve unknown outcomes without replay. -- Evidence: TIPC-03, TIPC-04, and TIPC-11. - -## TIPC-I05 — Candidate and user-workflow evidence are external handoffs - -- Finding: source recipe `0.1.5` is not present in the installed `0.1.1`–`0.1.4` - inventory and no Torch runtime asset appears in the reviewed release inventory. - Tuldok already sends numeric dimensions and defaults to 1280×720, but retains a - 630-second generation deadline and its real browser check used a smaller image. -- Disposition: reserve `torch-runtime-0.1.6`; recheck before building. The Tuldok - image plan owns construction/install qualification, real GPU cleanup, removal - of its remaining consumer deadline, and the supported 1280×720 browser flow. - Distribution consumes the result later under separate authority. -- Evidence: TIPC-04, TIPC-09, and TIPC-10. - -## TIPC-I06 — Explicit generation contract takes precedence - -- Finding: adopted Resilience guidance requires an end-to-end deadline for - remote calls, while the explicit Pumas product policy says elapsed time alone - is never a failure condition for any admitted generation. -- Disposition: `TIPC-GEN-01` records the generation-wide Core precedence. It is - the normal generation contract, not an image exception. Connection/setup, - non-generation operations, cleanup, and termination may retain separate - budgets; bounded admission, cleanup custody, no replay, and authorized process - stop remain mandatory. The implementation updates the appropriate Pumas - architecture/contract owner and amends ADR 0002 for the Torch image case; - Coding-Standards is unchanged by this repository task. -- Evidence: contract/ADR review plus TIPC-01–TIPC-03 and TIPC-11/TIPC-12. - -## TIPC-I07 — Shared gateway limits cap non-image generation - -- Finding: the shared gateway HTTP client has a total timeout and current - `/v1/chat/completions` and `/v1/completions` policies add 120-second request - deadlines. A long connected text generation can therefore fail solely due to - elapsed time even though generation remains valid. The current proxy buffers - the provider response body, so a supported non-streaming request may remain - silent until completion; this correction does not claim new streaming support. -- Disposition: make one generation transport/lifecycle seam connection-bounded - but duration-unbounded and use it for current and future generation routes. - Keep models, embeddings, health, startup, loading, installation, cleanup, and - shutdown on their independently justified policies. -- Evidence: TIPC-12 plus configuration inspection proving no client-wide, - request-total, response-read, idle, or middleware generation deadline remains. - -## TIPC-I08 — Shared transport proof does not prove external provider cleanup - -- Finding: Ollama and llama.cpp chat/completions share the generic buffered - gateway implementation, while Torch uses a dedicated image adapter. A - controlled provider can prove Pumas transport behavior but cannot prove that - actual Ollama or llama.cpp workers stopped after disconnect. -- Disposition: TIPC-12 owns only the shared Pumas transport, route wiring, - disconnect signal, uncertainty, and no-replay claim. The current-route table - names each provider lifecycle owner. Torch image cleanup remains TIPC-03/04; - unregistered Torch text remains with broader Torch remediation. Future routes - inherit the contract only as an admission requirement. -- Evidence: route/registry construction tests plus one controlled long/silent - non-image transport integration; provider-specific cleanup requires separate - owner evidence and is not inferred from TIPC-12. - -## TIPC-I09 — Native deadline fixture directly conflicts with the correction - -- Finding: `torch-server/tests_native/test_image_failures.py` patches the - 600-second constant and expects HTTP 504/`deadline_exceeded` while also - asserting the valuable cleanup-before-lease-release invariant. -- Disposition: the file is explicitly admitted. Replace its deadline trigger - with owner cancellation or disconnect and retain the cleanup assertion; - separately prove continued execution beyond the old boundary with controlled - time. -- Evidence: focused native-suite execution plus TIPC-01/TIPC-03. - -## TIPC-I10 — Repeated cancellation can stall load-worker cleanup - -- Finding: the existing repeated load-cancellation regression hangs because - `ModelManager.load` re-enters `asyncio.shield` while its owning task still - carries cancellation. A second cancellation can repeatedly interrupt cleanup - even after the executor worker returns, preventing the device lease and task - from reaching a terminal state. -- Disposition: admit `torch-server/model_manager.py` as the proved load/device - custody owner. Consume cancellation only while polling the independently - owned worker to completion, clear abandoned loaded objects, mark the slot - failed, and then re-raise the original owner cancellation. -- Evidence: the pre-existing repeated-cancellation regression plus the complete - sidecar unit suite. - -## TIPC-I11 — Required project-scoped Passeur tools are not callable - -- Finding: initial intake found no Pumas or Tuldok profile and no Passeur tools - in the current Codex session. The installed registration helper owns one - default `muse_bridge` name, while this assignment requires distinct - project-scoped Pumas and Tuldok servers. -- Disposition: configured separate outside-checkout worktree roots and the named - `passeur_pumas`/`passeur_tuldok` servers after human model/subscription and - configuration authorization. Both profiles and registrations pass Doctor and - `codex mcp get`. A Codex restart remains required before the tools can appear; - do not substitute native Codex subagents or direct Muse sessions. -- Evidence: Passeur Doctor/profile lookup and current MCP tool inventory. This - blocks implementation execution only until restart, not plan admission or - read-only preparation. - -Post-restart diagnostic: both configured servers start and list the exact four -schema-version-2 tools through a read-only MCP SDK client, but the resumed -conversation's callable-tool inventory still omits both server namespaces. A -new conversation attachment, rather than another profile/configuration change, -is required before this issue can close. - -Second-session diagnostic: both namespaces are now callable. The first Pumas -batch reached worker startup and failed deterministically because Passeur used -`clientInfo.name = "muse-bridge"`, which Muse 1.3 rejects under its -`^[a-z0-9_]+$` machine-identifier rule. Tuldok first rejected a cross-repository -plan path before worker startup, then reached the same client-name failure after -its context list was corrected. A minimal handshake reproduced the failure and -passed with `muse_bridge`; the local Passeur source, probe, regression test, and -ignored built runtime were corrected in local commit `4f4ef0f`, and the full -test suite, typecheck, and build passed. The attached MCP processes retain the -pre-build module, so one further Codex restart is required. All six zero-change -failed allocations were explicitly archived and retired; no product task -remains live. - -Third-session diagnostic: after the requested restart, the corrected Passeur -runtime and registrations remain present but the resumed conversation's -callable inventory again omits both namespaces. A sandboxed startup reports the -generic repository-in-use error because it cannot acquire Passeur's external -state lease; host-visible process inspection and state-directory inspection -show no running coordinator or surviving lock. The same configured command, -launched read-only with its required state access, initializes and lists all -four tools. The remaining failure is conversation attachment, not Passeur -source, profile, registration, task state, or a live worker. Start a newly -created conversation that explicitly requests `passeur_pumas` and -`passeur_tuldok`; do not use a custom client that bypasses elicitation. - -Fourth-session diagnostic: the user created another conversation and explicitly -named both servers. `codex mcp get` still resolves both enabled registrations -with the four-tool allowlist, and both Doctors pass. Host-visible inspection now -shows one live exact-command process for each server; the Pumas process owns the -repository coordination lease. The model's complete callable inventory still -contains neither namespace. Consequently, a resource-list request and a -bounded read-only SDK handshake start duplicate processes and close; outside -the restricted sandbox the duplicate reports `Another coordinator or offline -mutation owns this repository`. This is expected contention with the healthy -attached owner, not evidence that the profile or lease is stale. Do not kill -the owner or use a custom client. The remaining blocker is host-to-model tool -exposure for the already attached processes. - -Material tooling drift observed during this diagnostic: the clean Passeur -source advanced from compatibility commit `4f4ef0f` to `49724a8`, while the -ignored configured `dist/` runtime retains the older CLI surface (for example, -`--version` prints the old usage text). Reconcile and verify that build/runtime -identity after callable attachment is restored and before dispatch. - -Fifth-session resolution: both configured namespaces and their four operations -were callable. Pumas and Tuldok Muse workers ran in repository-scoped -worktrees; their useful committed or dirty output was reviewed and adapted into -Pumas `826a2709` and Tuldok `a61daee`. Timed-out workers were confirmed stopped -before offline reconciliation, and every surviving task resource was finalized -with an explicit retained disposition. The attachment issue is resolved for -this execution; after the coordinators were intentionally stopped for safe -reconciliation, a later delegation requires normal server reattachment rather -than another workaround or direct Muse invocation. - -Official Codex MCP configuration documentation states that optional servers get -a one-second grace while the initial tool catalog is built, unless the global -grace is disabled, while required servers use their startup timeouts. The two -Passeur registrations set a 10-second startup timeout but have no `required` -flag, and the global optional grace is unset. That configuration matches the -observed live-process/missing-catalog shape but remains a hypothesis until an -authorized change marks only these requested servers required and a fresh -session verifies the resulting catalog. - -Latest refreshed-server diagnostic: both namespaces exposed the new durable -submit/wait/input operations and accepted tasks. The host nevertheless surfaced -no Muse permission UI; presenting pending inputs recorded `abort`, including for -read-only shell probes. The Tuldok read-only worker separately completed three -turns without a valid assignment disposition. Both tasks were stopped with no -changes, and host process inspection confirmed no task worker remained. The -ordinary Codex workspace permission path then completed the explicitly -authorized native/candidate work. Future Passeur execution should wait for its -permission-elicitation and terminal-disposition path to be repaired; a custom -client remains prohibited. - -## TIPC-I12 — Production installer rejected the corrected recipe capability field - -- Finding: exact-candidate qualification reached the production - `VersionInstaller` and rejected `torch-runtime-0.1.6` before dependency setup: - its strict Rust recipe decoder still knew only recipe identity, protocol, - Python, and platform, while the corrected immutable recipe necessarily also - declares `capabilities`. -- Disposition: `RuntimeRecipe` now consumes the additive capability list and - requires `image_generation` while tolerating unknown additional capabilities, - matching the private protocol's capability semantics. Installer fixtures now - use the real protocol-3 recipe shape and prove a missing required capability - cannot publish or disturb a previous runtime. -- Evidence: the focused regression first failed with the production error and - then passed; all 107 app-manager tests passed; the same exact candidate bytes - installed and completed native GPU plus live sidecar validation through the - production installer. Fix commit: `ab3a95a9369a5471127003fcd8e6fff529596cb5`. diff --git a/docs/plans/torch-image-provider-contract/plan.md b/docs/plans/torch-image-provider-contract/plan.md deleted file mode 100644 index 8ac01aae2..000000000 --- a/docs/plans/torch-image-provider-contract/plan.md +++ /dev/null @@ -1,410 +0,0 @@ -# Plan: Torch Image Provider Contract Correction - -**Plan status:** `Completed` - -**Objective:** Establish one reusable generation lifetime in which an admitted -image, text, or future generation remains active until completion, -backend/runtime failure, owner cancellation or disconnect, or explicit runtime -shutdown. Correct the Torch image provider against that lifetime, prove live -compatibility before admission, and preserve the public image contract and -immutable runtime installation model. - -**Acceptance status:** `Accepted` - -**Current phase:** accepted. `TIPC-M1` is complete at Pumas -`ab3a95a9369a5471127003fcd8e6fff529596cb5` (provider source `826a2709` plus the -production-installer capability correction); the Tuldok companion is committed -at `a61daeec83779868cf03b14fb5c811fcdc608fc2`. The qualified native failure test -passes. Exact candidate `torch-runtime-0.1.6`, SHA-256 -`74f9b593dff1e447a73571dc465efd520238ba0c56d2730393a17eee2b97426c`, installs -and validates through the production installer. Real RTX 5090 cancellation -retained the device through cleanup and the following request succeeded. The -same installed candidate completed the refreshed Tuldok 1280×720 display/save -workflow. TIPC-01 through TIPC-12 are passed. - -**Next integration slice:** none in this focused plan. Publication, -production-default selection, and the broader image plan's remaining -distribution acceptance retain their own authorization and gates. - -**Execution ledger:** [execution-ledger.md](execution-ledger.md) - -**Issues:** [issues.md](issues.md) - -## Baseline and placement - -- Pumas revision reviewed: `74d4f7f0a5345e2dba476313d9cb409f4fceeb61`. -- Coding-Standards revision reviewed: - `366c1d90a24bbfb50973f62b155a5f3396c0f107`. -- Tuldok revision reviewed: `6e9e6ec32d4dd719af0e051baafacecd190864c2`. -- Material local differences at reconciliation: untracked - `docs/breif/future.md` was unrelated and remains untouched. The user-supplied - `docs/plans/torch-provider-lifetime-and-protocol-correcitons.md` was a matching - draft and has been reconciled into this canonical plan rather than retained as - competing authority. Tuldok had no local changes. - -This focused plan is warranted because the existing -[Tuldok image plan](../torch-diffusion-serving/plan.md) is already active at -distribution acceptance and owns broader UI/runtime delivery. Moving this -independent contract correction into its current slice would obscure acceptance -and displace its priority. This plan is the sole executable owner of the -reusable Pumas generation lifetime and the Pumas/Torch image correction; the -existing plan owns only the named Tuldok and exact-candidate handoffs below. - -This is a revision baseline, not an exact-HEAD implementation restriction. -Implementation must recheck relevant source and local changes before editing. - -## Boundary and binding decisions - -| Concern | Binding owner and decision | -| --- | --- | -| Generation transport/lifetime for `/v1/chat/completions`, `/v1/completions`, `/v1/images/generations`, and future generation routes | `pumas-rpc`; one connection-bounded, duration-unbounded policy | -| Public `POST /v1/images/generations` decoding, routing, and public response/error projection | `pumas-rpc`; keep public and private contracts separate | -| Private `POST /api/images/generate` encoding/decoding and compatibility interpretation | `TorchClient` in `pumas-app-manager` | -| Image inference, cancellation, worker and device ownership | `torch-server` | -| Installed artifact identity and qualification | Existing VersionInstaller/qualifier; immutable archives remain authoritative | -| Lifetime | No admitted generation has a total, response-read, idle, or elapsed-duration deadline; a justified connection-establishment budget is not a generation budget | -| Image execution shape | Synchronous request/response with bounded admission; no durable jobs, reconnection, resumption, public cancellation API, or automatic replay | -| Compatibility | Use the existing protocol-version mechanism and allocate Torch protocol `3`; do not add a parallel lifetime capability or compatibility registry | -| Candidate identity | Reserve unused recipe identity `torch-runtime-0.1.6` for the corrected candidate; publication and default activation remain separately authorized | -| Contract evolution | Requests remain closed and strictly typed; valid results require the canonical fields but permit unknown additive private result fields within the whole-payload bound | - -Protocol `3` is selected because the inspected provider and recipe are protocol -`2`, no Torch protocol `3` allocation exists, and a protocol-2 sidecar can accept -the request while retaining the old deadline. Exact protocol evolution therefore -rejects that ambiguity without inventing a second capability mechanism. The -installed repository inventory contains `0.1.1`–`0.1.4`, the source recipe names -`0.1.5`, and the reviewed GitHub release inventory contains no Torch runtime -asset; `0.1.6` is consequently reserved for this candidate. Recheck that -allocation immediately before construction. - -### Generation lifetime contract - -`TIPC-GEN-01`: the explicit Pumas product contract is that elapsed duration and -response silence never make an admitted generation fail. This applies to image, -text, streaming, non-streaming, and future generation operations; it is the -generation rule, not an image exception. The explicit Pumas generation contract -takes precedence over the generic remote-operation deadline requirement for -generation operations. - -Connection establishment, health, startup, model loading, installation, -non-generation inference such as embeddings, cancellation cleanup, and shutdown -may retain independently justified budgets. Those budgets must not become a -maximum generation duration. Bounded admission, busy rejection, retained -resource ownership, explicit cancellation, and operator stop prevent this -contract from authorizing an unbounded queue or detached work. Record the -generation-wide policy in the appropriate architecture/contract owner and amend -ADR 0002 for its Torch image application during implementation; do not modify -Coding-Standards in this repository task. - -## Required behavior - -### Shared generation lifetime, cancellation, and uncertainty - -- Give all public generation routes one transport/lifecycle policy with a - connection budget but no client-wide, per-request total, response-read, or - idle deadline. Apply it to `/v1/chat/completions`, `/v1/completions`, and - `/v1/images/generations`, and make it the required seam for future generation - routes. Do not apply it to models, embeddings, health, startup, loading, - installation, or shutdown merely because they share an HTTP client today. -- Remove the shared gateway/client limits that currently cap chat/completions, - the Python 600-second image deadline, the Rust image transport deadline, - deadline-derived generation outcomes, and the stale 615-second image policy. - Trace middleware and intermediaries so no inherited timeout recreates a - generation limit. -- An owning request abort or connection loss requests cancellation through the - real gateway/private route. Distinguish cancellation requested, cleanup or - termination pending, cancellation completed, and runtime/process failure - through existing lifecycle/diagnostic mechanisms. -- Each generation provider retains its admitted work and resources until its - own completion or sufficient cleanup. Dropping the gateway future or provider - connection requests cancellation but does not prove provider work stopped. -- Retain worker and device custody until the underlying work has stopped enough - for safe reuse. Dropping a Rust future, Python task, or thread wrapper is not - proof of termination. Refuse unsafe unload or device reuse while execution or - cleanup is active. -- A connected stalled operation may retain its admitted resources until a - terminal event or authorized stop. Transport loss before a terminal result is - an unknown outcome: never claim compute stopped and never replay automatically. -- Streaming bytes are progress information, not lease renewal. A connected - generation may also legitimately remain silent until its terminal result. - -### Current route and proof boundary - -| Route or surface | Current provider/response path | TIPC-M1 proves | Provider-lifecycle owner and disposition | -| --- | --- | --- | --- | -| `POST /v1/chat/completions` | Ollama and llama.cpp through the same generic gateway handler, shared HTTP client, and buffered `proxy_response` | Actual registry/route wiring uses the duration-unbounded generation transport; one controlled long/silent transport integration plus wiring tests covers the shared implementation | Ollama `OllamaProviderApi` and llama.cpp `LlamaCppRuntime` serving owners retain provider-native cancellation/cleanup. TIPC-12 does not claim their external workers stopped. | -| `POST /v1/completions` | Ollama and llama.cpp through that same generic buffered path | Same shared-construction proof as chat; route tests must fail if either provider bypasses the generation transport | Same provider owners; provider cleanup evidence remains with each provider lifecycle owner. | -| `POST /v1/images/generations` | Torch-only gateway adapter → TorchClient → synchronous private image endpoint | Image transport/lifetime, disconnect propagation, uncertainty, compatibility, and projection under TIPC-01–TIPC-03/TIPC-05–TIPC-08/TIPC-11 | This plan owns sidecar cleanup evidence; the Tuldok image plan owns required-real GPU reuse evidence TIPC-04. | -| Torch text handlers | Not registered for public chat/completions; current sidecar handlers call `_generate` synchronously | Nothing; this surface is not an implicit prerequisite or TIPC-12 representative | [Desktop/Torch remediation Milestone 3](../current-standards-remediation-2026-09-03/desktop-release-bindings-and-torch/plan.md#milestone-3-make-the-torch-surface-truthful-and-schedulable) owns its lifecycle/responsiveness. | -| Future generation route | Not yet admitted or verified | Nothing until its route is implemented through the generation transport | Admission requires `TIPC-GEN-01` plus a named provider cancellation/cleanup owner and fit-for-claim evidence. | - -One controlled non-image request may decide the transport behavior because -chat and completions for both registered providers necessarily traverse the same -handler, client, and buffered response function. Separate registry/route tests -prove that shared construction. The inference does not cross the provider -boundary: a dropped Pumas request proves a cancellation signal/connection loss, -not Ollama or llama.cpp worker cleanup. - -The named Pumas integration owners for those provider boundaries are -`rust/crates/pumas-rpc/src/handlers/serving_ollama.rs` and -`rust/crates/pumas-rpc/src/handlers/serving_llama_cpp*.rs`, together with the -external Ollama and llama.cpp implementations that own inference after request -admission. No provider-native cleanup acceptance is inferred here; a future -Pumas claim about either provider requires evidence admitted by that owner. - -### Live compatibility and readiness - -- Make handshake fields strict. Distinguish malformed handshake, protocol - mismatch, missing capability, connection unavailability, process/profile - replacement, model-load failure, busy state, and unsupported operation at - their owning boundaries. -- Verify the running sidecar's protocol and required capability before model - load/publication and again before admission where process ownership could have - changed. Bind the observation to the existing process/profile identity; an - endpoint URL or prior successful model listing is insufficient after - replacement. Keep ready-slot and supported-operation checks independent. -- Runtime qualification checks artifact/checksum, recipe identity/environment, - recipe-declared protocol, and actual bundled sidecar protocol/capabilities. - Recipe-to-sidecar agreement proves internal consistency; client-to-live- - sidecar agreement proves interoperability. A recipe label, listener liveness, - or successful health request alone proves neither compatibility, readiness, - nor the revised lifetime behavior. -- Rollback selects a compatible client/provider pair, not merely an older - runtime. Existing installations remain intact. - -### Requests, results, and projections - -- Keep private requests closed and typed, including numeric dimensions, - required fields, supported semantics, and the current unknown-field policy. -- Require valid `png_base64`, `seed`, `steps`, `guidance`, `memory_policy`, and - `duration_seconds`. Preserve canonical PNG, dimensions, base64, and size - obligations without inventing ranges or closed enums from current examples. -- Accept unknown additive result fields, including `peak_vram_bytes`, while - enforcing the response-size bound over the entire received payload. Reject - invalid required data and oversized payloads. -- Project only public-owned fields. Do not expose unknown private fields, paths, - tracebacks, or arbitrary provider messages. Preserve safe typed errors and - remove generation-deadline outcomes. A connection-establishment failure is an - unavailable/connect outcome, never proof that admitted generation was - cancelled or completed. - -### Knowledge owners updated with implementation - -Add `docs/contracts/generation-lifetime.md` as the single generation-wide policy -owner and link that boundary from `docs/ARCHITECTURE.md`. Update -`docs/contracts/torch-provider-protocol.md`, -`docs/contracts/image-generation.md`, `torch-server/README.md`, relevant module -and qualification documentation, and ADR 0002 without duplicating the general -policy. The repository has no separate ADR amendment convention, so append a -dated amendment to ADR 0002 that preserves its historical decision and replaces -only its Torch-specific lifetime, compatibility, and result-evolution clauses. - -The private protocol must name both directions: Rust TorchClient produces the -generation request; Python produces health/protocol/capability, generation -result, and provider-failure messages consumed by Rust; Pumas gateway produces -the public response/error consumed by the external application. Historical GPU -reports keep their original scope. Durable product docs must not describe the -new behavior before the implementation exists. - -## Acceptance and evidence ownership - -Each claim has one execution/evidence owner. Referencing plans may consume the -evidence but do not independently prescribe or re-prove the same correction. - -| ID | Claim and deciding evidence | Kind | Environment | Mode | Execution/evidence owner | Status | -| --- | --- | --- | --- | --- | --- | --- | -| TIPC-01 | Elapsed time beyond the former limit does not cancel valid work — controlled worker/clock regression | integration | representative controlled worker/clock | automated | This plan | passed | -| TIPC-02 | Production image transport permits a connected, silent, long request — configuration inspection plus controlled transport integration | integration | representative real gateway/private transport | automated | This plan | passed | -| TIPC-03 | Disconnect and explicit owner cancellation propagate while resources remain held through pending cleanup — current-route transport/lifecycle evidence | system | representative real Pumas/Torch route with controlled worker | automated | This plan | passed | -| TIPC-04 | Actual GPU cancellation permits reuse only after sufficient worker/device cleanup — required-real device evidence | system | required-real supported GPU and exact candidate | either | [Tuldok image plan M5](../torch-diffusion-serving/plan.md#m5--release-and-optional-build-acceptance) | passed | -| TIPC-05 | Malformed, incompatible, missing-capability, unavailable, and replaced runtimes cannot gain false listing/readiness/admission — handshake, serving, listing, and admission tests | integration | representative controlled sidecars/process replacement | automated | This plan | passed | -| TIPC-06 | Artifact consistency and live interoperability are independently checked, including mixed versions — installer/qualifier and client tests | integration | representative isolated installer plus mixed clients/sidecars | automated | This plan | passed | -| TIPC-07 | Additive results succeed while invalid required data and oversized whole payloads fail — decoder contract tests | contract | deterministic decoder fixtures | automated | This plan | passed | -| TIPC-08 | Private additions do not leak publicly and safe error projection remains coherent — gateway projection tests | integration | representative gateway/provider fixtures | automated | This plan | passed | -| TIPC-09 | The exact candidate installs and runs through production installation — isolated installed-artifact qualification | release-artifact | required-real isolated launcher root and candidate bytes | either | [Tuldok image plan M1/M5](../torch-diffusion-serving/plan.md) | passed | -| TIPC-10 | A supported real 1280×720 request traverses Tuldok → Pumas → installed candidate, displays, and saves — required-real browser/GPU evidence | user-workflow | required-real browser, GPU, Tuldok, Pumas, exact candidate | either | [Tuldok image plan M3-TIPC](../torch-diffusion-serving/plan.md#m3-tipc--tuldok-contract-companion) | passed | -| TIPC-11 | A lost response preserves uncertainty and causes no automatic replay — controlled transport-failure evidence | integration | representative controlled gateway/private transport | automated | This plan | passed | -| TIPC-12 | Registered non-image generation routes necessarily use the shared duration-unbounded Pumas transport; a connected silent request has no duration/byte-cadence failure, disconnect drops the Pumas request, and Pumas does not replay. This claim does not assert provider-native cleanup. | integration | representative real route wiring plus controlled gateway/provider transport | automated | This plan | passed | - -Controlled time must replace ten-minute regression waits. A short wait does not -prove the absence of a long production timeout, and harness watchdogs are not -production generation policy. Fixtures cannot satisfy real route, installed- -artifact, GPU, or browser claims. Source completion may precede environment- -gated evidence, but this correction is not accepted until all twelve claims, -including the three named handoffs, pass. - -## TIPC-M1 — shared generation lifetime and provider correction - -**Status:** `Completed` - -**Goal:** Establish the shared Pumas generation lifetime and correct the live -Pumas/Torch image compatibility and result contract as one implementation unit. - -**Allowed write set:** `torch-server/{image_api.py,model_manager.py,serve.py,validate_runtime.py,README.md,runtime/runtime.json,tests/**}` and -`torch-server/tests_native/test_image_failures.py`; -`rust/crates/pumas-app-manager/src/{lib.rs,torch_client.rs}` and focused tests; -`rust/crates/pumas-app-manager/src/version_manager/installer/{torch.rs,torch_tests.rs}`; -`rust/crates/pumas-rpc/src/handlers/{serving_torch.rs,openai_gateway.rs,openai_gateway_images.rs,openai_gateway_tests.rs}`; -`rust/crates/pumas-rpc/src/server.rs` where it owns the active shared gateway -client; `docs/contracts/generation-lifetime.md`, `docs/ARCHITECTURE.md`, and the -three image/Torch contract/ADR documents named above; relevant existing module -documentation; and this plan directory. -Dependency locks, public runtime defaults, release metadata, and Tuldok are -excluded. Expand only after recording a newly proved semantic owner. - -`torch-server/model_manager.py` was added during execution after the existing -repeated load-cancellation test proved that its shield loop could retain task -cancellation indefinitely instead of observing the executor worker's terminal -state. It is the load/device-custody owner for the same cleanup invariant; no -unrelated model-loading behavior is admitted by this expansion. - -`rust/crates/pumas-app-manager/src/lib.rs` was added after the RPC integration -proved it is the public re-export owner for the new typed Torch handshake and -image errors consumed by `pumas-rpc`; no unrelated app-manager API is admitted. - -**Tasks:** - -- [x] Recheck current source, local changes, protocol and recipe allocation; - record any material drift before expanding the write set. -- [x] Implement one generation transport/lifecycle seam without total/read/idle - duration failure for current text and image generation routes; preserve - independently bounded non-generation operations. -- [x] Implement cancellation/cleanup, unknown-outcome, handshake, process- - identity, admission, strict-request, extensible-result, payload-bound, - PNG/dimension, and public-projection decisions above. -- [x] Replace the native deadline fixture with owner cancellation or disconnect - while retaining its cleanup-before-lease-release assertion. Put continued - execution beyond the former 600-second boundary in the controlled-clock - lifetime regression rather than a wall-clock wait. -- [x] Evolve the bundled sidecar and recipe coherently to protocol `3`; verify - recipe/sidecar consistency separately from live client interoperability. -- [x] Add the controlled and real-route evidence for TIPC-01–TIPC-03, - TIPC-05–TIPC-08, TIPC-11, and TIPC-12, including mixed protocol versions, - replacement, and a representative non-image generation route. -- [x] Update the named contracts, ADR, README, module docs, and qualification - instructions only after their behavior is implemented. -- [x] Hand the corrected source identity and passing owned evidence to the - Tuldok image plan for candidate construction and TIPC-04/TIPC-09/TIPC-10. - -**Gate:** TIPC-01–TIPC-03, TIPC-05–TIPC-08, TIPC-11, and TIPC-12 pass at their -declared fidelity; documentation matches implementation; no production -total/read/idle generation timeout remains; protocol-2 or malformed/replaced -sidecars cannot be admitted. TIPC-04, TIPC-09, and TIPC-10 have been returned by -their owner against the exact installed candidate, so the plan gate is closed. - -### Supporting gates - -- `cargo test --manifest-path rust/Cargo.toml -p pumas-app-manager` -- `cargo test --manifest-path rust/Cargo.toml -p pumas-rpc --features inference-plugins` -- `python3 -m ruff check torch-server` -- `python3 -m ruff format --check torch-server` -- `python3 -m unittest discover -s torch-server/tests` -- In the resolved real Torch environment: - `python3 -m unittest discover -s torch-server/tests_native -p test_image_failures.py` -- Existing documentation link validation and `git diff --check`. - -The unit suite may use local fakes for contract behavior. The native failure -test proves real Torch worker/lease cleanup without claiming GPU execution; -TIPC-04 additionally passed with the named real GPU evidence recorded below. - -**Re-plan triggers:** Protocol `3` or recipe `0.1.6` is allocated before work; -the existing process/profile identity cannot close replacement races; safe -cleanup requires a new execution authority; or the bounded write set reaches an -unrelated public/runtime owner. - -## External handoffs and sequencing - -1. This reconciled authority precedes production implementation. -2. TIPC-M1 is one Pumas-generation/Torch-image unit, including its tests and - documentation. - Tuldok may independently remove its remaining client deadline against the - unchanged numeric public contract. -3. Candidate construction and provider-level qualification require the - corrected bundled implementation, not completed Tuldok UI work. Recipe - allocation is rechecked immediately beforehand. -4. Combined acceptance requires revised Pumas, aligned Tuldok, and the exact - installed candidate. Distribution may consume that evidence only under its - existing separate authority. - -The Tuldok companion owner must preserve its already-correct numeric -width/height request, 1280×720 defaults, dimensions, PNG display/save, explicit -consumer cancellation, watcher/socket cleanup, and no automatic retry. Its -remaining work is removal of the 630-second generation deadline and deadline -error, avoiding closed metadata examples, controlled unknown-outcome evidence, -and a real 1280×720 browser run on a supporting model. It does not redesign -discovery, datasets, or VLM transport. - -GPU/browser orchestration completed TIPC-04/TIPC-10 without changing completed -TIPC-M1 source. The corrected candidate remains installed only in the isolated -qualification root. Publication is neither authorized by nor a prerequisite of -this correction. Shared files were integrated serially between these plans. - -## Reconciliation dispositions and exclusions - -| Existing authority | Disposition | -| --- | --- | -| [Tuldok image plan](../torch-diffusion-serving/plan.md) | Retains Tuldok adaptation, corrected-candidate construction/installation, real GPU/browser evidence, and later distribution. Its prospective image deadlines are superseded by this plan. Historical image evidence retains its original scope. | -| [Desktop/release/Torch remediation](../current-standards-remediation-2026-09-03/desktop-release-bindings-and-torch/plan.md) | Retains text semantics, usage, responsiveness, and shutdown. Generation lifetime plus the image-specific compatibility/result subset of DRBT-A5 are delegated here; TIPC evidence is necessary but not sufficient for DRBT-A5. | -| [Rust/RPC remediation](../current-standards-remediation-2026-09-03/rust-library-and-rpc/plan.md), [frontend](../current-standards-remediation-2026-09-03/frontend-and-ui/plan.md), [governance](../current-standards-remediation-2026-09-03/governance-and-verification/plan.md), and [local intent API](../local-intent-api-2026-09-12/plan.md) | No ownership transfer and no dependency on completion; their unrelated work remains unchanged. | - -Excluded: editable dependency profiles/model-details UI, text request/response -semantics and usage accounting beyond generation lifetime, generic load/model- -execution descriptions, Nunchaku/Klein migration, packaging redesign, durable -jobs/retry, unified gateway/discovery, unrelated text remediation, new platforms, -general desktop shutdown, publication/default selection, and deletion of old -versions. User-deferred broad GPU fault matrices, NVFP4 work, and T16 desktop -shutdown remain deferred unless a specific TIPC claim demonstrates a prerequisite. - -## Composed-design review - -**Composed-design applicability:** `applicable` - -1. **Modules:** shared generation transport, gateway projection, TorchClient - protocol/transport, sidecar work owner, and installer/qualifier retain - distinct responsibilities. -2. **Dimensions:** generation duration policy is separate from connection/setup - budgets; live protocol/capability/process identity is separate from immutable - artifact/recipe identity and model ready-slot state. -3. **Composition:** one existing gateway seam owns generation transport while - RPC and serving roots wire the same clients/providers; no registry, job - service, or cache is added. -4. **Representative changes:** a protocol change touches private endpoints and - qualification; a public-field change touches gateway/Tuldok, not inference; - a recipe change touches artifact qualification, not live semantics. -5. **Interfaces:** the generation transport policy, public numeric image DTO, - private versioned messages, process identity, ready-slot check, and - VersionInstaller remain stable boundaries. -6. **Independent evolution, failure, replacement, and testing:** the shared - generation transport can evolve or fail without absorbing provider worker - ownership; each provider may be replaced only with its own cancellation and - cleanup contract. Clocks/workers, controlled image and non-image transports, - mixed sidecars, production installer, real GPU, and browser each decide only - their declared claims. -7. **Deletion:** removing the obsolete deadlines and closed-result assumption - reduces policy; no compensating abstraction is introduced. -8. **Complexity:** protocol `3`, process-bound revalidation, and retained cleanup - custody are required to distinguish old live behavior and safe reuse. - -## Blockers and follow-ups - -- Both refreshed Passeur namespaces attach and accept durable tasks. In this - continuation the host did not surface Muse permission choices: every request - was recorded as `abort`, including read-only probes, while a Tuldok review - repeatedly returned no valid terminal disposition. Both stopped tasks made no - changes. This tooling defect is recorded evidence but no longer blocks the - completed native, candidate, GPU, and browser work, which used the ordinary - workspace permission path after explicit user authorization. Do not bypass - Passeur with a custom client; re-use it only after its - elicitation/finalization path is repaired or for tasks that need neither - operation. -- No focused-plan acceptance blocker remains. The Passeur elicitation and - terminal-disposition defect remains an operational follow-up. - -## Final acceptance - -Accepted: TIPC-01 through TIPC-12 passed by their named owners. Pumas source is -`ab3a95a9369a5471127003fcd8e6fff529596cb5`, Tuldok source is -`a61daeec83779868cf03b14fb5c811fcdc608fc2`, and the exact candidate archive is -`74f9b593dff1e447a73571dc465efd520238ba0c56d2730393a17eee2b97426c`. -Qualification does not authorize publication, activation as the production -default, removal of old installations, or completion of either broader plan. diff --git a/docs/plans/torch-upstream-version-management/plan.md b/docs/plans/torch-upstream-version-management/plan.md deleted file mode 100644 index be4fca5ed..000000000 --- a/docs/plans/torch-upstream-version-management/plan.md +++ /dev/null @@ -1,157 +0,0 @@ -# Plan: Upstream Torch Version Management - -**Plan status:** `Active` - -**Owner:** Pumas runtime integration - -**Authorization:** The repository owner selected this scope on 2026-09-24 after -reviewing the active Torch deployment inventory. On 2026-09-25, the owner -authorized Pumas-managed stable CPython provisioning with no host-Python or -user-Python-selection requirement. - -## Execution state - -**Current phase:** The managed-CPython provider, automatic-choice UI, resolver -candidate scan, retained interpreter provenance, and Core-default profile have -passed code review and targeted Linux checks. Local Linux 0.7.0 AppImage and deb -packages were rebuilt from `ce9170d4`; artifact validation, standalone startup, -and packaged RPC health smoke pass, and the packed Electron bundle contains the -`get_torch_release_options` registration. In an isolated Linux RPC run, the -current source used managed CPython 3.14.7 to scan Torch 2.14.0 and resolve a -44-artifact CUDA 13.2 Core runtime preview (`python3.14`, adapter `none`). A -separate CPU Core preview resolved 25 artifacts and installed Torch 2.14.0 -through its retained preview with managed CPython 3.14.7. The installer checked -Torch identity and CPU operation; the installed version was explicitly -selected. The install ran with `python`, `pip`, and `pypy` absent from the -backend's child `PATH`, then its isolated temporary root was removed. The -managed sidecar also passed startup, health, protocol 3, and generation-owned -stop before graceful backend shutdown. The toolbar-linked package has not been -replaced or published. Image evidence remains limited to its exact previously -recorded tuples. The exact managed-Python and sidecar run is retained in the -[v2.14.0 acceptance evidence](../torch-cross-platform-runtime-management/reports/v2.14.0-linux-cpu-rpc-acceptance/acceptance.json). - -**Blockers:** Native CPU/Core install, restart, and sidecar acceptance passed -on Linux x86_64, Windows x64, and macOS arm64 for historical source `21041697` -in [run 36229508586](https://github.com/MrScripty/Pumas-Library/actions/runs/36229508586). -The three provider-license collections are integrated into release attribution, -but [missing declared upstream license references](../torch-cross-platform-runtime-management/reports/managed-python-license-collection/missing-declared-license-references.md) -remain a release acceptance blocker. Packaged desktop installation through the -Electron UI, CUDA/MPS device use, and v2.14.0 image/Tuldok behavior remain -unqualified. Historical native success does not certify the intermediate PR trees. - -**Next slice:** Qualify and independently review the managed runtime foundation -PR, including its repairs and the missing upstream license evidence. Obtain -fresh checks for the actual candidate and later complete packaged desktop and -device acceptance. Keep this Torch install path separate from FLUX.2, image -generation, and Tuldok claims, which require their own exact runtime evidence. - -## Product contract - -Every stable upstream PyTorch release tag (`vMAJOR.MINOR.PATCH`) is discoverable -without a Pumas qualification allowlist when the complete GitHub listing fits -the 20-page / 120-second request budget. If a page fails or the budget is -exceeded, discovery returns an error and never presents a partial listing as -complete. A release is installable when an official CPU, CUDA, or ROCm binary -wheel matches the native host and a stable standard CPython provisioned by Pumas, -and the full sidecar dependency set resolves to binary artifacts. CPython 3.10 -is the sidecar runtime minimum, with no configured upper minor cap. Candidate -Python versions come from wheel compatibility tags and the pinned managed -provider catalog; the manager selects the newest stable candidate whose complete -resolution succeeds. For dynamic choices, the retained preview records the exact -version, build, interpreter and provider identity, adapter, wheel URLs, and -hashes consumed by installation. - -"Any release" describes discovery and exact-tuple resolution, not a promise -that every old tag has a wheel for every interpreter or build. Unsupported -combinations and network-inconclusive checks remain distinct. Pumas provisions -its own Python runtime and does not compile Torch from source in this plan. XPU -remains outside this plan's accepted provider/runtime contract. Windows and -macOS native CPU/Core support has historical acceptance on `21041697` under the -[cross-platform Torch runtime plan](../torch-cross-platform-runtime-management/plan.md). -The fixed `v2.9.1` CUDA 13.0 / CPython 3.12 preset remains available as -a separately qualified, previously accepted exception backed by the embedded -hash-pinned requirements lock. Its preview exposes the three direct wheel URLs; -transitive wheel URLs are chosen from that lock during install, so this preset -does not claim the dynamic path's full per-wheel URL preview. Every other tuple -for `v2.9.1` uses the normal retained preview path and does not inherit the -preset's qualification. - -Normal installation does not require the user to pick a Python interpreter. -The manager provisions its pinned Python provider, discovers exact official -wheels for the selected release and provider-catalog candidates, filters -GPU channels by detected display-device vendor, and returns a recommendation -when its bounded scan and host checks support one. The manager selects Python -automatically; advanced controls can select only a returned build/profile -combination. Every install still requires the -existing full dependency preview and retained hash lock. Core Torch runtime is -the default. On Linux, Pumas-owned FLUX.2 dependencies remain an explicit -advanced profile; they are not part of an upstream Torch release. Windows and -macOS offer only the core profile until a platform-specific adapter is accepted. - -Installing a release does not activate it or make it the default. Selection, -default selection, sidecar startup, and stopping remain explicit version/profile -operations. A successful import or health check qualifies only its exact -runtime tuple and does not qualify every image adapter or model. - -## Objective - -Let a user discover stable PyTorch releases, review a complete compatible -official binary-wheel resolution, install into an isolated managed environment, -inspect the result, select the installed version, and start/stop its Torch -sidecar through the existing Pumas RPC API and desktop controls. Preserve the -existing Pumas gateway and Tuldok image workflow for exact qualified adapters. - -The image-serving plan remains accepted for its recorded Nunchaku and FLUX.2 -tuples. This plan expands the upstream runtime-management claim and owns the -updated PRG-I17 disposition. - -## Acceptance - -| ID | Observable criterion | Evidence required | -| --- | --- | --- | -| U1 | All stable upstream release tags are listed independently of Pumas recipes when the listing completes within the 20-page / 120-second budget; prereleases/nightlies are excluded; installed releases remain inspectable when upstream discovery is unavailable. Page failures and budget exhaustion are explicit errors, never silently truncated success. | Release fixtures including more than ten pages, end-of-list, page failure/no partial success, page-budget/deadline limits, cache completeness, filters, and offline installed-version query; live 63-tag discovery including v2.9.0. | -| U2 | Every dynamic build/interpreter selection runs an exact preview. Official origins, binary wheel compatibility, complete dependencies, hashes, and retained preview identity are validated before installation. The fixed qualified preset follows its separately documented hash-lock exception. | Python resolver and Rust preview tests; typed rejection values distinguish unsupported, invalid report, network-inconclusive, and generic-inconclusive outcomes without parsing diagnostic text; generated Electron/preload/React contract checks. | -| U3 | A non-preset release installs into staging from the retained lock, passes identity/core probes, and publishes only after validation. Failure/cancellation preserves installed, active, and default state. | Managed installation tests plus isolated real Linux installs for v2.9.0 CPU/CPython 3.12 and v2.14.0 CPU/Core with Pumas-managed CPython 3.14.7; see the [v2.9.0 evidence](reports/v2.9.0-cpu-rpc-acceptance.json) and [v2.14.0 evidence](../torch-cross-platform-runtime-management/reports/v2.14.0-linux-cpu-rpc-acceptance/acceptance.json). | -| U4 | The installed runtime can be inspected, explicitly selected, started by a managed Torch profile, health/protocol checked, and stopped by its owned generation through Pumas RPC or the desktop. | Composed desktop test plus real v2.9.0 and v2.14.0 RPC lifecycle acceptance on Linux x86_64; the v2.14.0 evidence records startup, health/protocol 3, generation-owned stop, and graceful backend shutdown. | -| U5 | The current real Tuldok image result remains accurately scoped to its exact Torch 2.10 CUDA 13.0 / FLUX.2 tuple; no general model/plugin or all-release image-generation support is inferred. | Reuse [2.10 GPU and Tuldok evidence](../torch-diffusion-serving/reports/upstream-v210-cu130-flux2-e2e.md); update the runtime inventory in [the progress report](../torch-diffusion-serving/reports/upstream-version-manager-progress.md). | -| U6 | For each selected stable release, the manager discovers that release's exact official CPU/CUDA/ROCm wheel matches for Pumas-managed CPython candidates, filters GPU families against detected display devices, and supplies a host-aware default when compatibility is established. Build and Pumas dependency profile remain optional advanced settings; Python selection is automatic. Partial discovery stays inconclusive; a wheel match still requires the full retained dependency preview. | Dynamic official-index scan fixtures and live `v2.14.0` scan; managed-provider candidate/fallback tests; NVIDIA driver-floor/unknown/partial-scan manager tests; typed RPC and generated-contract checks; desktop preview tests for automatic defaults, release-bounded overrides, null recommendations, and Pumas profile labeling. No all-release image qualification is inferred. | - -## Ownership and verification - -- `rust/crates/pumas-app-manager/src/version_manager/` owns official release - selection, build/interpreter selection, retained previews, installation - transactions, identity, selection, and process lifetime. -- `rust/crates/pumas-core/src/network/github.rs` owns complete upstream release - pagination and cache completeness behavior. -- `torch-server/resolve_runtime.py` owns pip dry-run resolution and exact - official binary artifact/hash provenance. It does not own runtime publication. -- `rust/crates/pumas-rpc/src/contract.rs` and - `rust/crates/pumas-rpc/src/handlers/mod.rs` expose manager actions and the - typed preview outcome; `rust/crates/pumas-rpc/src/contract/export.rs` owns its - generated public type. `electron/src/preload.ts` and - `frontend/src/components/TorchInstallPreview.tsx` validate and present that - result. -- The focused Python, Rust, RPC, Electron, and frontend suites are necessary but - not sufficient. Required-real acceptance installs and starts an older stable - release through an isolated launcher root. The exact 2.10 real GPU/Tuldok run - supplies image evidence for that tuple; it does not establish the desktop - control flow or other tuples. -- Reproduce and classify the previously reported unrelated full Rust test - failures before using the aggregate Rust gate as green. - -## Implementation handoffs - -The authorized implementation uses disjoint write sets: - -1. Rust version-manager and Torch RPC source/tests. -2. Python Torch resolver and its tests. -3. Torch desktop components and focused composed lifecycle tests. -4. Root-owned plan, PRG-I17, evidence inventory, final integration, and commit. - -The CPU/CUDA/ROCm channel vocabulary is shared between the Rust manager and -Python resolver. Changes to wire fields, generated contracts, the plugin -manifest, or other platform support require a new exact handoff. The separate -Windows/macOS handoff is -[Cross-Platform Torch Runtime Management](../torch-cross-platform-runtime-management/plan.md); -its remaining packaged-desktop and device acceptance does not change this -plan's recorded Linux evidence. diff --git a/docs/plans/torch-upstream-version-management/reports/v2.9.0-cpu-rpc-acceptance.json b/docs/plans/torch-upstream-version-management/reports/v2.9.0-cpu-rpc-acceptance.json deleted file mode 100644 index 3b31bbb7e..000000000 --- a/docs/plans/torch-upstream-version-management/reports/v2.9.0-cpu-rpc-acceptance.json +++ /dev/null @@ -1,488 +0,0 @@ -{ - "status": "accepted", - "tag": "v2.9.0", - "build": "cpu", - "python": "python3.12", - "adapter": "none", - "release_count": 63, - "artifact_count": 25, - "artifacts": [ - { - "name": "torch", - "sha256": "28f6eb31b08180a5c5e98d5bc14eef6909c9f5a1dbff9632c3e02a8773449349", - "url": "https://download-r2.pytorch.org/whl/cpu/torch-2.9.0%2Bcpu-cp312-cp312-manylinux_2_28_x86_64.whl", - "version": "2.9.0+cpu" - }, - { - "name": "fastapi", - "sha256": "bfb91aa2d334c61cb35ba9a116fc123b3d3df31640b801cf57a7a78ec3f603b3", - "url": "https://files.pythonhosted.org/packages/cb/03/10388a42375ee7e4ac9b94eb2c5c569c8b5795e377e701c9ac3ad63de890/fastapi-0.141.1-py3-none-any.whl", - "version": "0.141.1" - }, - { - "name": "uvicorn", - "sha256": "e8dca71ec86dce5f04e333f0d56cdedf942446e6643b9cea1af0d6d3a02cb03e", - "url": "https://files.pythonhosted.org/packages/76/18/0eea75741ee812e9f598b687619ce2454f6c3a1c5cd21ea990ec6bd26f45/uvicorn-0.53.0-py3-none-any.whl", - "version": "0.53.0" - }, - { - "name": "psutil", - "sha256": "076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", - "url": "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", - "version": "7.2.2" - }, - { - "name": "pillow", - "sha256": "78cb2c6865a35ab8ff8b75fd122f6033b92a62c82801110e48ddd6c936a45d91", - "url": "https://files.pythonhosted.org/packages/84/21/a35af28dcc61f37ed850a2d64c65c701321dfbf25085e469d5559360cbbf/pillow-12.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", - "version": "12.3.0" - }, - { - "name": "safetensors", - "sha256": "fd6f3f93c9a0a7cc2788ee63fb763353d4bd2e89b0751bc78fcf7dda00bea774", - "url": "https://files.pythonhosted.org/packages/28/50/f203ff3a3ddfe19308efc83c5a3a29ed02bf786732ec35e68bf9162f3365/safetensors-0.8.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "version": "0.8.0" - }, - { - "name": "annotated-doc", - "sha256": "117bac03a25ede5df5440e855b32d556049ca169ead221505badf432fed4b101", - "url": "https://files.pythonhosted.org/packages/3e/30/e900b21425a860e195f32e37657aa1f7c7f2b1bfb26f03ca209b90933c06/annotated_doc-0.0.5-py3-none-any.whl", - "version": "0.0.5" - }, - { - "name": "click", - "sha256": "255bc9599cf7748b4b1a446ccc735421bd08a2ae529a8b88597d3de5664ee360", - "url": "https://files.pythonhosted.org/packages/58/50/6c0d534c5f134586a8e1ba4e330569e32f057e33372ae556463212fb4cd3/click-8.5.0-py3-none-any.whl", - "version": "8.5.0" - }, - { - "name": "fsspec", - "sha256": "8dd6e646e99ea382bd85f97a45e6b526a442d79423a7dc673f1e2756d05fcb5f", - "url": "https://files.pythonhosted.org/packages/6c/c0/a98505f18594f1bce828bb159cec0fcf9860562f1a2c85913409fc8f3d9e/fsspec-2026.9.0-py3-none-any.whl", - "version": "2026.9.0" - }, - { - "name": "h11", - "sha256": "63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", - "url": "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", - "version": "0.16.0" - }, - { - "name": "networkx", - "sha256": "e3fd2c13a7814cee3746340d8d7f8598a67f16a58bf47fb7f8793fab6efca1b0", - "url": "https://files.pythonhosted.org/packages/7e/cd/fe58041e9011f307c490e3e17dd48cc516448f7c698a3f2d9d9d65d7e6a8/networkx-3.7-py3-none-any.whl", - "version": "3.7" - }, - { - "name": "pydantic", - "sha256": "346a034f080da3755d8e9cb5e00e8b07de1d39e4f6e2c87d8ab7cafa0b269a73", - "url": "https://files.pythonhosted.org/packages/eb/47/c95ffc2009878c7aac0c5e08528022dcb885933252a88b5f170058014464/pydantic-2.13.5-py3-none-any.whl", - "version": "2.13.5" - }, - { - "name": "pydantic-core", - "sha256": "0fc5be0abd4a407e200d844b404e33639a554e7bd0d448e7b9ae181be4789ac2", - "url": "https://files.pythonhosted.org/packages/c0/a4/eb9409ec0736e50aa70a412f16c204ed149516846912f7e6724d4c73ee53/pydantic_core-2.46.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "version": "2.46.5" - }, - { - "name": "starlette", - "sha256": "67f8e99895493dd2911a03f11314af6ceebeae4e704bb9f43dfc6a9db151c93e", - "url": "https://files.pythonhosted.org/packages/4e/d6/1ec1b290f9e0fb067899b61e1d37a30c923068bad260b216dbe37a7d2967/starlette-1.7.0-py3-none-any.whl", - "version": "1.7.0" - }, - { - "name": "sympy", - "sha256": "e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", - "url": "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", - "version": "1.14.0" - }, - { - "name": "typing-extensions", - "sha256": "481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", - "url": "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", - "version": "4.16.0" - }, - { - "name": "typing-inspection", - "sha256": "65b8397ba37ccbce054456aaccddfc91e6e3083c92824df348d96ca832f3f147", - "url": "https://files.pythonhosted.org/packages/67/81/4add07e5172b7ac40d8ed5ff580409a7801a4fe26d529bdd915401dabfbe/typing_inspection-0.4.4-py3-none-any.whl", - "version": "0.4.4" - }, - { - "name": "filelock", - "sha256": "30cd166e2aee2c7534ce2c33c6367c4cd051b8368e20e2c4eb0c34f699bacfab", - "url": "https://files.pythonhosted.org/packages/7a/6d/db8b86e168fef0cf904737e275bccb683558088ef971e92d3b41ce980699/filelock-4.0.3-py3-none-any.whl", - "version": "4.0.3" - }, - { - "name": "jinja2", - "sha256": "85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", - "url": "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", - "version": "3.1.6" - }, - { - "name": "setuptools", - "sha256": "51a52592b3b99e102b609654876bd65f19f999935166d1352678931132b0c670", - "url": "https://files.pythonhosted.org/packages/95/9c/c510029fc6ef33a6275cd2c5d3cecd6613dfd6aa401d57c54f1c18852ccf/setuptools-84.0.0-py3-none-any.whl", - "version": "84.0.0" - }, - { - "name": "annotated-types", - "sha256": "f072f4d804ea359e4eaf198b1af7a8b0943881a87f31bb764f8bf219bb9419e0", - "url": "https://files.pythonhosted.org/packages/99/91/8acff4f5e50511b911bbccb72b8628a49c68ce14148cd9f6431094859a90/annotated_types-0.8.0-py3-none-any.whl", - "version": "0.8.0" - }, - { - "name": "anyio", - "sha256": "6152fdbbf9a77fdec97731721bebf7c4c44f7c29b424b0065826173efc7ed101", - "url": "https://files.pythonhosted.org/packages/12/b8/4bd346e22b28902df4d651910f5242c28d84e4a5c2435ca5c3f797ed7e2e/anyio-4.15.1-py3-none-any.whl", - "version": "4.15.1" - }, - { - "name": "markupsafe", - "sha256": "d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", - "url": "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", - "version": "3.0.3" - }, - { - "name": "mpmath", - "sha256": "a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", - "url": "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", - "version": "1.3.0" - }, - { - "name": "idna", - "sha256": "ab7ae7122974553370f0bdb919e1a960b2cd1bc1ef0276416d896db81c14582c", - "url": "https://files.pythonhosted.org/packages/58/a2/bb081bab032533a855d44de1d56f8e8426114ff1ba5d1f07a438a0a654f8/idna-3.20-py3-none-any.whl", - "version": "3.20" - } - ], - "probe": { - "adapter_status": "not selected", - "capabilities": { - "cpu_tensor": { - "status": "passed" - }, - "cuda_tensor": { - "reason": "CUDA is not available", - "scope": "CUDA tensor operation", - "status": "unavailable" - }, - "flux2_klein": { - "scope": "optional adapter", - "status": "not selected" - }, - "image_device": { - "reason": "No NVIDIA sm_120 CUDA device detected", - "scope": "adapter device requirement", - "status": "unavailable" - }, - "image_generation": { - "scope": "no model loaded or inference performed", - "status": "not tested" - }, - "nunchaku_z_image": { - "scope": "optional adapter", - "status": "not selected" - }, - "sidecar_app": { - "health": { - "capabilities": [ - "image_generation" - ], - "protocol": 3, - "status": "ok" - }, - "scope": "in-process app construction and health endpoint", - "status": "passed" - }, - "sidecar_startup": { - "scope": "socket startup requires an explicit trial", - "status": "not tested" - }, - "torch_import": { - "status": "passed", - "version": "2.9.0+cpu" - } - }, - "context": { - "all_installed_distributions": { - "annotated-doc": "0.0.5", - "annotated-types": "0.8.0", - "anyio": "4.15.1", - "click": "8.5.0", - "fastapi": "0.141.1", - "filelock": "4.0.3", - "fsspec": "2026.9.0", - "h11": "0.16.0", - "idna": "3.20", - "jinja2": "3.1.6", - "markupsafe": "3.0.3", - "mpmath": "1.3.0", - "networkx": "3.7", - "pillow": "12.3.0", - "pip": "24.0", - "psutil": "7.2.2", - "pydantic": "2.13.5", - "pydantic-core": "2.46.5", - "safetensors": "0.8.0", - "setuptools": "84.0.0", - "starlette": "1.7.0", - "sympy": "1.14.0", - "torch": "2.9.0+cpu", - "typing-extensions": "4.16.0", - "typing-inspection": "0.4.4", - "uvicorn": "0.53.0" - }, - "distributions_sha256": "848f1b9acf059496bc09fdc58691c83e47d014e716264744a2c81736e69c2f3f", - "driver_version": [ - "595.84" - ], - "executable": "/tmp/pumas-torch-upstream-e2e-20260924-accepted/launcher-root/torch-versions/.torch-install-QwDKga/runtime/venv/bin/python", - "hardware": { - "cuda": null, - "devices": [], - "hip": null - }, - "hardware_fingerprint": "31a28bc91a796e6b77518e3ecc4abcdd391a89ce6ac62822a9031e99945c1f28", - "installed_distributions": { - "annotated-doc": "0.0.5", - "annotated-types": "0.8.0", - "anyio": "4.15.1", - "click": "8.5.0", - "fastapi": "0.141.1", - "filelock": "4.0.3", - "fsspec": "2026.9.0", - "h11": "0.16.0", - "idna": "3.20", - "jinja2": "3.1.6", - "markupsafe": "3.0.3", - "mpmath": "1.3.0", - "networkx": "3.7", - "pillow": "12.3.0", - "psutil": "7.2.2", - "pydantic": "2.13.5", - "pydantic-core": "2.46.5", - "safetensors": "0.8.0", - "setuptools": "84.0.0", - "starlette": "1.7.0", - "sympy": "1.14.0", - "torch": "2.9.0+cpu", - "typing-extensions": "4.16.0", - "typing-inspection": "0.4.4", - "uvicorn": "0.53.0" - }, - "interpreter_sha256": "1643dacd9feaedc58f3cc581e4d22577dfe25c09b10282936186ccf0f2e61118", - "platform": "Linux-7.0.0-31-generic-x86_64-with-glibc2.39", - "python": "3.12.3 (main, Jun 19 2026, 12:46:00) [GCC 13.3.0]", - "resolution_sha256": "01b2a9827f55965d8c898f018923ce03f841c514beeeb48518778e51e228e5bd", - "runtime_files_sha256": { - "control_api.py": "ee5160f121a749d8d11cd929abfb9d98a1a109235dac3690c9e2118f9cca54d0", - "device_manager.py": "9ab6d63eb943989bc19f1fed89098aca27b168536fa2529734d1ee4f37585379", - "diffusion.py": "c4dadfc949c17a460f8fc8a446b03139da0c574b45b3f561403fdf83e495b6d3", - "flux2.py": "39f864e1e15ffb2b697bb95418d474cb98a760feca9acd48a74b5cf05642fea2", - "image_api.py": "bb39ac05aee7ea4d4357360accfa27ee261f58d1cd9cc35af28470012673a7ec", - "loaders/__init__.py": "80cec9242f95b73881b038b890a5d9465a14be86a631b2a0e1bf9efacac543fe", - "loaders/dllm_loader.py": "2c5656bce01a6d133925d02ca72606f8ae951d66186ac07d3fcb7fd5580b1a13", - "loaders/safetensors_loader.py": "661a000b791396067d253a27a26cb5905ae40ce8d50817ba54bc1afce803396f", - "loaders/sherry_loader.py": "360ac3f66c4438e3ffe3d9dc99ef2a27ae69efdd26f8d3564f638ae7802e5b3f", - "model_manager.py": "cfc049050f9003f87d622fe57da5c4ab4efb5105523fcbab926d8770d82be3f8", - "nunchaku_compat.py": "27b42f9cae80e474c0b2162e6bf572f822d525134bf2fc3bddd551c031bb5d70", - "openai_api.py": "a3c712e6307fe3b60d1b7acdcbeb9413b011eb370ad656f862ef9399f3342f8c", - "probe_runtime.py": "3cbfc307576ce78ad662cae14e7bd0324c4ece4002edfeebd61ed630fac9f84c", - "resolve_runtime.py": "e0ee33f00efbe8345c1c0bb359ccd78af8bbc882627dd4f4e26df1a17d8ac206", - "serve.py": "88bf72ea3eac013dc7678bebe0e3b3053c141e8ec1222a210bd18b2a47601af4", - "validation.py": "f53cca26ddbddbc3c924ff07d32aaf9ced6061a7f1628379b4c0db2c9da7feb1" - }, - "sidecar_sha256": "88bf72ea3eac013dc7678bebe0e3b3053c141e8ec1222a210bd18b2a47601af4" - }, - "core_status": "passed", - "environment": { - "adapter": "none", - "artifacts": [ - { - "name": "torch", - "sha256": "28f6eb31b08180a5c5e98d5bc14eef6909c9f5a1dbff9632c3e02a8773449349", - "url": "https://download-r2.pytorch.org/whl/cpu/torch-2.9.0%2Bcpu-cp312-cp312-manylinux_2_28_x86_64.whl", - "version": "2.9.0+cpu" - }, - { - "name": "fastapi", - "sha256": "bfb91aa2d334c61cb35ba9a116fc123b3d3df31640b801cf57a7a78ec3f603b3", - "url": "https://files.pythonhosted.org/packages/cb/03/10388a42375ee7e4ac9b94eb2c5c569c8b5795e377e701c9ac3ad63de890/fastapi-0.141.1-py3-none-any.whl", - "version": "0.141.1" - }, - { - "name": "uvicorn", - "sha256": "e8dca71ec86dce5f04e333f0d56cdedf942446e6643b9cea1af0d6d3a02cb03e", - "url": "https://files.pythonhosted.org/packages/76/18/0eea75741ee812e9f598b687619ce2454f6c3a1c5cd21ea990ec6bd26f45/uvicorn-0.53.0-py3-none-any.whl", - "version": "0.53.0" - }, - { - "name": "psutil", - "sha256": "076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", - "url": "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", - "version": "7.2.2" - }, - { - "name": "pillow", - "sha256": "78cb2c6865a35ab8ff8b75fd122f6033b92a62c82801110e48ddd6c936a45d91", - "url": "https://files.pythonhosted.org/packages/84/21/a35af28dcc61f37ed850a2d64c65c701321dfbf25085e469d5559360cbbf/pillow-12.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", - "version": "12.3.0" - }, - { - "name": "safetensors", - "sha256": "fd6f3f93c9a0a7cc2788ee63fb763353d4bd2e89b0751bc78fcf7dda00bea774", - "url": "https://files.pythonhosted.org/packages/28/50/f203ff3a3ddfe19308efc83c5a3a29ed02bf786732ec35e68bf9162f3365/safetensors-0.8.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "version": "0.8.0" - }, - { - "name": "annotated-doc", - "sha256": "117bac03a25ede5df5440e855b32d556049ca169ead221505badf432fed4b101", - "url": "https://files.pythonhosted.org/packages/3e/30/e900b21425a860e195f32e37657aa1f7c7f2b1bfb26f03ca209b90933c06/annotated_doc-0.0.5-py3-none-any.whl", - "version": "0.0.5" - }, - { - "name": "click", - "sha256": "255bc9599cf7748b4b1a446ccc735421bd08a2ae529a8b88597d3de5664ee360", - "url": "https://files.pythonhosted.org/packages/58/50/6c0d534c5f134586a8e1ba4e330569e32f057e33372ae556463212fb4cd3/click-8.5.0-py3-none-any.whl", - "version": "8.5.0" - }, - { - "name": "fsspec", - "sha256": "8dd6e646e99ea382bd85f97a45e6b526a442d79423a7dc673f1e2756d05fcb5f", - "url": "https://files.pythonhosted.org/packages/6c/c0/a98505f18594f1bce828bb159cec0fcf9860562f1a2c85913409fc8f3d9e/fsspec-2026.9.0-py3-none-any.whl", - "version": "2026.9.0" - }, - { - "name": "h11", - "sha256": "63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", - "url": "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", - "version": "0.16.0" - }, - { - "name": "networkx", - "sha256": "e3fd2c13a7814cee3746340d8d7f8598a67f16a58bf47fb7f8793fab6efca1b0", - "url": "https://files.pythonhosted.org/packages/7e/cd/fe58041e9011f307c490e3e17dd48cc516448f7c698a3f2d9d9d65d7e6a8/networkx-3.7-py3-none-any.whl", - "version": "3.7" - }, - { - "name": "pydantic", - "sha256": "346a034f080da3755d8e9cb5e00e8b07de1d39e4f6e2c87d8ab7cafa0b269a73", - "url": "https://files.pythonhosted.org/packages/eb/47/c95ffc2009878c7aac0c5e08528022dcb885933252a88b5f170058014464/pydantic-2.13.5-py3-none-any.whl", - "version": "2.13.5" - }, - { - "name": "pydantic-core", - "sha256": "0fc5be0abd4a407e200d844b404e33639a554e7bd0d448e7b9ae181be4789ac2", - "url": "https://files.pythonhosted.org/packages/c0/a4/eb9409ec0736e50aa70a412f16c204ed149516846912f7e6724d4c73ee53/pydantic_core-2.46.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", - "version": "2.46.5" - }, - { - "name": "starlette", - "sha256": "67f8e99895493dd2911a03f11314af6ceebeae4e704bb9f43dfc6a9db151c93e", - "url": "https://files.pythonhosted.org/packages/4e/d6/1ec1b290f9e0fb067899b61e1d37a30c923068bad260b216dbe37a7d2967/starlette-1.7.0-py3-none-any.whl", - "version": "1.7.0" - }, - { - "name": "sympy", - "sha256": "e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", - "url": "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", - "version": "1.14.0" - }, - { - "name": "typing-extensions", - "sha256": "481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", - "url": "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", - "version": "4.16.0" - }, - { - "name": "typing-inspection", - "sha256": "65b8397ba37ccbce054456aaccddfc91e6e3083c92824df348d96ca832f3f147", - "url": "https://files.pythonhosted.org/packages/67/81/4add07e5172b7ac40d8ed5ff580409a7801a4fe26d529bdd915401dabfbe/typing_inspection-0.4.4-py3-none-any.whl", - "version": "0.4.4" - }, - { - "name": "filelock", - "sha256": "30cd166e2aee2c7534ce2c33c6367c4cd051b8368e20e2c4eb0c34f699bacfab", - "url": "https://files.pythonhosted.org/packages/7a/6d/db8b86e168fef0cf904737e275bccb683558088ef971e92d3b41ce980699/filelock-4.0.3-py3-none-any.whl", - "version": "4.0.3" - }, - { - "name": "jinja2", - "sha256": "85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", - "url": "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", - "version": "3.1.6" - }, - { - "name": "setuptools", - "sha256": "51a52592b3b99e102b609654876bd65f19f999935166d1352678931132b0c670", - "url": "https://files.pythonhosted.org/packages/95/9c/c510029fc6ef33a6275cd2c5d3cecd6613dfd6aa401d57c54f1c18852ccf/setuptools-84.0.0-py3-none-any.whl", - "version": "84.0.0" - }, - { - "name": "annotated-types", - "sha256": "f072f4d804ea359e4eaf198b1af7a8b0943881a87f31bb764f8bf219bb9419e0", - "url": "https://files.pythonhosted.org/packages/99/91/8acff4f5e50511b911bbccb72b8628a49c68ce14148cd9f6431094859a90/annotated_types-0.8.0-py3-none-any.whl", - "version": "0.8.0" - }, - { - "name": "anyio", - "sha256": "6152fdbbf9a77fdec97731721bebf7c4c44f7c29b424b0065826173efc7ed101", - "url": "https://files.pythonhosted.org/packages/12/b8/4bd346e22b28902df4d651910f5242c28d84e4a5c2435ca5c3f797ed7e2e/anyio-4.15.1-py3-none-any.whl", - "version": "4.15.1" - }, - { - "name": "markupsafe", - "sha256": "d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", - "url": "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", - "version": "3.0.3" - }, - { - "name": "mpmath", - "sha256": "a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", - "url": "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", - "version": "1.3.0" - }, - { - "name": "idna", - "sha256": "ab7ae7122974553370f0bdb919e1a960b2cd1bc1ef0276416d896db81c14582c", - "url": "https://files.pythonhosted.org/packages/58/a2/bb081bab032533a855d44de1d56f8e8426114ff1ba5d1f07a438a0a654f8/idna-3.20-py3-none-any.whl", - "version": "3.20" - } - ], - "build": "cpu", - "implementation": "cpython", - "interpreter": "/usr/bin/python3.12", - "machine": "x86_64", - "platform": "Linux-7.0.0-31-generic-x86_64-with-glibc2.39", - "python": "3.12", - "torch": "2.9.0+cpu" - }, - "recorded_at": "2026-09-24T19:09:37.061361+00:00", - "stale": false, - "staleReasons": [], - "status": "passed" - }, - "trial": { - "capabilities": [ - "image_generation" - ], - "cleanup": "not_needed", - "error": null, - "generation": "1", - "healthStatus": "passed", - "profileId": "torch-upstream-e2e", - "protocol": 3, - "startedByTrial": true, - "startupStatus": "passed", - "success": true, - "tag": "v2.9.0" - }, - "stop": { - "stopped": true, - "success": true - }, - "evidenceKind": "RPC acceptance summary and complete retained-preview artifact manifest; not a raw RPC transcript" -} diff --git a/docs/plans/v0.8-consumer-contract-assessment-2026-10-09.md b/docs/plans/v0.8-consumer-contract-assessment-2026-10-09.md deleted file mode 100644 index 88e18f380..000000000 --- a/docs/plans/v0.8-consumer-contract-assessment-2026-10-09.md +++ /dev/null @@ -1,90 +0,0 @@ -# Pumas v0.8 consumer contract assessment - -This assessment uses published `72af693cf7fb9c644c1837aafc74d63bcf902cd9`, tree -`ea251167c6e45161ece814f673e2118cc3c4212d`. Product version remains 0.7.0. -The separate finite generic CLI reference extension changes only consumer -reference/tests and documentation; its native test executable is compiled from -that exact published backend. It does not relabel that executable as a new build. - -## Implemented surfaces and actual proof - -| Surface | Implemented at the published source | Qualified evidence and remaining boundary | -| --- | --- | --- | -| Generic HTTP input/output | `POST /v1/model-operations` accepts selected model/profile, Text, TextBatch, Messages, PNG/JPEG Image and PCM Audio inputs; output intent is Text, EmbeddingsFloat32, PngBase64, Labels or recognized PCM output. Available descriptors resolve adapters; ambiguous Text operations require an explicit semantic task. | The 412-test RPC cohort includes strict DTO, codec, projection, controlled provider, admission/cancellation/drain tests. Actual native process tests establish fenced missing-model refusal, not a successful production forward. Mixed audio messages and PCM output have no executable adapter. | -| Text, embeddings and image adapters | Declared available chat/completion, embedding and image-generation adapters use the existing selected served model. Image-to-Text uses the dedicated bounded llama.cpp adapter and live vision readiness. | Controlled HTTP provider and real PNG/JPEG codec checks are meaningful transport/codec evidence. Positive provider tests do not qualify pretrained inference, numerical embeddings or model/projector/runtime bytes at this candidate. Historical FLUX/Tuldok receipts apply only to their own source/runtime/model/device tuples. | -| Audio-to-Text | The generic facade routes a declared Audio-to-Text pair through the existing private owned speech operation. Held selected-member reads and conditional constructor/custody plumbing exist. | Shipping installed-audio policy is empty, including `test-support` builds; the positive fixed Rust policy is `cfg(test)` only. Held readers and synthetic weights/classes/processes do not qualify a real Cohere/Transformers/Torch installation, loader read closure, native disposal or transcription quality. | -| Existing local-model reuse | `get_models` exposes the existing library; served-model selection and capabilities describe currently usable selected serving context. Immutable artifact/model references and selectors exist. | Catalog presence, acquisition qualification, build features and healthy HTTP are distinct from executable readiness. No implicit loading, most-recent-model selection, remote fallback or new cache is supplied by the reference. Preserve ambiguous/absent/unavailable outcomes. | -| Discovery, lifetime and recovery | Shared PumasBuildInfo, authenticated selected-root CLI observation/start, paired HTTP fences and actual passive owner retention exist. Explicit checkpointed pending-reservation metadata recovery is implemented. | Published combined evidence has 11 recovery, 13 physical lifetime, 51 discovery-name, 32 registry, 23 consumer and nine bootstrap lifecycle tests. Consumer fixtures use actual native children; decoder and controlled constructor cases remain labeled. Same-boot stable-root pending recovery is bounded; operating-owner recovery and the separately owned restricted profile are not included. | -| Headless discovery/distribution | `--build-info`, `--describe-local-http`, `/.well-known/pumas` and the shared packaging decoder exist. Opt-in inference assembler/producer verifies explicit source/schema/runtime inputs. | Current release inventory publishes no-inference headless roles; strict v0.8 inference assembly refuses version 0.7 before Cargo. The 87-case headless cohort has 86 passes and one Windows-only skip, mostly source/format/controlled build fixtures. The actual current all-features binary is a development artifact, not a qualified release archive. Native ORT loading, runtime closure, target ABI and final archive/consumer acceptance remain open. | -| Language interfaces | Exact-Git Rust source is the accepted native consumer channel. HTTP JSON is the language-neutral operation surface. Legacy UniFFI/Rustler adapters and stale experimental documentation remain in the tree. | `bindings/support-matrix.json` accepts no supported host tuple. Generation, a synchronous C# development smoke and old binding documents do not establish generic modality, async/error/cancellation or real-host package support. The Python callable is a source-exported CLI reference, not a Python SDK. | - -The published combined native binary is 200,891,848 bytes, SHA-256 -`5b3ea87f4bd65d71b6f318975e7848b907788d4579fe9bcd163a84aedf5733f7`, -normal all-features development profile. Its desktop contract is 194,223 bytes, -SHA-256 `84a59a9bc25613b68a091cdf9ce3019cc8acfae69aa19b591852e89e35cefed4`. -Exact source, runtime/model bytes, device and lifecycle scope must accompany any -new positive claim. Real-model inference was not run in this Cloud environment; -the retained NuGet ORT archive remains unextracted/unloaded pending strict -signing, timestamp and online-revocation proof. A build with inference features -does not resolve that gate. - -## The five consumers - -| Consumer | Existing contract to reuse | Remaining actual consumer acceptance | -| --- | --- | --- | -| Lanternwake | Generic PCM Audio-to-Text request and typed text result; authenticated selected-owner retention; caller cancellation never authorizes replay. | Consent-bound capture, normalized mono PCM, selected qualified installed speech runtime/model and editable transcript must be exercised in the application. The shipping ASR policy remains unavailable; no named transcription API is needed. | -| Eidetic | Generic Text/TextBatch-to-Embeddings, selected profile and existing model/served-alias identity observations. | Preserve served-alias/backend-ID guards. Accept exact package/revision/embedding-space identity semantics before replacing them, then qualify real vector dimensions/numerics and application reuse. Returned vectors alone do not establish cross-model embedding compatibility. | -| Pantograph | One immutable Rust source/schema cohort across manifests, lockfiles and setup; existing library/IPC or authenticated HTTP selection. | Run its actual locked Rust/library/IPC consumer suite and lifecycle at the accepted pin. Tiny untrained BERT forwards and Pumas-owned consumer tests do not establish Pantograph production-model quality or a native host binding. | -| Tuldok | Generic image or image-bearing messages to Text, with declared `image_to_text` task; seven descriptor variants and image format/bounds. Text-to-image retains its existing provider path. | Update the closed consumer parser, bind real runtime/model/projector and observe finite vision inference plus cleanup. Historical real FLUX image generation does not qualify the new Image-to-Text path at this source. | -| Chrema | Selected-owner attachment, exact transport/schema/archive identity, generic input/output and typed results. | Pin its actual adapter/source or archive, then exercise the application's modalities, cancellation and drain. No current Pumas-only receipt establishes that external process cohort. | - -## Smallest separate feature - -The callable reference previously exposed JSON-RPC and descriptor selection but -left `/v1/capabilities` and `/v1/model-operations` transport to every caller. -Add `LocalHttpSession.capabilities(model, profile=...)` and -`model_operation(request)` using its existing selected owner and held retention. -This hides the repeated fence/framing/socket code while retaining the producer's -generic primitives, status, typed result and error/outcome fields. Native -pre-handler stale fencing returns an empty HTTP 412; the reference preserves it -as `body=None`, without manufacturing an operation envelope. It makes one -request, validates response correlation, has no elapsed model-response deadline -and refuses unsupported streaming locally. The server retains modality and -readiness decisions. The shared transport also preserves existing JSON-RPC -behavior; its existing process regression suite remains required. - -The write set is `scripts/consumers/local_http_session.py`, its native process -tests, a separate controlled HTTP test file, the local HTTP reference contract -and this assessment. No acquisition S3/HF/importer, discovery restricted-profile -recovery, native runtime/provider, generated schema, release or binding generator -path changes. No new provider result, model identity, endpoint or ownership -protocol is introduced. Local test receipts distinguish actual missing-model -and stale-fence process results from controlled positive peer responses. - -## Decisions that remain - -A supported native binding needs one named consumer and its exact host language, -host runtime version, native OS/architecture, supported modality/error/async -contract and ownership/cancellation behavior, plus a real packaged host cohort. -The accepted matrix supplies no such tuple. Merely adding generic DTOs to a -generator cannot choose that support promise. This is a product/consumer decision, -separate from the implementable finite HTTP reference feature. - -On-demand loading remains deferred by the unified gateway brief. Existing-model -reuse should first select an explicitly served/ready model and preserve its -runtime/profile/artifact identity. Broadening to unserved models needs an -explicit lifecycle/resource/duplicate-load/uncertain-outcome contract. Eidetic's -embedding-space identity and first supported host tuple also require explicit -acceptance; neither is safely inferred from names, dimensions or model labels. - -## Source references - -- [Release acceptance and consumer cohort](v0.8-release-acceptance-reconciliation-2026-10-08.md) -- [Headless distribution](headless-inference-distribution-v0.8.md) -- [Generic HTTP operation contract](../../rust/crates/pumas-rpc/README.md#selected-model-modality-first-operations) -- [Callable CLI reference](../contracts/local-http-consumer.md) -- [Conditional installed audio](../contracts/installed-audio-constructor.md) -- [Image-to-Text](../contracts/image-to-text-v0.8.md) -- [Accepted host-binding matrix](../../bindings/support-matrix.json) -- [Accepted release/host decision](current-standards-remediation-2026-09-03/desktop-release-bindings-and-torch/reports/release-and-host-contract-decision.md) -- [Deferred unified gateway direction](../breif/unified-inference-gateway.md) diff --git a/docs/plans/v0.8-integration-2026-10-09.md b/docs/plans/v0.8-integration-2026-10-09.md deleted file mode 100644 index fe518fa60..000000000 --- a/docs/plans/v0.8-integration-2026-10-09.md +++ /dev/null @@ -1,142 +0,0 @@ -# v0.8 integration reconciliation — 2026-10-09 - -Status: active. Candidate source `0.8.0-rc.1` reconciles the published area -commits from PRs #64–#67. Combined validation is in progress. No production -inference, accepted release archive, native Windows/macOS execution or external -provider acceptance is claimed here. - -Common base verified through authenticated GitHub and fetched locally: -`b9568c768730513016ba1e38364a2a8cdb6fe418`. Historical source: -`3d977f11be98eb9bce5be199e05b5ed1846043ca`, with 31 branch-only commits -and 108 main-only commits, merge base -`5e114f6d8e4559e0a4d67e56000b423120a0fde0`. - -## Ownership and integration boundaries - -Area 1 reconciles acquisition/import, HF discovery/detail projection, -pending and restricted catalog recovery, local enumeration/start/fences/passive -retention, explicit model lookup, and the generic HTTP consumer helper. -Existing main cancellation cleanup, Windows display identity, physical-store -lifetime and isolated failed-bind fixture repairs must remain intact. - -Audio owns installed speech and Torch runtime/loader paths. Vision owns -modality DTO/adapters, projector serving identity, and vision consumer adoption. -Packaging owns release workflows, scripts, runtime/archive manifests and notices. -Area 1 owns S3/lookup desktop contract regeneration; final integration reruns the -producer after the modality branch joins. Shared startup/server, core API exports, -contract exports and manifests require explicit coordination when edits overlap. - -The combined candidate includes the published audio constructor boundary -(PR #66), image-to-text adapters (PR #65), packaging producer (PR #64), and -acquisition/discovery reconciliation (PR #67). Their historical checks are not -substitutes for checks on this combined source. Audio's production policy is -still fail-closed; actual model and supported-host qualification remain open. - -No blind historical merge, force push, release/tag, credential change or paid -service commitment is part of this work. Final integration must review exact -branch commits, run combined checks, publish its PR and wait for those results -before using the user's combined-merge authorization. - -## Absent-commit inventory - -| Commit | Subject | Reconciliation | -| --- | --- | --- | -| `a67859e9` | feat: unify headless inference, acquisition and local discovery sources | Split by ownership: area 1 imports/discovery/HF/consumer helper; audio, vision and packaging retained for their owners. | -| `f639150c` | Defer Hugging Face download details until model selection | Authored patch reconciled into area 1; historical receipts retain their original scope. | -| `88157674` | docs: distinguish published baseline and demand-details qualification scope | Authored patch reconciled into area 1; historical receipts retain their original scope. | -| `72af693c` | feat(discovery): recover qualified pending reservations | Authored patch reconciled into area 1; historical receipts retain their original scope. | -| `8a1fcd28` | feat(consumers): call generic model HTTP through retained sessions | Authored patch reconciled into area 1; historical receipts retain their original scope. | -| `6fc58a95` | fix(consumers): preserve empty native fencing refusals | Authored patch reconciled into area 1; historical receipts retain their original scope. | -| `f3120ddf` | test(consumers): bind stale fencing to native HTTP 412 | Authored patch reconciled into area 1; historical receipts retain their original scope. | -| `a4e2fc68` | feat(discovery): qualify restricted catalog owner recovery | Authored patch reconciled into area 1; historical receipts retain their original scope. | -| `c15a66fd` | test(discovery): initialize catalog requirements directly | Authored patch reconciled into area 1; historical receipts retain their original scope. | -| `a7ca2c9c` | feat(discovery): enumerate existing libraries from packaged CLI | Authored patch reconciled into area 1; historical receipts retain their original scope. | -| `173ff249` | Integrate reviewed catalog owner and generic HTTP reference | Historical merge; constituent consumer/recovery patches applied separately. | -| `49d8b216` | fix(distribution): preserve headless archive byte pins | Packaging owner; excluded from area 1. | -| `b26448ab` | Integrate reviewed local enumeration and archive byte pins | Historical merge; enumeration patches applied separately; archive changes belong to packaging. | -| `862695e7` | fix(catalog): exclude root publication receipt from payload freshness | Authored patch reconciled into area 1; historical receipts retain their original scope. | -| `4ed2be78` | Add digest-bound conditional acquisition for non-versioned S3 objects | Authored patch reconciled into area 1; historical receipts retain their original scope. | -| `da6f5d1a` | feat(s3): expose digest-bound conditional model import | Authored patch reconciled into area 1; historical receipts retain their original scope. | -| `1c005f23` | feat(s3): expose conditional single-object RPC imports | Authored patch reconciled into area 1; historical receipts retain their original scope. | -| `9aaba4b4` | feat(catalog): report canonical reclassification from explicit model lookup | Authored patch reconciled into area 1; historical receipts retain their original scope. | -| `b502691f` | chore(contract): regenerate clients for explicit model lookup | Generated output; regenerate from the reconciled producer. | -| `241530dd` | feat(acquisition): import authored conditional S3 file sets | Authored patch reconciled into area 1; historical receipts retain their original scope. | -| `0fa9b296` | feat(rpc): integrate authored conditional S3 bundle source | Authored patch reconciled into area 1; historical receipts retain their original scope. | -| `1c0ca714` | test(s3): preserve VersionId admission checks with typed selection | Authored patch reconciled into area 1; historical receipts retain their original scope. | -| `79237c4c` | chore(contract): regenerate combined authored S3 and lookup clients | Generated output; regenerate from the reconciled producer. | -| `ec03d0a6` | test(s3): integrate generic acquisition preflight expectations | Authored patch reconciled into area 1; historical receipts retain their original scope. | -| `df3e4237` | test(acquisition): cover duplicate HTTP ETag admission | Authored patch reconciled into area 1; historical receipts retain their original scope. | -| `fe3c9f04` | docs(acquisition): reconcile ec03 acceptance evidence and remaining gates | Authored patch reconciled into area 1; historical receipts retain their original scope. | -| `23f783b4` | test(consumers): qualify published Chrema caller against native ec03 | Authored patch reconciled into area 1; historical receipts retain their original scope. | -| `5d6121ac` | fix(rpc): preserve sanitized download status diagnostics | Authored patch reconciled into area 1; historical receipts retain their original scope. | -| `c9fb9ce7` | feat(acquisition): ingest digest-pinned local file capabilities | Authored patch reconciled into area 1; historical receipts retain their original scope. | -| `650b6cb3` | feat(torch): retain revision bytes without pinning global versions lock | Torch revision/component follow-up; excluded from area 1. | -| `3d977f11` | Add immutable Torch component assembly and owner-issued byte selection | Custom Torch component assembly; excluded, not a release prerequisite. | - -## Evidence and remaining work - -Historical receipts remain evidence for their named source/runtime tuples only. -The restored S3 campaigns use owned loopback HTTPS objects, not AWS, MinIO or an -independent hosted provider. ONNX package fixtures validate structural import, -not native ORT execution. Consumer positive peers are controlled responses; -native missing-model/fence/lifecycle tests make no pretrained inference claim. - -Current repository guidance was read: CONTRIBUTING, Architecture, Development -and Releasing. This saved environment has no repository AGENTS.md or local -.agents/skills, and the external Coding Standards path named by CONTRIBUTING is -absent. Locked Cargo/npm dependencies may be fetched; no native model/runtime -installation follows from that dependency setup. - -Current phase: qualify the combined candidate. Exactly one next slice: finish -combined native Rust/process, generated contract, dependency/notices and -packaging checks, inspect the exact final tree and publish a draft integration -PR. Required-real model and audio gates remain explicit blockers; fixture or -compilation evidence cannot close them or authorize a release. - -### Historical area 1 source checks (original workspace) - -- Frontend: 912 unit tests passed, one skipped; lint and typecheck passed. -- Electron: 249 tests passed, one skipped; lint and generator tests passed. -- Exported desktop conformance: 43 Electron and 65 frontend tests passed. - The frontend suite also passed without a preselected RPC binary, exercising - its locked offline native S3 producer build. Six conditional-S3 contract tests - passed separately. -- Native acquisition/ownership integration: 100 tests passed across 13 suites. - Five ignored child helpers were exercised by parent-process tests; the - separate sharded S3 campaign still needs its explicit harness run. -- RPC unit tests: 245 passed, two ignored child helpers. Full subprocess tests - initially failed to start against the default unwritable registry environment; - a run with an isolated writable XDG configuration is pending. -- Inference-enabled RPC compiled with all features and its preserved binary - passed all 16 local HTTP consumer tests. These exercise real native selection, - missing-model refusal, fencing, retention and shutdown, not model inference. -- HF demand-detail qualification passed using the rebuilt native RPC producer - and mounted React/jsdom UI. This is not a packaged browser acceptance run. -- The broad core run exposed two immediate-reacquisition fixture races (parallel - fork inheritance) and one fixture that destroyed its worker runtime. These - were repaired using bounded post-settlement reacquisition and a shared live - runtime. The initial two default-registry fixture failures were isolated with - temporary registries. Fresh complete core qualification remains pending. -- Strict Clippy identified authored style diagnostics, now repaired. Its next - run also exhausted disk in disposable debug incremental cache. That cache was - removed; subsequent qualification uses a no-debug, nonincremental target. - -The combined candidate implements an explicit receipt-bound GGUF model/projector -operation and preserves the selected primary even when its projector is larger. -Seven structural/custody integration tests pass, including metadata/receipt -refusals and maintenance paths. The packaging producer composes vision, -admission-fence and Linux owner-retention schema identities with target-aware -regressions. Actual model bytes and native inference remain unqualified; the -reported resource-access denial is not bypassed. Production audio is not -claimed merely from constructor and confinement-policy fixture checks. - -### Native continuation and evidence boundary - -The published area commits are reconciled on a native dot executor. The -previous executor's 16-file dirty follow-up is preserved separately, but its -archive transfer was denied and its patch has not been applied here. The -receipt-bound vision role bridge in this candidate is an independent -implementation from the published contracts, with independent negative -regressions. Source version `0.8.0-rc.1` is candidate preparation only; no tag or -release has been created. Required native model and production audio evidence -remain separate from source compilation and fixture checks. diff --git a/docs/plans/v080-consumer-api/plan.md b/docs/plans/v080-consumer-api/plan.md deleted file mode 100644 index 6ba9c69d1..000000000 --- a/docs/plans/v080-consumer-api/plan.md +++ /dev/null @@ -1,79 +0,0 @@ -# v0.8.0 consumer API - -**Plan status:** Active. **Acceptance status:** not yet satisfied. -**Current phase:** verification. **Next slice:** live runs of EmbeddingGemma 2 and Kev/OpenJev on llama.cpp b11429+, then consumer branch review and merge. - -## Objective and scope - -Make the public HTTP inference surface usable by independent consumers -(phased-memory, Tuldok, Lanternwake, Pumas-Playground; Pantograph and Eidetic -natively) before the v0.8.0 freeze, and add the model support the owner -requires: image-text-to-text, EmbeddingGemma 2 multimodal embeddings, and the -llama.cpp decision models (Kev, OpenJev). - -Out of scope: release packaging gates, briefs not listed here, production -speech, Torch text generation, crate restructuring. - -## Owner decisions (2026-11-02) - -- Additive changes never break consumers. Responses are extensible; consumers - ignore fields, list entries and enum values they do not use. Changing the - meaning or shape of an existing operation bumps `contract_version`. -- Every rejection carries a human-readable reason; the caller's `request_id` is - echoed whenever it can be read. -- Flat, model-agnostic limits are removed. Limits derive from the serving - configuration and runtime; only transport and decode-safety bounds stay fixed. -- Consumers discover served models, profiles and capabilities from Pumas rather - than hardcoding them. Served IDs are listed once per model/profile. -- Pumas provides text, image, audio and embedding primitives. - -## Acceptance claims - -| ID | Observable result | Evidence | State | -| --- | --- | --- | --- | -| C1 | Every typed rejection has `error.message`; parseable `request_id` is echoed; provider error text reaches the caller bounded | RPC unit/integration tests | satisfied: model-operation and gateway tests | -| C2 | One request grammar: `capability` and `options` optional; all requests accepted today remain accepted with identical results | existing + new model-operation tests | satisfied: existing suite unchanged in behavior; one-grammar test | -| C3 | A served-model listing route returns each (model, profile) once with capabilities, availability and derived limits | RPC tests | satisfied: served-models and /v1/models tests | -| C4 | No flat per-model limits remain on the typed path; advertised limits come from profile/runtime | tests + code inspection | satisfied for the typed path; the Torch image adapter keeps its 4,000-character prompt limit (adapter-specific) | -| C5 | `image-text-to-text` models advertise chat and image-to-text | descriptor tests | satisfied: descriptor tests | -| C6 | EmbeddingGemma 2 (GGUF + mmproj) serves text and image embeddings via llama.cpp with MRL truncation | tests + live run on owner's library | implemented and unit-tested; live run on the owner library pending | -| C7 | Kev/OpenJev serve a typed decision operation via llama.cpp `/v1/systemone` | tests + live run | implemented with a llama.cpp-shaped fake runtime; live run on Kev/OpenJev pending | -| C8 | Contract docs state the extensibility rule; consumers tolerate additions and show Pumas reasons | consumer test suites | implemented on consumer branches `feat/pumas-v080-api` (phased-memory, Tuldok, Lanternwake, Pumas-Playground); each repo test suite passes; not yet merged | - -## Milestones - -| M | Goal | Write set | State | -| --- | --- | --- | --- | -| M1 | Rejection reasons, request-ID echo, single grammar (C1, C2) | `pumas-rpc/src/handlers/model_operations*`, `openai_gateway.rs` error projection, `docs/contracts/model-operations-v1.md` | done | -| M2 | Served-model listing, derived limits, no duplicate IDs (C3, C4) | `model_operations*`, `openai_gateway.rs`, `server.rs`, `pumas-core` ONNX limits export | done | -| M3 | Image-text-to-text and EmbeddingGemma 2 (C5, C6) | `model_operations*`, llama.cpp launch specs/router presets, Ollama load path, embedding projection, `pumas-core` primary-artifact selection (projector files) | done | -| M4 | Decision capability (C7) | `model_operations*`, gateway route for `/v1/systemone`, contract doc | done | -| M5 | Consumer updates and contract docs (C8) | phased-memory, Tuldok, Lanternwake, Pumas-Playground (separate repos) | done on local branches | - -Re-plan if a milestone needs a core (`pumas-core`) contract change not listed -above, or if any consumer cannot keep working across M1–M4 without its own update. - -## Composed design (applicable: new public route and new adapter) - -1. Concerns: request grammar (what the caller wants), model selection (which - served model/profile), capability resolution (what that model can do now), - provider projection (how a provider is called), outcome projection (how - results and rejections are returned). -2. Required interleaving: capability availability depends on runtime readiness; - kept in descriptor computation, not in the grammar. -3. Callers know: one request shape, discovery via the listing route, error - `code`/`outcome`/`message`. -4. Adding a capability touches: `Capability`/`SemanticTask`, descriptor - computation, provider projection, result projection. Consumers are untouched. -5. Stable interfaces: the typed DTOs and descriptors; provider envelopes stay - behind projection. -6. The decision adapter and listing route can be replaced independently of the - existing text/embedding/image adapters. -7. Deletion: removing the second parser path deletes code; the listing route and - decision adapter are the only new permanent mechanisms. -8. Inherent complexity stays in descriptor computation (readiness and semantics). - -## Links - -Review that produced this plan: owner conversation 2026-11-02. No ledger is kept -for this plan; commit messages and test results carry history. diff --git a/docs/plans/v080-model-categories/plan.md b/docs/plans/v080-model-categories/plan.md deleted file mode 100644 index 83635ec01..000000000 --- a/docs/plans/v080-model-categories/plan.md +++ /dev/null @@ -1,73 +0,0 @@ -# v0.8.0 model categories and modalities - -**Plan status:** Complete. **Acceptance status:** satisfied on the owner library (2026-11-03). -**Current phase:** done. - -## Objective and scope - -Group library models by what a person uses them for, show the inputs and -outputs each model accepts, and stop a category change from moving or -renaming a model. Observed on the owner's library (2026-11-03): - -| Model | Actual use | Shown as | Cause | -| --- | --- | --- | --- | -| Kev, Laya | decision/evaluation | LLM | HF tag `text-classification`; no decision category | -| LTX-2.3 (fp8, nvfp4, base) | video generation | audio, embedding | HF tag `image-to-video` unmapped; no video category | -| LTX-2.3 IC-LoRA-HDR | video LoRA adapter | diffusion | adapters are not recognized | -| Granite Speech 4.1 2b-nar | speech-to-text | embedding | HF tag `feature-extraction` outvoted config `GraniteSpeechNarForASR` | - -Out of scope: changing the HTTP model-operations contract (it already routes by -capability input/output kinds), physical library re-layout, adapter -composition at serve time. - -## Owner decisions (2026-11-03) - -- A model has arbitrary declared inputs and outputs. Its category is the one - use a person would choose it for, derived from those declarations; other - modalities are shown as badges, not as extra categories. -- Add `video` and `decision` categories. -- The category is metadata. Changing it never moves a folder or changes a - model ID. -- An explicit user choice of category wins over detection and survives re-scans. - -## Design - -- **Categories** (`ModelType`, wire string unchanged): `llm`, `vlm`, - `decision`, `embedding`, `reranker`, `diffusion` (image generation), - `video`, `audio`, `vision`, `unknown`. New values are additive: the desktop - contract is regenerated and the HTTP contract already allows new enum values. -- **Evidence precedence:** user override > hard runtime/file signals (GGUF - `.decision.type`, config architecture such as `…ForASR`) > HF task tag - > name and file hints. A hard signal is never outvoted by a task tag. -- **Output-first use:** video output → `video`; image output → `diffusion`; - decision output → `decision`; vector output → `embedding`; audio in or out - (speech) → `audio`; text output with image input → `vlm`; text → `llm`. -- **Modalities:** `input_modalities`/`output_modalities` are always filled - from the resolved task signature (adding `image->video`, `text+image->video`, - `video->video`, `text->decision`) and shown as badges. -- **Adapters:** LoRA/adapter packages (`adapter_config.json`, `*lora*` - weights, HF `lora` tag) are flagged `adapter` and take the category of the - task they adapt; the UI shows an "Adapter" badge. -- **Category as metadata:** reclassification and migration keep a model's - first path segment (its storage bucket) and ID; only `model_type` metadata - and the index change. New imports still file under their detected category. - Code that read the category from the ID prefix reads metadata instead. -- **Override:** `set_model_category` RPC records `model_type_resolution_source: - "user"`; detection and reclassification skip such models. - -## Milestones - -| ID | Result | Evidence | State | -| --- | --- | --- | --- | -| M1 | `video` and `decision` categories; evidence precedence; task signatures; decision GGUF signal; `…ForASR`; adapter detection | resolver/identifier unit tests reproducing each observed case | done: resolver/identifier/category unit tests (`library/category_tests.rs`, identifier and governance tests) | -| M2 | Category changes never move folders or change IDs; ID-prefix readers use metadata; user override honored by re-scan | library/reconcile/migration tests | done: reclassification/migration tests rewritten to the rule; `user` source honored in the shared resolver | -| M3 | Desktop catalog carries category, input/output modalities and adapter role; `set_model_category` RPC | contract export, conformance, RPC tests | done: catalog DTO, `set_model_category` admission tests, regenerated contract, conformance fixture | -| M4 | UI groups by category (with Video and Decision), shows modality and adapter badges, lets the user set a category | frontend tests | done: frontend grouping/header/badge/picker tests | -| M5 | Owner library re-scanned: Kev/Laya → decision, LTX → video (LoRA as adapter), Granite nar → audio, without moving folders | live check on the owner library; CHANGELOG/release notes; candidate rehearsal | done: live refresh of the 94-model owner library: Kev/Laya decision, LTX video, Granite nar audio (audio → text), IC-LoRA adapter; 0 errors, 0 ID or folder changes; second pass settled | - -## Known limits - -- The LTX IC-LoRA adapter has no task tag or base-model evidence, so it stays - under image generation until a person chooses Video in its metadata window. -- LTX-2.3 reports image → video from its `image-to-video` tag; it also takes - text and produces audio, which no recorded evidence states. diff --git a/docs/plans/v080-packaging/execution-ledger.md b/docs/plans/v080-packaging/execution-ledger.md deleted file mode 100644 index 7037f1376..000000000 --- a/docs/plans/v080-packaging/execution-ledger.md +++ /dev/null @@ -1,106 +0,0 @@ -# Execution ledger - -## 2026-10-14 — scoped admission - -Accepted checkpoint/main is `055222931100eeedc43307271dbf7c504787888d`; -worktree clean, original readiness branch and receipts retained. Created the -separate scoped branch. Read current release policy, artifact plan, affected -staging/verifier/metadata tools and current canonical standards before source edits. -The parent explicitly admits this implementation under `docs/plans/v080-packaging/plan.md`. -The design is one serial preparation slice; independent review remains parent-owned. - -Confirmed full desktop jobs do not provision ORT, the existing verifier is -Linux-specific (copy command, environment, mapping, signal), and the old metadata -helper covers only two full Linux installers. Existing tag-only jobs can be -reused behind one explicit manual build-only boolean rather than redesigned. - -Official Nomic model card declares Apache-2.0; verified public weight pointer -at commit `ac6fcd72429d86ff25c17895e47a9bfcfc50c1b2`: FP16 is 273,859,028 bytes, -SHA-256 `cf5b5a86edb00f895561803cfc04729090a958340b8ca2ad76c143f565f6bb04`. -Executor metadata request to HF failed with proxy tunnel 403 before any model -bytes. Browser public-source observations are metadata evidence only; no model -download or inference is claimed. - -Before editing the no-inference packager, admitted its directly affected config: -it inherits full native-resource filters, so a stale developer staging directory -could otherwise copy an unused runtime into that variant. Restrict that variant's -backend resource entry to the two platform RPC filenames. This preserves the -existing backend/variant contract and prevents the same packaging failure family. - -Before extending dispatch guards, bounded the new build-only mode to the actual -sixteen-artifact plan. Separate review archives/dependency probes would duplicate -its native producer or qualify unavailable speech. Existing manual Torch E2E -provisions a non-shipped sidecar cohort and is not an assembly dependency. Omit -those three jobs only in the new candidate mode; retain ordinary PR/manual/tag -semantics. This avoids unrelated runtime downloads without redesigning jobs or -changing release artifact/acceptance support. - -## 2026-10-14 — implementation and local verification - -Implemented explicit official ORT staging/probing in full desktop backend jobs, -including exact pinned notices and no-inference resource exclusion. Staging -validates all native inputs before replacing its generated output. No-inference -configuration retains its other shared resources and variant names. - -Extended the existing positional packaged verifier with Python file copying, -isolated native environments, Windows process-group/CTRL_BREAK shutdown and -unconditional disposal after failed signals. Linux retains device/inode mapping -proof. Windows PSAPI and macOS lsof record the narrower native module path/current -byte observation under a distinct result label; mapped-file-object identity and -complete system closure stay unqualified. Microsoft PSAPI function signatures -were read from official documentation. Old macOS CI job 115744179824 reports -`macos-15-arm64` and Rust 1.92.0 aarch64; that resolves runner architecture for -design selection, not acceptance of the new implementation. - -Reused the existing native inference matrix for explicit untrained model -lifecycle execution in candidate/tag runs. Ordinary native QA now runs the source -contracts including actual Windows/macOS OS-observer self-process checks. This -Linux executor's skip is explicit. No trained weights are downloaded by CI here. - -The complete candidate metadata generator creates sixteen artifact-level SPDX -inventories, sixteen provenance subjects, combined source/native notices, project -license and checksums covering every other generated final file. SPDX does not -claim extracted-file or exhaustive native component analysis. The old two-Linux -extracted-file helper remains usable separately. The synthetic 16-file test -produces 35 checksummed files; those bytes are non-installable test fixtures. - -Validation: - -- Python focused suite: **20 passed, 1 native Windows/macOS-only skip**, 0 failures. - Corrupt staging preserves a prior sentinel; missing/ambient modules, forced - stop/signal errors, absent/extra/empty/symlink artifacts and stale attribution - cannot produce accepted output. Native OS module enumeration is not mocked - when its self-process test runs on the selected host. -- Full Node release suite: **37 passed**, 0 failures/skips. Initial run was - 32 passed/1 failed: its old no-inference assertion required the full native - resource filters. Replaced that obsolete expectation with exact RPC-only - exclusion plus preservation of all other shared resources. Added actual - source-guard execution against the real Git commit and wrong/missing inputs. -- Ruff 0.15.2 (the existing dev requirement): release-script check and formatting - passed. Checksum-pinned actionlint 1.7.8 passed with shellcheck/pyflakes disabled - locally because those plugins are unavailable; CI retains its full plugin gate. -- Both canonical default/S3 notice inventories regenerated. Notice texts remain - byte-identical; only the Electron package source hash changed. Freshness, - dependency ownership and version alignment (0.8.0-rc.1) passed. -- Main remained `055222931100eeedc43307271dbf7c504787888d`; no open Pumas PR was - reported before creating this slice's draft. Both lockfiles and the two earlier - candidate/qualification receipts retain their exact hashes. - -Logs and hashes are indexed in [the receipt](reports/verification.json). -Full native artifacts, trained execution, CI outcome and independent cumulative -review are not invented. Parent owns review of the concrete candidate and exact -build-only dispatch; this task has created no tag, release or full rehearsal run. - -During staged self-review, strengthened native notice coverage by role and every -target pin. That exposed a real representation difference: Linux/macOS LICENSE -and third-party texts use LF, Windows uses CRLF. The stricter first run had -18 passed/1 error/1 skip, retained in the receipt's earlier attempts. Verified -that CRLF reconstruction has exactly the Windows published sizes and digests -(1,094 and 331,175 bytes). The generator now emits every distinct exact pinned -representation, rejects a project license substituted for third-party terms, -and refuses any unrepresented platform's notice pin. No legal wording is guessed -or edited; each emitted variant is authenticated by its own role/target digest. -The complete suite then passed as above. One intermediate Ruff invocation used -the wrong working directory and failed before formatting/tests; the corrected -root invocation passed. The 09:22 environment warning did not lose work: a fresh -09:23:29 UTC git/date/read check succeeded, followed by these actual tests. diff --git a/docs/plans/v080-packaging/issues.md b/docs/plans/v080-packaging/issues.md deleted file mode 100644 index 457528c1f..000000000 --- a/docs/plans/v080-packaging/issues.md +++ /dev/null @@ -1,11 +0,0 @@ -# Packaging issues - -| Finding | Disposition / owner / next evidence | -| --- | --- | -| Full desktop ORT provisioning implicit/missing | Implemented and contract-tested: official pin stage/probe and native notices. Actual final desktop runs pending. | -| Packaged lifecycle verifier Linux-only | Portable implementation and controlled refusal/disposal tests passed; actual native packaged inference remains pending. Windows/macOS module-path evidence is explicitly narrower than Linux device/inode proof. | -| Metadata only describes two Linux full installers | Complete artifact-level SPDX/provenance/checksum generator tested on all sixteen planned identities; actual final bytes remain pending. Extracted-file helper retained separately. | -| Full matrix requires a tag | Default-false, exact-source build-only dispatch reuses jobs, omits review-only/non-shipped runtime jobs, and cannot publish. No run/tag executed here; parent reviews exact action. | -| HF metadata transfer denied by executor proxy | Blocked transfer, confirmed 403 and no bytes; public browser metadata can inform identity, no bypass or inference claim | -| Trained Nomic tokenizer/config byte identities and terms | Inspect exact upstream revision; missing evidence remains unavailable, no substituted weights or private user data | -| Independent cumulative review | Parent-owned after concrete candidate; do not equate self-review or tests with independence | diff --git a/docs/plans/v080-packaging/plan.md b/docs/plans/v080-packaging/plan.md deleted file mode 100644 index c261e1b4b..000000000 --- a/docs/plans/v080-packaging/plan.md +++ /dev/null @@ -1,131 +0,0 @@ -# v0.8 native package qualification - -**Status:** Verifying. **Acceptance:** partial. **Operation:** verify the implemented -slice admitted by the parent's explicit 2026-10-14 packaging continuation. -**Current phase:** local verification complete; CI and independent parent review. -**Next slice:** inspect exact-candidate checks and the parent's cumulative review. - -## Objective and boundaries - -From accepted main `055222931100eeedc43307271dbf7c504787888d`, make official CPU -ORT provisioning explicit for full desktops, support actual packaged ONNX lifecycle -verification on Linux x86_64/Windows x86_64/macOS ARM64, and generate complete -artifact-level release metadata for all sixteen planned files. Reuse existing -jobs for an opt-in, build-only manual rehearsal. Outputs remain unsigned, -unverified candidates; no tag, release publication, trained-model acceptance by -mock, ASR, vision, SDK, product API or schema change is authorized here. - -Isolation: `release/v080-package-qualification-20261014`, rooted at accepted main; -one serial integration owner, draft PR to main, preserve history and branch until -parent adoption. Existing checkpoint/receipts and user inference work are read-only. - -## Binding design and owners - -- `onnx-runtime-pins.json` stays the sole runtime identity authority. Full desktop - jobs explicitly stage/probe the official 1.24.2 archive, pass its directory to - RPC staging, and include its license/notices. No-inference packages retain their - exact inference-disabled backend and do not gain native runtime payloads. -- Extend `packaged_onnx_support.py` and the existing lifecycle verifier rather - than add a second harness. Use Python copying, native OS module observations, - isolated child environments and platform-correct graceful shutdown. Linux - retains mapped device/inode checks; Windows/macOS record native module paths - and current pinned file bytes with their narrower identity limits explicit. - Native source contract tests do not prove packaged model execution. -- Reuse existing artifact-plan identity checks before generating a per-artifact - SPDX package inventory for all sixteen final files, aggregate unsigned in-toto - provenance, combined accepted source/native notices, and checksums over every - other final file. `filesAnalyzed=false` is explicit for archive-level SPDX; - no exhaustive extracted-file/native transitive component SBOM is claimed. - Preserve the old Linux extracted-file helper and its historical receipts. -- Add a default-false manual `build_candidates` input and extend existing tag - job guards to this explicit build-only dispatch. No publication credentials or - tag writes; ordinary PR/main checks stay bounded. Candidate mode omits the - separate review archives/dependency probes and excluded Torch sidecar E2E; - ordinary manual/tag behavior is retained. Parent reviews the exact - SHA/dispatch before any full rehearsal. Add native untrained lifecycle execution - to the reused inference matrix, without promoting it to trained acceptance. -- Investigate exactly the documented Nomic v1.5 FP16 fixture and immutable public - source/license/file identities. The executor's first HF metadata request was - proxy-denied (403); no model bytes transferred. Do not bypass that restriction, - substitute another model or download the whole repository. A supplied fixture - receives byte hashes in its lifecycle receipt; missing authoritative material - remains visible rather than guessed. No private library scan. - -## Acceptance claims - -| ID | Observable criterion | Kind / environment / mode | Status | -| --- | --- | --- | --- | -| PK1 | Full desktop staging refuses absent/drifting official runtime and includes verified native files/notices; no-inference configuration excludes them | contract / representative source fixtures plus required-real final packages / automated | source regressions satisfied; actual final packages pending approved run | -| PK2 | The shared verifier supports each native OS module observer, isolated startup, import/load/finite embedding/unload and graceful stop; actual native results remain separately identified | system / required-real selected native target / automated | implementation and Linux contract tests satisfied; native/model results pending | -| PK3 | Sixteen exact artifact identities produce sixteen SPDX inventories, provenance subjects and final-byte checksum coverage, with closure/assurance limits explicit | release-artifact / controlled complete fixture and later real final files / automated | complete synthetic inventory satisfied; real artifact set pending | -| PK4 | Manual build-only dispatch reuses the matrix with read-only contents permissions and creates no tag/release; PR/main packaging remains off | contract / workflow analysis and focused dispatch fixtures / automated | source guard/opt-in/no-publish checks and actionlint satisfied; dispatch not executed | -| PK5 | Exact Nomic source/license/revision/weight identity, bounded download feasibility and unavailable inputs have authoritative evidence | contract / actual public upstream and executor / manual | research satisfied; trained bytes/config hashes and execution unavailable | -| PK6 | Focused Python/Node, formatting/lint, workflow validation and independent cumulative review have retained outcomes; commit/push/draft PR are concrete | integration / available local/CI and parent review / either | local checks satisfied; CI and independent parent review pending | - -## Milestone, write set and gates - -One coherent milestone: release-tool preparation, **Verifying**. Write set: -`.github/workflows/build.yml`; `scripts/release/stage-rpc.py`, -`packaged_onnx_support.py`, `verify-packaged-onnx.py`, -`verify_synthetic_packaged_onnx.py`, `write-release-metadata.py`, -`test_inference_release.py`, `test_release_metadata.py`, and focused release -workflow/packaging fixtures; `electron/package.json` and -`electron/electron-builder.no-inference.cjs` resource filters and directly -derived default/S3 attribution inventories; `RELEASING.md`; this plan directory. -Add a directly affected file only with an explicit ledger disposition before edit. -No Cargo or pnpm resolution updates. Preserve legacy verifier positional CLI and -receipt fields consumed by synthetic qualification. - -Gates: regression negatives must decide absent/drifted runtime, ambient module, -unsupported host, forced shutdown, missing/duplicate/stale artifact, incomplete -metadata/checksum, and unintended packaging dispatch. Run the focused existing -release suites and native-source tests, Ruff, Node release tests, actionlint or -available workflow checks. Retain failed attempts and platform not-run boundaries. -Use an independent parent review of the final material diff; no self-review is -called independent. Actual full matrix/trained/native model qualification may -remain pending with exact runnable procedures/owners; source fixtures cannot -close those release gates. - -## Composed-design review (applicable) - -1. Runtime pins/staging own dependency bytes; lifecycle support owns observation - and process disposal; metadata owns final-file descriptions; workflow owns - explicit dispatch. Maintainer owns acceptance/publication, parent owns run/tag - approval. Their contracts are referenced, not merged into one authority. -2. Necessary interleaving is stage/probe before native execution and final - collection before hashes. Model data never enters source/package payloads. -3. Callers provide target, verified runtime directory, binary/fixture or final - artifact directory; helpers hide OS module enumeration and metadata encoding. -4. Runtime pin updates stay with pins/staging; new supported targets touch the - artifact plan/native observer; release file additions touch the plan and its - generator consumer; dispatch policy stays in workflow and its focused check. -5. Stable values are target IDs, exact file digests and existing artifact-plan - identities. OS observation and signal details stay behind lifecycle support. -6. Each helper has independently testable/refusable inputs. Metadata cannot grant - runtime/model acceptance; workflow success cannot grant publication. -7. Deleting native support would spread platform branches across verifiers; - deleting the final metadata generator would leave sixteen partial/manual - descriptions. No registry, generic plugin, second lifecycle framework or - duplicate artifact-plan authority is introduced. -8. Inherent complexity is three native observers plus sixteen artifact identities; - existing deep helpers contain it. Retain one lifecycle path and existing - producers, not a replacement release workflow. - -## Standards, blockers and re-plan triggers - -Canonical Coding-Standards main is unchanged at `188beda1fa477d21d576c233dd8c7f4c4c267d23`. -Planning/Implementation/Verification/Oracles/Platforms/Proportionality, -Build/Release/Commit and Architecture/Dependencies/Security/Licensing apply. -No repository AGENTS.md or relevant `.agents/skills` exists. The application -standards router is unavailable; manual canonical reads confer no executable -standards certification. - -Blockers: executor HF transfer denied; Windows/macOS final package execution and -the full build-only dispatch require their actual native jobs/run approval; -independent review is parent-owned once the candidate is concrete. Replan for -new dependency resolution, production runtime/schema change, unverifiable model -authority, new permanent composition, publication permissions or artifact-plan -support expansion. Stop at preparation plus exact remaining release gates. - -[Ledger](execution-ledger.md) · [Issues](issues.md) · -[Verification receipt](reports/verification.json) · [Nomic investigation](reports/nomic-fixture.md) diff --git a/docs/plans/v080-packaging/reports/nomic-fixture.md b/docs/plans/v080-packaging/reports/nomic-fixture.md deleted file mode 100644 index 2ae5bbce8..000000000 --- a/docs/plans/v080-packaging/reports/nomic-fixture.md +++ /dev/null @@ -1,65 +0,0 @@ -# Bounded public Nomic fixture investigation - -Observed 2026-10-14. No model bytes were downloaded or executed in this task. - -## Authoritative identity - -The existing Rust optional real-fixture tests name `nomic-embed-text-v1.5` and -default to `onnx/model_fp16.onnx`. The packaged verifier uses the same layout. -The publisher's [official model card](https://huggingface.co/nomic-ai/nomic-embed-text-v1.5) -declares Apache-2.0 and documents task-prefixed inputs and Matryoshka dimensions. -Use the publisher's own repository; no third-party conversion, remote Python -model code, private model directory or unrelated model family is selected here. - -Immutable fixture revision: -[`ac6fcd72429d86ff25c17895e47a9bfcfc50c1b2`](https://huggingface.co/nomic-ai/nomic-embed-text-v1.5/tree/ac6fcd72429d86ff25c17895e47a9bfcfc50c1b2). -The publisher's [commit/pointer](https://huggingface.co/nomic-ai/nomic-embed-text-v1.5/commit/ac6fcd72429d86ff25c17895e47a9bfcfc50c1b2) -records: - -| Required file | Immutable upstream identity / observation | -| --- | --- | -| `onnx/model_fp16.onnx` | 273,859,028 bytes; SHA-256 `cf5b5a86edb00f895561803cfc04729090a958340b8ca2ad76c143f565f6bb04`; public Git-LFS pointer, not a locally computed digest | -| `tokenizer.json` | [Same revision](https://huggingface.co/nomic-ai/nomic-embed-text-v1.5/blob/ac6fcd72429d86ff25c17895e47a9bfcfc50c1b2/tokenizer.json), approximately 711 kB; local SHA-256 unavailable | -| `config.json`, `tokenizer_config.json`, `special_tokens_map.json` | Same immutable repository revision; root listing reports approximately 2.06 kB, 1.19 kB and 695 bytes. Exact transferred bytes/digests are unavailable here. The config page also returned browser HTTP 429. | - -The entire repository is approximately 2.22 GB and includes alternative weights. -Only the selected approximately 275 MB file set is relevant. No whole-repository -clone, Safetensors, quantized alternatives, vision/ASR weights, model execution -scripts or training dependencies are necessary for this fixture. - -## Feasibility and stopping condition - -The first executor request was the public HF model metadata endpoint, not a -weight request. Its HTTP proxy rejected the tunnel with **403** before any bytes -transferred. No alternate host, proxy bypass, private credentials, Git mirror, -or download retry was attempted. Public browser pages supplied the observations -above; they do not transfer a usable model into the executor. The raw API was -also unavailable through the browser. Thus bounded trained-model execution is -**unavailable in this executor**, rather than failed inference. - -On a native host with authorized HF access, fetch only those five paths from the -exact revision. Bound the weight to 273,859,028 bytes and the four small files to -a reviewed small-file budget (2 MiB each is sufficient for the observed sizes). -Verify the weight SHA-256 against the upstream pointer and record SHA-256/size -for every tokenizer/config byte before using the directory. Retain the immutable -source reference and publisher license declaration with the evidence. Do not -execute repository Python or substitute a different fixture after a refusal. - -Run the existing positional verifier against each exact extracted native RPC: - -```bash -python scripts/release/verify-packaged-onnx.py EXTRACTED_RPC NOMIC_DIRECTORY -``` - -It records the copied model/config/tokenizer hashes, import/load, 256 finite -embedding values, selected packaged native runtime, unload and clean disposal. -Its model filename is copied to `model.onnx`; compare that receipt hash with the -upstream FP16 pointer. A successful receipt is a lifecycle result for those exact -bytes, not a quality benchmark or provenance authority. Windows/macOS need their -own actual result; a Linux receipt cannot substitute. The model is test input, -not a redistributed release asset. Maintainer publication/license acceptance -remains separate; no fixture license text or model data was invented or bundled. - -The investigation stops at the verified public identity and exact transfer -blocker. Future evidence must come from an authorized transfer and actual native -execution, not more mocks or untrained graph runs. diff --git a/docs/plans/v080-packaging/reports/verification.json b/docs/plans/v080-packaging/reports/verification.json deleted file mode 100644 index b9ec61a63..000000000 --- a/docs/plans/v080-packaging/reports/verification.json +++ /dev/null @@ -1,161 +0,0 @@ -{ - "schema_version": 1, - "date": "2026-10-14", - "scope": "release-tool preparation; not full native or trained-model acceptance", - "base_commit": "055222931100eeedc43307271dbf7c504787888d", - "branch": "release/v080-package-qualification-20261014", - "candidate_commit": "The containing commit is identified in the draft PR; this record does not self-reference its own Git SHA.", - "environment": { - "system": "Linux-6.18.44-x86_64-with-glibc2.41", - "python": "3.12.14", - "repository_python_pin": "3.12.3", - "node": "v24.19.0", - "repository_node_pin": "24.15.0", - "ruff": "0.15.2", - "actionlint": "1.7.8" - }, - "checks": { - "node_release": { - "passed": 37, - "failed": 0, - "skipped": 0 - }, - "python_focused": { - "passed": 20, - "failed": 0, - "skipped": 1, - "skip": "required native Windows/macOS observer self-process test on Linux" - }, - "ruff_check": "passed scripts/release", - "ruff_format": "passed scripts/release", - "actionlint": "passed; shellcheck/pyflakes plugins disabled locally, full CI gate unchanged", - "default_s3_attribution": "passed, regenerated inventories, source notice text unchanged", - "version_alignment": "passed 0.8.0-rc.1", - "dependency_ownership": "passed", - "git_diff_check": "passed" - }, - "logs": { - "/tmp/pumas-v080-packaging-node-final.log": { - "sha256": "b294421536e68dd57840e6156ba63737f806b4de88109f09e7e5234ca7a0e344", - "bytes": 3319, - "retention": "task-local, not release assets" - }, - "/tmp/pumas-v080-packaging-python-final.log": { - "sha256": "0bee95c5adbcf3e11286ea1a65e1a1ea5f5bf5a5a2558a5222b18b01109c9c36", - "bytes": 3686, - "retention": "task-local, not release assets" - }, - "/tmp/pumas-v080-packaging-dispatch.log": { - "sha256": "bcaca246df52a2e7d3a6eb7ef4e802a9611b95cf3d525ec3a1226c20163c199a", - "bytes": 1614, - "retention": "task-local, not release assets" - }, - "/tmp/pumas-v080-packaging-actionlint.log": { - "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", - "bytes": 0, - "retention": "task-local, not release assets" - }, - "/tmp/pumas-v080-packaging-notices-default.log": { - "sha256": "b42e19964ae0229994d6d5b7f704e299d88d71f2e2bf818c0a3a8130f86c91d5", - "bytes": 84, - "retention": "task-local, not release assets" - }, - "/tmp/pumas-v080-packaging-notices-s3.log": { - "sha256": "719c689e15128b44264d76555819239179e9ac435b65a2679ea059cdba628f87", - "bytes": 79, - "retention": "task-local, not release assets" - } - }, - "preserved": { - "rust/Cargo.lock": "91fb9823de2f0346211b4f68ca400f03a628890e55dca90e0803e2dd7ad47e42", - "pnpm-lock.yaml": "78cac9b50e2f28d293420ffb8b9d57889a723669a3969b3a670dd3e6cbfdda18", - "docs/plans/v080-readiness/reports/candidate.json": "617b7fb1ec18c04274d7ad56d346d0a8e6d62b2b3358b1b1f18a139715fdb814", - "docs/plans/v080-qualification/reports/qualification.json": "12578a001da624a1a08819ae44efdcefb83a1b42f6059d9e1a1eed498345a0a6" - }, - "notice_inventory": { - "": { - "sha256": "a2b59c47a02da0fe8720aa4b6e13f3c771bc1cd7bdf47c3d24f8a44ac2d3b1ad", - "notice_sha256": "5e5e273c6d4a24563d91de8d9d349413481da992d714438d80e884d61eb13dfc" - }, - "-s3": { - "sha256": "0b61269264f6fd0cf24ab180a9f3f9fbcff3b92c39a79721359799bd32582183", - "notice_sha256": "abf171b832a35b70752979877aaab3b9ad3fdbf2e9cb2a034e2bce3a832134df" - } - }, - "native_results": { - "linux_contracts": "passed controlled file/process assertions, not trained inference", - "windows_macos_observer": "not run in Linux; registered in existing native QA", - "native_packaged_untrained": "added to reused full inference matrix; not run here", - "native_packaged_trained": "not run" - }, - "metadata": { - "controlled_fixture_artifacts": 16, - "spdx_documents": 16, - "provenance_subjects": 16, - "checksummed_final_files": 35, - "filesAnalyzed": false, - "assurance": "unsigned, unverified candidate; extracted/native component inspection separate", - "native_notice_variants": "Exact Unix LF and Windows CRLF bytes authenticated separately against all target/role pins; no notice role may be substituted or dropped." - }, - "model": { - "repository": "nomic-ai/nomic-embed-text-v1.5", - "revision": "ac6fcd72429d86ff25c17895e47a9bfcfc50c1b2", - "file": "onnx/model_fp16.onnx", - "bytes": 273859028, - "upstream_pointer_sha256": "cf5b5a86edb00f895561803cfc04729090a958340b8ca2ad76c143f565f6bb04", - "license": "Apache-2.0 publisher declaration; model not redistributed", - "local_bytes": "not obtained", - "small_file_local_hashes": "unavailable", - "executor_transfer": "metadata request denied by proxy tunnel HTTP 403; no model bytes, retry or bypass", - "report": "nomic-fixture.md" - }, - "dispatch": { - "manual_build_candidates_default": false, - "expected_source": "exact checked-out lowercase 40-character commit required", - "creates_tag": false, - "publishes_release": false, - "executed": false, - "owner": "parent reviews exact source/action first" - }, - "independent_review": { - "state": "pending", - "owner": "parent cumulative material review; self-review not independent" - }, - "ci": { - "state": "not yet observed; inspect draft PR exact-head run" - }, - "remaining_release_gates": [ - "Approved full native build-only rehearsal and artifact/user-workflow inspection", - "Reviewed trained fixture bytes and native packaged execution", - "Maintainer final notices/security/metadata acceptance", - "Separate final version alignment and parent tag/publication decision" - ], - "earlier_attempts": [ - { - "kind": "node release suite", - "passed": 32, - "failed": 1, - "disposition": "Old no-inference full-resource inheritance assertion replaced with intended exact RPC-only filter and preservation of other resources.", - "log": "/tmp/pumas-v080-packaging-node.log", - "log_sha256": "00322acb2698f72dd68cd99676589e7dcce84e2ae516facacd37fd9df8e73f78" - }, - { - "kind": "stronger native notice role check", - "passed": 18, - "failed": 1, - "skipped": 1, - "disposition": "Exposed Windows CRLF notice representations; now every target/role exact size and SHA-256 must be present in generated byte variants.", - "log": "/tmp/pumas-v080-packaging-python-windows-notice-gap.log", - "log_sha256": "4d50a8ae20dd306fc70de0abbaf6a889066a3f4e0dec6481a1589738f63c27b4" - }, - { - "kind": "Ruff setup invocation", - "result": "failed before formatting/tests due wrong working directory", - "disposition": "Corrected root invocation passed." - } - ], - "environment_recheck": { - "time": "2026-10-14T09:23:29Z", - "actual_executor": "git/date/read check succeeded after disconnect notification; focused tests then completed successfully" - } -} diff --git a/docs/plans/v080-qualification/execution-ledger.md b/docs/plans/v080-qualification/execution-ledger.md deleted file mode 100644 index 9c6d6ec73..000000000 --- a/docs/plans/v080-qualification/execution-ledger.md +++ /dev/null @@ -1,121 +0,0 @@ -# Qualification continuation ledger - -## 2026-10-14 — resumed actual state - -Original candidate and remote PR70 head remain -`df53db08e2ba224edfaf713522ddd410f7d4ac44`; the worktree was clean at resumption. -Build 38522709859 is in progress. Workflow/release and frontend/desktop jobs passed; -the remaining source/native jobs are still active. No submitted GitHub review -or inline thread exists; the separate independent report was requested. - -Fresh pnpm 10.33.0 audit: production has zero advisories; all dependencies report -one moderate sprintf-js advisory GHSA-hp3w-g68c-fv3c. The existing dependency review -already owns its build-only path and absence of a compatible minimal removal. -No lockfile or dependency update has been selected. Cargo audit tool setup and -frozen no-script dependency setup are underway; no results are assumed. - -## 2026-10-14 — CI failure, bounded fixture repair and local evidence - -Headless job 115716297437 failed exactly one unit test on df53: the worker did not -reach `pause_is_rejected_after_final_file_commit_and_during_cleanup`'s blocked -cleanup cutpoint within one second (2,069 passed, one failed, 13 ignored). -The [retained excerpt](reports/ci-df53-headless-failure.txt) names the source/run/job. -The same candidate's full Rust quality job passed. This is separate from the -earlier catalogue test, which did not reproduce locally. - -Amended the plan before changing only the cleanup test. Its fixture admission, -cutpoint and settlement waits now share a bounded ten-second budget and report -the selected cutpoint/worker stage. Both actual cleanup cutpoints, refused pause, -Downloading-before-release, Completed settlement and zero retained claims remain -asserted; no production timeout or custody semantics changed. - -- Focused no-default test passed: 1/1, 0 ignored, 0.67 seconds after compilation. -- Full no-default unit cohort run concurrently with Clippy passed 2,067 and failed - three unrelated one/three-second fixtures, with 13 ignored; 147.74 seconds. - These failures and that noncanonical resource-contention condition are retained, - not relabeled as passing or used to broaden this repair. -- Once compilation/lint finished, the unchanged full cohort passed **2,070/2,070**, - 13 ignored, in **41.56 seconds**. The three other tests needed no source changes. -- `cargo clippy --locked --offline --manifest-path rust/Cargo.toml -p pumas-library - --no-default-features --tests -- -D warnings` and Rust formatting passed. -- These local runs used pinned Rust/Cargo 1.92.0, an isolated task target, - `CARGO_INCREMENTAL=0 CARGO_PROFILE_DEV_DEBUG=0`; this changes debug metadata/cache - use, not optimization or assertion semantics. No package/model inference claim. - -## Current dependency/package observations - -Cargo audit completed with zero vulnerability entries, three maintenance notices, -and one lru unsoundness warning. The concrete S3 SDK key/access path does not expose -the warning's panicking-key/pop trigger. Current pnpm production audit has zero -advisories; its one moderate build-only sprintf-js finding retains the existing -owned disposition. [Dependency review](reports/dependency-review.md) retains raw -audits, exact notice hashes and bounded source reasoning without suppression. -Default and S3 notice inventories regenerated byte-identically (378/428 entries). - -The exact df53 Linux inference CI job 115716297315 passed native pinned ORT loader, -strict production build/archive verification, authenticated owner startup/drain, -and the real ORT/untrained-graph lifecycle. Artifact 11875745665 is 30,659,590 bytes, -GitHub ZIP SHA-256 `2dc6dd91e0f7f6258b5f7c96a433d45653190cb939eb6bad12c4c03283627a91`. -Evidence artifact 11875865202 ZIP SHA-256 is -`a51626da4d0460ffd083618ffa2461ade5126bb012044789c3490c6f92e498bf`. -These are old-candidate identities, not relabeled as the repaired source. - -GitHub connector retrieval of artifact 11875745665 succeeded as file reference -`file_00000000a08081fd9504dd4b9ca6d671`; the executor's subsequent byte transfer -was denied by its HTTP proxy tunnel (403). No ZIP bytes reached local storage, -so inner archive/binary hashes and a local replay are unavailable, not passed. -The same denial occurred for audio artifact 11874379748. No alternate host or -authorization bypass was attempted. Original CI is still running; no push has -cancelled it, and final native/model/publication gates remain explicit. - -## 2026-10-14 — terminal repair qualification and handoff - -Original Build 38522709859 completed failure: eight applicable jobs passed and -the headless fixture failure above remained its sole failing job. Its terminal -snapshot is [retained](reports/ci-df53-terminal.json). After that terminal result, -committed and pushed the scoped repair as -`aa40e155846cdac6cd94b6f5c2fd6a35cddce16e`, tree -`f016a43b50f815f77177aafec2655e763abe3aad`. - -Repair Build [38526618039](https://github.com/MrScripty/Pumas-Library/actions/runs/38526618039) -completed **success: all nine applicable jobs passed**. This includes full Rust -quality, headless no-default/HF and RPC, enabled-S3 tests/lint, frontend/desktop, -Linux inference review packaging, confined audio dependencies, and native source -QA on Linux, Windows and macOS. Tag-only package/assembly jobs were skipped. -The [final machine receipt](reports/qualification.json) retains exact job IDs, -per-command headless totals and current artifact identities. The separately -required ignored Linux kernel read-confinement test actually ran and passed. - -The exact aa40 Linux review package is artifact 11877010982, 30,659,584 bytes, -GitHub ZIP SHA-256 -`3dfdca18419edf3b1125f2ad6e6577c2d9b480caa293e3a612d979a7bbac4303`. -Its native pinned ORT loader, extraction/authenticated owner startup, untrained -256-dimensional graph execution, loaded packaged-runtime identity, unload and -graceful stop passed in CI. This establishes neither trained-model quality nor -the final sixteen-artifact matrix. No local byte transfer of this replacement -was attempted after the two earlier proxy denials; no inner hash is invented. - -Inspected Pantograph's published consumer receipt at handoff -`3649df2d3c4c718aa278e809f27cbc2a915f8c47`: actual source -`039cee079d273a8d4968df56a4b35e8eb8aacbbe` qualified Pumas df53 through public -Chrema and Candle. Its owner reports 19 integration, 598 library (2 existing -ignores), 4 HTTP tests and independent consumer review. No API repair was needed. -The df53-to-aa40 Rust diff is solely in the existing test module; the production -prefix is byte-identical. Parent decides final pin/lineage acceptance; this is -not a substituted aa40 consumer run or an independent review of all PR70 changes. -GitHub still has no submitted PR70 review or inline thread; no separate Pumas -independent diff report was supplied. - -The [decision report](reports/release-blockers.md) reduces remaining release gates -to source/review/pin acceptance, required native final artifacts, minimal trained -model/runtime execution, final-file metadata/review and aligned final version/ -parent promotion. It explicitly excludes unrelated future capability expansion. -The original candidate receipt remains unchanged; main remains ef9eead9 after -refresh. Local inference artifacts and user source work remain preserved. - -This final followup changes evidence only. Its commit may trigger a new automatic -Build; the terminal acceptance above belongs to immutable aa40, not an unobserved -later documentation head. No tag, release, model download or user migration ran. -Final mechanical checks passed: all report JSON parsed, relative Markdown links -resolved, receipt source tree/lock/earlier-receipt hashes matched, all CI jobs were -terminal with nine successes, artifact metadata bound aa40, and `git diff --check`. diff --git a/docs/plans/v080-qualification/issues.md b/docs/plans/v080-qualification/issues.md deleted file mode 100644 index 1f5ea3945..000000000 --- a/docs/plans/v080-qualification/issues.md +++ /dev/null @@ -1,11 +0,0 @@ -# Qualification issues - -| Finding | State / owner / next evidence | -| --- | --- | -| Original Build 38522709859 failed | Closed with retained terminal snapshot; eight applicable jobs passed, one fixture failed. Never relabeled green. | -| Exact-head no-default cleanup test failed at one-second cutpoint wait | Closed on aa40: bounded fixture repair, focused/full local cohort, Clippy/format and all nine applicable Build 38526618039 jobs passed. | -| Independent Pumas diff report not present on PR70 | Parent disposition remains open. Published independent Pantograph consumer review inspected for df53 only; not a PR70 diff review or aa40 pin adoption. | -| Known sprintf-js moderate advisory | Existing build-only disposition; verify current exact lock path, preserve it without suppression | -| lru 0.16.4 unsoundness notice | Reviewed exact AWS SDK cache: private String key, no panicking custom Drop or pop access. Specific advisory trigger absent; keep warning and S3-owner revisit trigger visible. | -| Artifact transfer to executor denied | GitHub connector retrieval succeeded; executor proxy tunnel denied both audio and exact df53 inference artifact file-reference transfers with 403. Local byte inspection/replay unavailable; do not substitute old artifacts or infer inner hashes. | -| Actual final package/model/platform acceptance | Exact aa40 Linux review archive passed real untrained ORT execution in CI. Final sixteen-artifact/native/trained-model/metadata gates remain parent/platform-owned; exact minimal list in reports/release-blockers.md. | diff --git a/docs/plans/v080-qualification/plan.md b/docs/plans/v080-qualification/plan.md deleted file mode 100644 index 1c69ed029..000000000 --- a/docs/plans/v080-qualification/plan.md +++ /dev/null @@ -1,99 +0,0 @@ -# v0.8 qualification continuation - -**Status:** Complete. **Acceptance:** Q1–Q4 evidence satisfied within stated scope; -final source adoption and release approval remain parent-owned. -**Current phase:** terminal qualification handoff. -**Next slice:** parent selects the source pin and completes the remaining native -artifact, trained-model, metadata and version/promotion gates in the decision report. - -## Objective and admission - -The parent's 2026-10-14 continuation explicitly starts this new plan after the -accepted preparation plan. Deliver a concrete release-blocking list with actual -CI, security, notices and package evidence. Preserve the immutable candidate -`df53db08e2ba224edfaf713522ddd410f7d4ac44`, its earlier receipt, shared history, -and the user's inference work. Do not assume errored continuations executed. -No candidate/final tag, release publication or huge model download is authorized. -Pantograph PR78 head `34dfedd27dde9a30274226e1ea26ec1e1b2de8e3` supplies a real -cross-repository untrained-CPU fixture. Its owner qualifies the Pumas candidate -separately; coordinate findings through the parent, without changing its pin. - -## Claims - -| ID | Observable result | Kind / environment / mode | State | -| --- | --- | --- | --- | -| Q1 | Build 38522709859 reaches a recorded terminal status for `df53db08`; failed applicable jobs are dispositioned | integration / required-real GitHub CI / automated | satisfied: original failed; repaired aa40 Build 38526618039 succeeded | -| Q2 | Current Cargo/pnpm audits and default/S3 notice collection have concrete results and shipped-versus-build dispositions | contract / representative Linux plus current advisory databases / automated and manual | satisfied: raw audits, exact closure triage and identical regenerated notices | -| Q3 | Available exact-source package identity, inventory, runtime and startup/inference evidence are inspected without overstating synthetic/pretrained or platform coverage | release-artifact / actual available target / automated and manual | satisfied: exact aa40 Linux review CI; local bytes unavailable | -| Q4 | Independent review is inspected, or precisely recorded unavailable; only actual remaining release blockers are handed to parent | contract / real report and source evidence / manual | satisfied: published consumer review inspected; separate Pumas diff review unavailable; final gates named | - -## Scope and decisions - -Write set: this plan directory; current `docs/release-qa-0.8.0.md` and directly -affected release-information links. Retain `v080-readiness/reports/candidate.json` -unchanged as the immutable earlier receipt. No production change is admitted -until a reproduced CI/review/security finding identifies its exact owning paths -and the relevant regression/acceptance evidence is added to this plan. - -**Admitted repair:** CI headless job 115716297437 failed only -`pause_is_rejected_after_final_file_commit_and_during_cleanup`: its real worker -did not reach the fixture's terminal-cleanup observation within one second. -The 2,069 other unit tests passed. Add only this test's bounded setup/settlement -budget and stage diagnostics in -`rust/crates/pumas-core/src/model_library/hf/download.rs`. This is a fixture -admission wait, not a product latency promise; preserve both cleanup cutpoints, -false pause admission, unchanged Downloading state until release, Completed -settlement and zero retained destination claims. Run the focused test and full -no-default core unit cohort, Rust format and affected lint when available. -Rust/Async and Verification Oracles guidance apply to the test's separate worker -runtime and blocking channel observations. No production download code, ownership -authority or schema changes are admitted. - -The existing sixteen-file artifact plan, RELEASING.md and binding support matrix -govern package claims. Native Windows/macOS and final model acceptance cannot be -inferred from Linux source tests or untrained graph execution. Installed speech -remains unavailable and is not promoted into a release prerequisite merely -because its future scope exists. Unrelated consumers need not release together. - -Reuse current release scripts and accepted dependency dispositions. Current pnpm -audit already distinguishes zero production advisories from the known moderate -build-only sprintf-js finding. Audit raw counts are not shipped exposure proof. -Use cargo-audit 0.22.2 (official crates.io package, Rust 1.88 minimum, compatible -with pinned 1.92) under task-local tool/cache roots. Frozen JS dependency setup -must not rewrite manifests or locks; skip dependency lifecycle scripts for notice -collection. No home config/credentials or user libraries are qualification inputs. - -Canonical standards read in preparation still apply. Additional reads select -Dependencies, Licensing and Security for current dependency/provenance review, -and the existing Build/Release/Verification/Platforms rules for artifact claims. -The application standards router remains unavailable; no executable certificate -is claimed. **Composed-design review:** not-applicable, because this slice uses -existing authorities/tools and changes evidence, not runtime composition. - -## Milestone and gates - -**Milestone:** qualified candidate evidence. **State:** Complete within scope. -Gate Q1–Q4: retain exact SHA/run/job/artifact identities, passed/failed/skipped and -not-run results, authoritative advisories and actual closure; inspect staged and -cumulative diffs, commit/push the coherent handoff, update draft PR70. Do not push -while its original exact-head run is active, to avoid cancelling that run. -The candidate's runtime/source identity stays pinned even if a later evidence-only -commit records its result. A source repair creates a separately named candidate. - -## Blockers, assumptions and stopping conditions - -- Both source cohorts reached terminal status. Original df53 failed one fixture; - repaired aa40 passed all nine applicable jobs. Tag-only jobs were skipped. -- GitHub has no submitted reviews or inline threads for PR70; CodeRabbit states - drafts are not auto-reviewed. The published Pantograph consumer report was - inspected; no separate PR70 diff review was supplied. Parent owns disposition. -- Package verification depends on the actual downloadable artifact and native - host compatibility. Inspect the existing CI-produced candidate first; do not - rebuild/rename a different source or treat a development binary as the package. -- Replan before a source, dependency-resolution, workflow, migration or artifact - contract change. Stop expanding when current evidence identifies the minimal - remaining pre-tag/publication gates under the accepted release policy. - -[Ledger](execution-ledger.md) · [Issues](issues.md) · -[Prior preparation](../v080-readiness/plan.md) · -[Final receipt](reports/qualification.json) · [Release gates](reports/release-blockers.md) diff --git a/docs/plans/v080-qualification/reports/cargo-audit.json b/docs/plans/v080-qualification/reports/cargo-audit.json deleted file mode 100644 index b4cd331af..000000000 --- a/docs/plans/v080-qualification/reports/cargo-audit.json +++ /dev/null @@ -1 +0,0 @@ -{"database":{"advisory-count":1310,"last-commit":"6aed84668c23d7f535077a9fe918bf1fa0f6a5bc","last-updated":"2026-10-13T17:07:33+02:00"},"lockfile":{"dependency-count":514},"settings":{"target_arch":[],"target_os":[],"severity":null,"ignore":[],"informational_warnings":["unmaintained","unsound","notice"]},"vulnerabilities":{"found":false,"count":0,"list":[]},"warnings":{"unmaintained":[{"kind":"unmaintained","package":{"name":"bincode","version":"1.3.3","source":"registry+https://github.com/rust-lang/crates.io-index","checksum":"b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad","dependencies":[{"name":"serde","version":"1.0.228","source":"registry+https://github.com/rust-lang/crates.io-index"}],"replace":null},"advisory":{"id":"RUSTSEC-2025-0141","package":"bincode","title":"Bincode is unmaintained","description":"Due to a doxxing and harassment incident, the bincode team has taken the decision to cease development permanently.\n\nThe team considers version 1.3.3 a complete version of bincode that is not in need of any updates.\n\n## Alternatives to consider\n\n* [wincode](https://crates.io/crates/wincode)\n* [postcard](https://crates.io/crates/postcard)\n* [bitcode](https://crates.io/crates/bitcode)\n* [rkyv](https://crates.io/crates/rkyv)","date":"2025-12-16","aliases":[],"related":[],"collection":"crates","categories":[],"keywords":[],"cvss":null,"informational":"unmaintained","references":[],"source":null,"url":"https://git.sr.ht/~stygianentity/bincode/tree/v3.0/item/README.md","withdrawn":null,"license":"CC0-1.0","expect-deleted":false},"affected":null,"versions":{"patched":[],"unaffected":[]}},{"kind":"unmaintained","package":{"name":"instant","version":"0.1.13","source":"registry+https://github.com/rust-lang/crates.io-index","checksum":"e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222","dependencies":[{"name":"cfg-if","version":"1.0.4","source":"registry+https://github.com/rust-lang/crates.io-index"}],"replace":null},"advisory":{"id":"RUSTSEC-2024-0384","package":"instant","title":"`instant` is unmaintained","description":"This crate is no longer maintained, and the author recommends using the maintained [`web-time`] crate instead.\n\n[`web-time`]: https://crates.io/crates/web-time","date":"2024-09-01","aliases":[],"related":[],"collection":"crates","categories":[],"keywords":[],"cvss":null,"informational":"unmaintained","references":["https://crates.io/crates/instant/0.1.13","https://github.com/sebcrozet/instant/issues/52"],"source":null,"url":null,"withdrawn":null,"license":"CC0-1.0","expect-deleted":false},"affected":null,"versions":{"patched":[],"unaffected":[]}},{"kind":"unmaintained","package":{"name":"paste","version":"1.0.15","source":"registry+https://github.com/rust-lang/crates.io-index","checksum":"57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a","replace":null},"advisory":{"id":"RUSTSEC-2024-0436","package":"paste","title":"paste - no longer maintained","description":"The creator of the crate `paste` has stated in the [`README.md`](https://github.com/dtolnay/paste/blob/master/README.md) \nthat this project is not longer maintained as well as archived the repository\n\n## Possible Alternative(s)\n\n- [`pastey`]: a fork of paste and is aimed to be a drop-in replacement with additional features for paste crate\n- [`with_builtin_macros`]: crate providing a [superset of `paste`'s functionality including general `macro_rules!` eager expansions](https://docs.rs/with_builtin_macros/0.1.0/with_builtin_macros/macro.with_eager_expansions.html) and `concat!`/`concat_idents!` macros\n\n[`pastey`]: https://crates.io/crates/pastey\n[`with_builtin_macros`]: https://crates.io/crates/with_builtin_macros","date":"2024-10-07","aliases":[],"related":[],"collection":"crates","categories":[],"keywords":[],"cvss":null,"informational":"unmaintained","references":[],"source":null,"url":"https://github.com/dtolnay/paste","withdrawn":null,"license":"CC0-1.0","expect-deleted":false},"affected":null,"versions":{"patched":[],"unaffected":[]}}],"unsound":[{"kind":"unsound","package":{"name":"lru","version":"0.16.4","source":"registry+https://github.com/rust-lang/crates.io-index","checksum":"7f66e8d5d03f609abc3a39e6f08e4164ebf1447a732906d39eb9b99b7919ef39","dependencies":[{"name":"hashbrown","version":"0.16.1","source":"registry+https://github.com/rust-lang/crates.io-index"}],"replace":null},"advisory":{"id":"RUSTSEC-2026-0253","package":"lru","title":"Potential use-after-free due to lack of panic safety in `LruCache::pop()`","description":"`LruCache::pop()` in `lru` was not panic-safe. If the `Drop` implementation of a stored key panics during `pop()`, `self.detach()` is never called, leaving dangling pointers in the internal doubly-linked list.\n\nA subsequent cache operation that triggers eviction can then dereference these dangling pointers:\n- The node is freed from the map, but remains linked in the LRU list due to the skipped `detach()` call\n- When a new insertion causes eviction, the LRU traversal encounters the dangling pointer\n- This results in a write to already-freed memory during the eviction process\n\n## Impact\n\n- **CWE-416 (Use-After-Free):** memory corruption when subsequent cache operations access freed node pointers in the linked list\n- **CWE-415 (Double Free):** potential heap corruption when the same memory is freed multiple times\n\nBoth types of undefined behavior can be invoked in safe Rust, but only if unwinding panics are enabled and `std::panic::catch_unwind` is used with key types that have potentially-panicking `Drop` implementations.\n\n## Fix\n\nFixed in `lru` 0.18.2 by detaching the node from the linked list before freeing it and dropping the key ([lru-rs#238](https://github.com/jeromefroe/lru-rs/pull/238)).","date":"2026-05-12","aliases":[],"related":[],"collection":"crates","categories":["memory-corruption"],"keywords":["panic-safety","memory-safety","use-after-free","double-free"],"cvss":null,"informational":"unsound","references":[],"source":null,"url":"https://github.com/jeromefroe/lru-rs/pull/238","withdrawn":null,"license":"CC0-1.0","expect-deleted":false},"affected":null,"versions":{"patched":[">=0.18.2"],"unaffected":[]}}]}} diff --git a/docs/plans/v080-qualification/reports/ci-df53-headless-failure.txt b/docs/plans/v080-qualification/reports/ci-df53-headless-failure.txt deleted file mode 100644 index 6fa5ad4b2..000000000 --- a/docs/plans/v080-qualification/reports/ci-df53-headless-failure.txt +++ /dev/null @@ -1,19 +0,0 @@ -Source: df53db08e2ba224edfaf713522ddd410f7d4ac44 -Build: 38522709859 -Job: 115716297437 (Headless without inference plugins) -URL: https://github.com/MrScripty/Pumas-Library/actions/runs/38522709859/job/115716297437 -Decoded log excerpt retrieved on 2026-10-14; ANSI and trailing whitespace normalized: - -2026-10-14T06:45:23.1398056Z ---- model_library::hf::download::tests::pause_is_rejected_after_final_file_commit_and_during_cleanup stdout ---- -2026-10-14T06:45:23.1398952Z -2026-10-14T06:45:23.1400136Z thread 'model_library::hf::download::tests::pause_is_rejected_after_final_file_commit_and_during_cleanup' (8208) panicked at crates/pumas-core/src/model_library/hf/download.rs:16589:18: -2026-10-14T06:45:23.1401670Z Worker must reach terminal cleanup: Timeout -2026-10-14T06:45:23.1402318Z -2026-10-14T06:45:23.1402324Z -2026-10-14T06:45:23.1402487Z failures: -2026-10-14T06:45:23.1403260Z model_library::hf::download::tests::pause_is_rejected_after_final_file_commit_and_during_cleanup -2026-10-14T06:45:23.1404069Z -2026-10-14T06:45:23.1404635Z test result: FAILED. 2069 passed; 1 failed; 13 ignored; 0 measured; 0 filtered out; finished in 79.22s -2026-10-14T06:45:23.1405425Z -2026-10-14T06:45:23.1586758Z error: test failed, to rerun pass `-p pumas-library --lib` -2026-10-14T06:45:23.2293933Z ##[error]Process completed with exit code 101. diff --git a/docs/plans/v080-qualification/reports/ci-df53-terminal.json b/docs/plans/v080-qualification/reports/ci-df53-terminal.json deleted file mode 100644 index e83b8ee6d..000000000 --- a/docs/plans/v080-qualification/reports/ci-df53-terminal.json +++ /dev/null @@ -1,187 +0,0 @@ -{ - "source_revision": "df53db08e2ba224edfaf713522ddd410f7d4ac44", - "run_id": 38522709859, - "url": "https://github.com/MrScripty/Pumas-Library/actions/runs/38522709859", - "status": "completed", - "conclusion": "failure", - "observed": "2026-10-14", - "jobs": [ - { - "id": 115716122649, - "name": "Workflow and release contracts", - "status": "completed", - "conclusion": "success" - }, - { - "id": 115716297315, - "name": "Review Linux inference candidate", - "status": "completed", - "conclusion": "success" - }, - { - "id": 115716297392, - "name": "Rust quality", - "status": "completed", - "conclusion": "success" - }, - { - "id": 115716297437, - "name": "Headless without inference plugins", - "status": "completed", - "conclusion": "failure", - "failed_steps": [ - "Run cargo test --locked --manifest-path rust/Cargo.toml -p pumas-library --no-default-features" - ] - }, - { - "id": 115716297441, - "name": "Frontend and desktop contracts", - "status": "completed", - "conclusion": "success" - }, - { - "id": 115716297465, - "name": "Torch native QA (macos-15)", - "status": "completed", - "conclusion": "success" - }, - { - "id": 115716297515, - "name": "Review confined audio dependencies", - "status": "completed", - "conclusion": "success" - }, - { - "id": 115716297522, - "name": "Torch native QA (windows-2025)", - "status": "completed", - "conclusion": "success" - }, - { - "id": 115716297562, - "name": "Torch native QA (ubuntu-24.04)", - "status": "completed", - "conclusion": "success" - }, - { - "id": 115716298865, - "name": "Torch native RPC E2E (${{ matrix.os }})", - "status": "completed", - "conclusion": "skipped" - }, - { - "id": 115716299008, - "name": "Rust release (${{ matrix.os }})", - "status": "completed", - "conclusion": "skipped" - }, - { - "id": 115716299071, - "name": "Inference headless candidate (${{ matrix.target }})", - "status": "completed", - "conclusion": "skipped" - }, - { - "id": 115716299301, - "name": "Headless archive (${{ matrix.headless_os }})", - "status": "completed", - "conclusion": "skipped" - }, - { - "id": 115718210702, - "name": "Desktop package without inference (win)", - "status": "completed", - "conclusion": "skipped" - }, - { - "id": 115718210755, - "name": "Rust release (windows-2025)", - "status": "completed", - "conclusion": "skipped" - }, - { - "id": 115718210942, - "name": "Linux release startup", - "status": "completed", - "conclusion": "skipped" - }, - { - "id": 115718211412, - "name": "Desktop package without inference (${{ matrix.platform }})", - "status": "completed", - "conclusion": "skipped" - }, - { - "id": 115718211418, - "name": "Desktop package (${{ matrix.platform }})", - "status": "completed", - "conclusion": "skipped" - }, - { - "id": 115728209246, - "name": "Assemble release candidate", - "status": "completed", - "conclusion": "skipped" - } - ], - "artifacts": [ - { - "id": 11875865202, - "name": "review-inference-evidence-linux-x86_64", - "size_in_bytes": 38521, - "url": "https://api.github.com/repos/MrScripty/Pumas-Library/actions/artifacts/11875865202", - "archive_download_url": "https://api.github.com/repos/MrScripty/Pumas-Library/actions/artifacts/11875865202/zip", - "expired": false, - "created_at": "2026-10-14T06:58:46Z", - "expires_at": "2026-10-21T06:58:45Z", - "updated_at": "2026-10-14T06:58:46Z", - "digest": "sha256:a51626da4d0460ffd083618ffa2461ade5126bb012044789c3490c6f92e498bf", - "workflow_run": { - "id": 38522709859, - "repository_id": 1118589530, - "head_repository_id": 1118589530, - "head_branch": "readiness/v080-20261014", - "head_sha": "df53db08e2ba224edfaf713522ddd410f7d4ac44" - } - }, - { - "id": 11875745665, - "name": "review-inference-linux-x86_64", - "size_in_bytes": 30659590, - "url": "https://api.github.com/repos/MrScripty/Pumas-Library/actions/artifacts/11875745665", - "archive_download_url": "https://api.github.com/repos/MrScripty/Pumas-Library/actions/artifacts/11875745665/zip", - "expired": false, - "created_at": "2026-10-14T06:58:45Z", - "expires_at": "2026-10-21T06:58:44Z", - "updated_at": "2026-10-14T06:58:45Z", - "digest": "sha256:2dc6dd91e0f7f6258b5f7c96a433d45653190cb939eb6bad12c4c03283627a91", - "workflow_run": { - "id": 38522709859, - "repository_id": 1118589530, - "head_repository_id": 1118589530, - "head_branch": "readiness/v080-20261014", - "head_sha": "df53db08e2ba224edfaf713522ddd410f7d4ac44" - } - }, - { - "id": 11874379748, - "name": "review-audio-dependency-evidence-linux", - "size_in_bytes": 14477, - "url": "https://api.github.com/repos/MrScripty/Pumas-Library/actions/artifacts/11874379748", - "archive_download_url": "https://api.github.com/repos/MrScripty/Pumas-Library/actions/artifacts/11874379748/zip", - "expired": false, - "created_at": "2026-10-14T06:48:05Z", - "expires_at": "2026-10-21T06:48:04Z", - "updated_at": "2026-10-14T06:48:05Z", - "digest": "sha256:effe0e880f823f305e59baad54cc450a220e9897273dd5c4a7baacb835113e9c", - "workflow_run": { - "id": 38522709859, - "repository_id": 1118589530, - "head_repository_id": 1118589530, - "head_branch": "readiness/v080-20261014", - "head_sha": "df53db08e2ba224edfaf713522ddd410f7d4ac44" - } - } - ], - "qualification_limit": "Native source/Torch tests and Linux untrained inference package job passed; no final release matrix or trained-model acceptance." -} diff --git a/docs/plans/v080-qualification/reports/dependency-review.md b/docs/plans/v080-qualification/reports/dependency-review.md deleted file mode 100644 index 7d94b047e..000000000 --- a/docs/plans/v080-qualification/reports/dependency-review.md +++ /dev/null @@ -1,79 +0,0 @@ -# Current locked dependency and notice qualification - -Candidate: `df53db08e2ba224edfaf713522ddd410f7d4ac44`, version 0.8.0-rc.1. -Inspection date: 2026-10-14. The cleanup-fixture repair changes no dependency -manifest, lockfile or notice input. This review concerns the current closure, -not a claim that a clean scanner proves the complete artifact secure. - -## Cargo - -`cargo-audit 0.22.2 audit --file rust/Cargo.lock --db -/tmp/pumas-v080-advisory-db --json` exited 0. Official advisory database commit -`6aed84668c23d7f535077a9fe918bf1fa0f6a5bc`, updated 2026-10-13, contains -1,310 advisories; the lockfile contains 514 packages. The -[raw result](cargo-audit.json) reports **zero vulnerability entries**, three -maintenance notices and one unsoundness notice. No ignore/suppression was used. - -| Notice | Actual locked consumer and disposition | -| --- | --- | -| `bincode 1.3.3`, RUSTSEC-2025-0141 | UniFFI macro/build tooling; existing maintenance follow-up, not a new security exploit finding. Host bindings still have no accepted release tuple. | -| `instant 0.1.13`, RUSTSEC-2024-0384 | notify-types → notify → core; retain the maintenance follow-up with the filesystem-watcher owner. | -| `paste 1.0.15`, RUSTSEC-2024-0436 | Macro dependency through tokenizers and UniFFI tooling; retain existing maintenance tracking. | -| `lru 0.16.4`, [RUSTSEC-2026-0253](https://rustsec.org/advisories/RUSTSEC-2026-0253.html) | Present in the S3 shipping closure only through aws-sdk-s3 1.137.0. The advisory's specific panic-safety trigger is absent from the inspected consumer; see below. | - -The lru advisory concerns `pop()`: a stored key's destructor panics before the -node is detached, then a later cache operation follows a dangling pointer. It -requires unwinding/catching that panic and a potentially panicking key destructor. -The locked SDK's sole LruCache owner is `S3ExpressIdentityCache`, whose private -`CacheKey(String)` has derived traits and no custom Drop. Its operational access -is `get_or_insert_mut`; it exposes no caller-supplied key implementation or `pop` -call. A plain String key cannot supply the required panicking custom destructor. -This source observation disposes the current trigger; it does not repair or -declare the upstream generic container sound. - -Inspected official crate member: -`aws-sdk-s3-1.137.0/src/s3_express.rs`, SHA-256 -`033da02f9bc2ae4f74fbd5393503cf770fd5a19b53c3565af2a72c862e29749d`. -`cargo tree --locked --offline --manifest-path rust/Cargo.toml -p pumas-rpc ---no-default-features --features s3 -i lru --edges normal,build --prefix none` -establishes the actual S3 path. Keep the raw warning visible. The S3 dependency -owner must revisit on SDK/key/cache use changes or an accepted compatible upstream -upgrade; no forced incompatible lru override is part of this release slice. - -## JavaScript - -Fresh pnpm 10.33.0 audits used the unchanged frozen lockfile: - -- [Production audit](pnpm-audit-production.json): zero advisories, exit 0. -- [All-dependency audit](pnpm-audit-all.json): one moderate advisory, exit 1, - [GHSA-hp3w-g68c-fv3c](https://github.com/advisories/GHSA-hp3w-g68c-fv3c), - sprintf-js 1.1.3; no patched version reported. - -The current path remains `electron-builder → app-builder-lib → @electron/get → -global-agent → roarr → sprintf-js`. This is build tooling, absent from the -production audit closure. The existing [dependency decision](../../../dependency-review-0.7.0.md) -retains that risk pending a compatible parent/upstream removal. This continuation -adds no suppression and no major dependency replacement. GitHub's generic -52-alert push notice is not substituted for these exact-lock results or treated -as 52 confirmed shipped vulnerabilities. - -## Notices and license inventory - -Frozen pnpm installation used `--ignore-scripts` and task-owned data/cache/store -paths. The first default-home attempt failed before installation; no home access -or lockfile rewrite was used. `cargo fetch --locked` supplied missing target crate -sources before the existing generator could run offline. - -Regenerated into disposable output directories using -`python3 scripts/release/generate-notices.py --output DIR` and its `--features s3` -variant. Both notice text and inventory are **byte-identical** to the checked-in -versioned collections: - -| Collection | Entries | Notice SHA-256 | Inventory SHA-256 | -| --- | --- | --- | --- | -| Default | 378 | `5e5e273c6d4a24563d91de8d9d349413481da992d714438d80e884d61eb13dfc` | `ed9af5ce215f4d1d7a4f868bcd00e1d2ca14945addbe759911ee2cbddcc28d60` | -| S3 | 428 | `abf171b832a35b70752979877aaab3b9ad3fdbf2e9cb2a034e2bce3a832134df` | `a4ff1463884e0e891143db7e3868afdcacce4569da97796ae2bb3fd9bf499501` | - -This checks authoritative collected text, closure and freshness under the existing -license policy. Final per-artifact inclusion, native dependency coverage, SBOM, -provenance and final-byte checksums remain artifact-specific release gates. diff --git a/docs/plans/v080-qualification/reports/pnpm-audit-all.json b/docs/plans/v080-qualification/reports/pnpm-audit-all.json deleted file mode 100644 index 6fac15b22..000000000 --- a/docs/plans/v080-qualification/reports/pnpm-audit-all.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "actions": [], - "advisories": { - "1241202": { - "findings": [ - { - "version": "1.1.3", - "paths": [ - "electron>electron-builder>app-builder-lib>@electron/get>global-agent>roarr>sprintf-js" - ] - } - ], - "found_by": null, - "deleted": null, - "references": "- https://nvd.nist.gov/vuln/detail/CVE-2026-97058\n- https://github.com/alexei/sprintf.js/issues/237\n- https://github.com/alexei/sprintf.js/blob/3a0d8c26d291b5bd9f1974877ecc50739921d6f5/src/sprintf.js#L17\n- https://github.com/alexei/sprintf.js/blob/3a0d8c26d291b5bd9f1974877ecc50739921d6f5/src/sprintf.js#L84-L90\n- https://www.vulncheck.com/advisories/sprintf-js-through-1.1.3-denial-of-service-via-unbounded-precision\n- https://github.com/advisories/GHSA-hp3w-g68c-fv3c", - "created": "2026-09-24T15:31:31.000Z", - "id": 1241202, - "npm_advisory_id": null, - "overview": "sprintf-js through 1.1.3 passes unbounded precision specifiers to toFixed, toExponential, and toPrecision methods without validation, causing uncaught RangeError exceptions. Attackers who control format strings can inject precision values exceeding ECMAScript limits to abort calling operations with minimal payload.", - "reported_by": null, - "title": "sprintf-js vulnerable to denial of service through unbounded precision specifiers", - "metadata": null, - "cves": [ - "CVE-2026-97058" - ], - "access": "public", - "severity": "moderate", - "module_name": "sprintf-js", - "vulnerable_versions": "<=1.1.3", - "github_advisory_id": "GHSA-hp3w-g68c-fv3c", - "recommendation": "None", - "patched_versions": "<0.0.0", - "updated": "2026-10-05T23:47:35.000Z", - "cvss": { - "score": 5.3, - "vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L" - }, - "cwe": [ - "CWE-1284" - ], - "url": "https://github.com/advisories/GHSA-hp3w-g68c-fv3c" - } - }, - "muted": [], - "metadata": { - "vulnerabilities": { - "info": 0, - "low": 0, - "moderate": 1, - "high": 0, - "critical": 0 - }, - "dependencies": 707, - "devDependencies": 0, - "optionalDependencies": 0, - "totalDependencies": 707 - } -} diff --git a/docs/plans/v080-qualification/reports/pnpm-audit-production.json b/docs/plans/v080-qualification/reports/pnpm-audit-production.json deleted file mode 100644 index 3db564c75..000000000 --- a/docs/plans/v080-qualification/reports/pnpm-audit-production.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "actions": [], - "advisories": {}, - "muted": [], - "metadata": { - "vulnerabilities": { - "info": 0, - "low": 0, - "moderate": 0, - "high": 0, - "critical": 0 - }, - "dependencies": 24, - "devDependencies": 0, - "optionalDependencies": 0, - "totalDependencies": 24 - } -} diff --git a/docs/plans/v080-qualification/reports/qualification.json b/docs/plans/v080-qualification/reports/qualification.json deleted file mode 100644 index 4fdc75f62..000000000 --- a/docs/plans/v080-qualification/reports/qualification.json +++ /dev/null @@ -1,341 +0,0 @@ -{ - "schema_version": 1, - "date": "2026-10-14", - "repository": "MrScripty/Pumas-Library", - "source": { - "qualified_commit": "aa40e155846cdac6cd94b6f5c2fd6a35cddce16e", - "tree": "f016a43b50f815f77177aafec2655e763abe3aad", - "base_main": "ef9eead9fe6595f5b3152ef8df19c5dace30190b", - "version": "0.8.0-rc.1", - "branch": "readiness/v080-20261014", - "draft_pr": "https://github.com/MrScripty/Pumas-Library/pull/70", - "evidence_commit": "This receipt is recorded in a subsequent documentation-only commit; qualified code identity remains the commit above.", - "locks": { - "rust_sha256": "91fb9823de2f0346211b4f68ca400f03a628890e55dca90e0803e2dd7ad47e42", - "pnpm_sha256": "78cac9b50e2f28d293420ffb8b9d57889a723669a3969b3a670dd3e6cbfdda18" - } - }, - "lineage": { - "original_commit": "df53db08e2ba224edfaf713522ddd410f7d4ac44", - "rust_change": "Only pause_is_rejected_after_final_file_commit_and_during_cleanup inside the existing cfg(test) module of model_library/hf/download.rs; bounded fixture readiness/settlement and diagnostics.", - "unchanged_production_prefix_bytes": 284377, - "unchanged_production_prefix_sha256": "1cdc30e4f30b2f41104ee153bd63f9be7709aebd832084f33be109bee095d5d8", - "production_api_schema_dependencies_changed": false, - "earlier_receipt": "../../v080-readiness/reports/candidate.json", - "earlier_receipt_sha256": "617b7fb1ec18c04274d7ad56d346d0a8e6d62b2b3358b1b1f18a139715fdb814" - }, - "ci": { - "run_id": 38526618039, - "run_number": 574, - "url": "https://github.com/MrScripty/Pumas-Library/actions/runs/38526618039", - "status": "completed", - "conclusion": "success", - "applicable_jobs_passed": 9, - "jobs": [ - { - "id": 115728372231, - "name": "Workflow and release contracts", - "status": "completed", - "conclusion": "success" - }, - { - "id": 115728538912, - "name": "Headless without inference plugins", - "status": "completed", - "conclusion": "success" - }, - { - "id": 115728538931, - "name": "Frontend and desktop contracts", - "status": "completed", - "conclusion": "success" - }, - { - "id": 115728538932, - "name": "Rust quality", - "status": "completed", - "conclusion": "success" - }, - { - "id": 115728538975, - "name": "Review Linux inference candidate", - "status": "completed", - "conclusion": "success" - }, - { - "id": 115728538977, - "name": "Review confined audio dependencies", - "status": "completed", - "conclusion": "success" - }, - { - "id": 115728538999, - "name": "Torch native QA (windows-2025)", - "status": "completed", - "conclusion": "success" - }, - { - "id": 115728539123, - "name": "Torch native QA (ubuntu-24.04)", - "status": "completed", - "conclusion": "success" - }, - { - "id": 115728539127, - "name": "Torch native QA (macos-15)", - "status": "completed", - "conclusion": "success" - }, - { - "id": 115728540414, - "name": "Torch native RPC E2E (${{ matrix.os }})", - "status": "completed", - "conclusion": "skipped" - }, - { - "id": 115728540645, - "name": "Inference headless candidate (${{ matrix.target }})", - "status": "completed", - "conclusion": "skipped" - }, - { - "id": 115728541011, - "name": "Headless archive (${{ matrix.headless_os }})", - "status": "completed", - "conclusion": "skipped" - }, - { - "id": 115728541119, - "name": "Rust release (${{ matrix.os }})", - "status": "completed", - "conclusion": "skipped" - }, - { - "id": 115730622921, - "name": "Desktop package without inference (win)", - "status": "completed", - "conclusion": "skipped" - }, - { - "id": 115730623293, - "name": "Desktop package (${{ matrix.platform }})", - "status": "completed", - "conclusion": "skipped" - }, - { - "id": 115730623420, - "name": "Rust release (windows-2025)", - "status": "completed", - "conclusion": "skipped" - }, - { - "id": 115730623574, - "name": "Linux release startup", - "status": "completed", - "conclusion": "skipped" - }, - { - "id": 115730623753, - "name": "Desktop package without inference (${{ matrix.platform }})", - "status": "completed", - "conclusion": "skipped" - }, - { - "id": 115741444416, - "name": "Assemble release candidate", - "status": "completed", - "conclusion": "skipped" - } - ], - "headless_command_totals": { - "cargo test --locked --offline --manifest-path rust/Cargo.toml -p pumas-library --no-default-features --features s3 --test s3_reader --test s3_acquisition -- --test-threads=1": { - "passed": 58, - "failed": 0, - "ignored": 0 - }, - "cargo test --locked --offline --manifest-path rust/Cargo.toml -p pumas-library --no-default-features --features s3 --lib acquisition::s3:: -- --test-threads=1": { - "passed": 43, - "failed": 0, - "ignored": 2 - }, - "cargo test --locked --manifest-path rust/Cargo.toml -p pumas-library --no-default-features": { - "passed": 2294, - "failed": 0, - "ignored": 29 - }, - "cargo test --locked --manifest-path rust/Cargo.toml -p pumas-library --no-default-features platform::audio_read_boundary::tests::kernel_exec_denies_unselected_reads_and_ambient_descriptors -- --ignored --exact --nocapture": { - "passed": 1, - "failed": 0, - "ignored": 0 - }, - "cargo test --locked --manifest-path rust/Cargo.toml -p pumas-library --no-default-features --features hf-client": { - "passed": 2294, - "failed": 0, - "ignored": 29 - }, - "cargo test --locked --manifest-path rust/Cargo.toml -p pumas-rpc --no-default-features": { - "passed": 257, - "failed": 0, - "ignored": 13 - } - }, - "original_run": { - "run_id": 38522709859, - "status": "completed", - "conclusion": "failure", - "applicable_jobs_passed": 8, - "failing_job": 115716297437, - "failed_test": "pause_is_rejected_after_final_file_commit_and_during_cleanup", - "evidence": "ci-df53-terminal.json" - } - }, - "local_repair": { - "toolchain": "Rust/Cargo 1.92.0; Linux x86_64", - "environment": "CARGO_INCREMENTAL=0 CARGO_PROFILE_DEV_DEBUG=0 CARGO_TARGET_DIR=/tmp/pumas-v080-qualification-target", - "focused": { - "passed": 1, - "ignored": 0, - "seconds": 0.67 - }, - "full_units_sequential": { - "passed": 2070, - "failed": 0, - "ignored": 13, - "seconds": 41.56 - }, - "earlier_contended_run": { - "passed": 2067, - "failed": 3, - "ignored": 13, - "seconds": 147.74, - "disposition": "Ran concurrently with compilation/Clippy; three unrelated bounded fixtures timed out. Unchanged sequential cohort passed; no edits to those tests." - }, - "clippy": "passed: cargo clippy --locked --offline --manifest-path rust/Cargo.toml -p pumas-library --no-default-features --tests -- -D warnings", - "rustfmt": "passed" - }, - "security": { - "cargo_audit_version": "0.22.2", - "advisory_database_commit": "6aed84668c23d7f535077a9fe918bf1fa0f6a5bc", - "cargo_lock_packages": 514, - "cargo_vulnerability_entries": 0, - "cargo_maintenance_notices": 3, - "cargo_unsoundness_notices": 1, - "lru_disposition": "RUSTSEC-2026-0253 retained. Shipping consumer AWS SDK S3 1.137.0 uses private CacheKey(String), no custom panicking Drop or pop access; inspected trigger absent, revisit on consumer change.", - "pnpm_production_advisories": 0, - "pnpm_all_advisories": { - "moderate": 1, - "advisory": "GHSA-hp3w-g68c-fv3c", - "package": "sprintf-js 1.1.3", - "disposition": "Existing build-only electron-builder dependency path; no suppression or major override." - }, - "review": "dependency-review.md", - "raw": [ - "cargo-audit.json", - "pnpm-audit-production.json", - "pnpm-audit-all.json" - ], - "notices": { - "default_entries": 378, - "s3_entries": 428, - "text_and_inventory_regenerated_byte_identically": true - } - }, - "artifacts": { - "source": "Authenticated GitHub workflow metadata; hashes cover outer ZIP files.", - "items": [ - { - "id": 11877010982, - "name": "review-inference-linux-x86_64", - "size_in_bytes": 30659584, - "github_zip_digest": "sha256:3dfdca18419edf3b1125f2ad6e6577c2d9b480caa293e3a612d979a7bbac4303", - "expires_at": "2026-10-21T07:26:29Z", - "source_revision": "aa40e155846cdac6cd94b6f5c2fd6a35cddce16e" - }, - { - "id": 11876891933, - "name": "review-inference-evidence-linux-x86_64", - "size_in_bytes": 35263, - "github_zip_digest": "sha256:f321f82c812a3853be83dd87a03f29f52d93b7e016ad1d422ded7dfeb91b741c", - "expires_at": "2026-10-21T07:26:31Z", - "source_revision": "aa40e155846cdac6cd94b6f5c2fd6a35cddce16e" - }, - { - "id": 11876861099, - "name": "review-audio-dependency-evidence-linux", - "size_in_bytes": 10686, - "github_zip_digest": "sha256:979d4b4928074b2734808b43a66fc70000d2258b23c3d24e1c5b10e2de4ccea3", - "expires_at": "2026-10-21T07:21:57Z", - "source_revision": "aa40e155846cdac6cd94b6f5c2fd6a35cddce16e" - } - ], - "ci_execution": "Exact-source optimized Linux inference archive, pinned official CPU ORT 1.24.2 native loader/API24, extraction/inventory, authenticated startup, actual untrained ONNX import/load/finite 256-dimensional embeddings/unload/packaged-runtime identity/graceful stop passed.", - "audio_scope": "Frozen dependency imports and CPU operation plus three controlled lifecycle tests; production_available=false, child_tree_drained=true; no ASR acceptance.", - "local_bytes": { - "status": "unavailable", - "attempted_artifacts": [ - 11875745665, - 11874379748 - ], - "connector_retrieval": "succeeded", - "executor_transfer": "denied by HTTP proxy tunnel 403; no bytes received", - "bypass_attempted": false, - "inner_archive_and_binary_hashes": null, - "local_replay": "not_run", - "current_aa40_byte_transfer": "not attempted after identical df53 transfer denials" - } - }, - "consumer": { - "receipt": "https://github.com/MrScripty/Pantograph/blob/3649df2d3c4c718aa278e809f27cbc2a915f8c47/docs/plans/pumas-pr70-cpu-consumer/reports/consumer-compatibility.md", - "pantograph_source": "039cee079d273a8d4968df56a4b35e8eb8aacbbe", - "handoff": "3649df2d3c4c718aa278e809f27cbc2a915f8c47", - "pumas_pin": "df53db08e2ba224edfaf713522ddd410f7d4ac44", - "chrema": "508c8b8cb724b49c655dab8bc4c8336190e516c7", - "candle": "88ed7911de9e88196b1f55b199145d22647f415e", - "owner_reported_tests": { - "integration": 19, - "library_passed": 598, - "library_existing_ignored": 2, - "http": 4 - }, - "independent_consumer_review": "accepted; actual public Chrema/Pumas untrained CPU composition", - "scope": "Published owner evidence, not rerun here; does not silently accept aa40 pin or hosted/pretrained scopes." - }, - "review": { - "github_reviews": 0, - "github_inline_threads": 0, - "independent_pumas_diff_report": "not supplied", - "consumer_report_inspected": true, - "final_source_acceptance_owner": "parent" - }, - "remaining_release_gates": [ - "Parent accepts source/review and actual consumer pin or explicit lineage disposition.", - "Ten desktop and six headless final native artifacts and required extraction/install/start/recovery/termination qualification.", - "Reviewed trained model/tokenizer fixture and real packaged-runtime inference on required Linux/Windows/macOS inference targets.", - "Final-file licenses/notices, per-artifact SPDX, aggregate in-toto provenance/checksums and maintainer review.", - "Separate aligned 0.8.0 version commit, affected verification/rebuild and parent promotion decision." - ], - "not_run": [ - "trained/pretrained model inference", - "GPU/hardware inference qualification", - "Windows/macOS final packaged model execution", - "sixteen-file final artifact set and final-file metadata", - "live AWS/non-AWS/MinIO provider qualification", - "user library migration", - "tag or release publication" - ], - "migration": { - "authority": "../../../library-upgrade.md", - "schema": 7, - "mode": "explicit offline conversion with all readers/writers stopped and exact metadata-only backup", - "automatic_downgrade": false, - "user_models_touched": false - }, - "promotion": { - "executed": false, - "owner": "parent/maintainer", - "source_pin_requires_tag": false, - "final_tag": "v0.8.0 only after separate aligned final-version commit and all accepted pre-tag QA; exact SHA selected by parent", - "candidate_tag": "v0.8.0-rc.1 only if parent selects the current prerelease cohort after its required gates" - }, - "decision_report": "release-blockers.md" -} diff --git a/docs/plans/v080-qualification/reports/release-blockers.md b/docs/plans/v080-qualification/reports/release-blockers.md deleted file mode 100644 index db9c5573b..000000000 --- a/docs/plans/v080-qualification/reports/release-blockers.md +++ /dev/null @@ -1,103 +0,0 @@ -# Release decision for the v0.8 source cohort - -Status: source CI qualified; release remains blocked. Original Build 38522709859 -is terminal failure (eight applicable jobs passed; headless failed its one-second -fixture cutpoint). Repair Build -[38526618039](https://github.com/MrScripty/Pumas-Library/actions/runs/38526618039) -completed successfully on aa40: all nine applicable jobs passed. Tag-only package -and assembly jobs were skipped. [The final receipt](qualification.json) binds -source, jobs and artifacts. No tag or publication decision is made here. - -## Source and evidence identities - -- Original reviewed candidate: `df53db08e2ba224edfaf713522ddd410f7d4ac44`. -- Bounded cleanup-fixture repair: `aa40e155846cdac6cd94b6f5c2fd6a35cddce16e`. - Only test code and qualification records changed; no production timeout, - public API, persisted schema, dependency pin or inference policy changed. -- Pantograph's separate [consumer receipt](https://github.com/MrScripty/Pantograph/blob/3649df2d3c4c718aa278e809f27cbc2a915f8c47/docs/plans/pumas-pr70-cpu-consumer/reports/consumer-compatibility.md) - accepts the bounded local CPU edge on source - `039cee079d273a8d4968df56a4b35e8eb8aacbbe` with Pumas df53, public Chrema - `508c8b8cb724b49c655dab8bc4c8336190e516c7` and Candle - `88ed7911de9e88196b1f55b199145d22647f415e`. Handoff commit is - `3649df2d3c4c718aa278e809f27cbc2a915f8c47`. Nineteen integration contracts, - 598 library tests (2 existing ignores), 4 HTTP contracts and independent - consumer review passed; no API repair was needed. The original PR78 baseline - still pins aa1d79ae. These are the consumer owner's published observations, - not tests rerun in this executor or acceptance against aa40. - -The only Rust-file change from df53 to aa40 is inside the existing `cfg(test)` -module of `hf/download.rs`. Its 284,377-byte prefix before that module is -identical, SHA-256 `1cdc30e4f30b2f41104ee153bd63f9be7709aebd832084f33be109bee095d5d8`; -no other Rust path changed. This is reviewed source lineage, not a claim of -byte-identical binaries or automatic transfer of an independently pinned receipt. - -## Concrete remaining gates - -| Gate | Current obstruction | Exact completion evidence / owner | -| --- | --- | --- | -| Final source review and actual consumer pin adoption | Independent consumer review accepted the df53 edge. The aa40 repair is test-only, but final pin adoption/lineage acceptance is parent-owned. No separate PR70 independent diff review has been supplied or submitted on GitHub. | Parent accepts the final source/evidence, maps the df53 consumer receipt to the selected pin or requests its locked rerun, and dispositions the referenced review report with its actual SHA/scope. This requires no new Chrema SDK or unrelated repository release. | -| Required native artifact set and workflows | The exact aa40 Linux inference review archive passed its native job. Tag-only desktop, no-inference and three-target inference publication jobs are skipped on PRs. A source-quality pass is not the sixteen-file candidate. | Produce the accepted source/version's ten desktop installers and six headless archives. Apply RELEASING.md's exact extraction, native install/start, desktop/root-recovery and termination procedures on Linux x86_64, Windows x86_64 and macOS ARM64. Retain exact source/target/features/artifact hashes. Parent/native platform owners own this gate; this task does not authorize a tag to bypass pre-tag QA. | -| Required trained model and native-runtime execution | Linux review proves import/load/finite 256-dimensional execution/unload/graceful stop of an untrained graph through pinned ORT. No reviewed trained Nomic model/tokenizer fixture was provided here. Native Windows/macOS packaged model execution is absent. | Supply one exact reviewed trained model/tokenizer fixture and retain its hashes. Run `verify-packaged-onnx.py EXTRACTED_RPC NOMIC_DIRECTORY` on Linux with packaged CPU ORT 1.24.2; on Windows/macOS retain equivalent native request, loaded packaged-runtime identity, finite inference, unload and graceful-stop evidence. The artifact plan requires this on each inference target. This does not require enabling production speech or testing every future model. | -| Final-file release metadata and maintainer review | Current source default/S3 notices regenerate byte-identically and current audits are triaged, but no final sixteen-artifact set exists from which to produce complete metadata. | On the actual final files, verify embedded license/notices, generate each SPDX inventory, aggregate in-toto provenance and SHA-256 checksums over all other final files. Maintainer accepts the notices/current vulnerability results against the shipped closure. Source inventories alone do not satisfy final-file coverage. | -| Final 0.8.0 identity and promotion | Current manifests remain 0.8.0-rc.1; they cannot be tagged v0.8.0. | Parent selects the compatible checkpoint, aligns final manifests/workspace lock entries and versioned notices without incidental dependency resolution, reruns affected checks and rebuilds final artifacts. Only then can the parent authorize the exact final tag and later publication. | - -These gates follow `scripts/release/artifact-plan.json`, RELEASING.md and the -current binding support matrix. Unrelated repository releases, new SDKs, installed -production speech, custom Torch assembly, download-location reconciliation and -other proposed features are not added to the blocking list. Tuldok trained vision -acceptance is required for a demo that promises it; it is not a dependency of -Pantograph's untrained CPU source demonstration. -The acquisition plan's AQ-HTTP/AQ-S3/AQ-COMPLETE gates still own their named runtime, -provider and full-plan claims. Current controlled S3 protocol tests do not accept -live AWS/non-AWS/MinIO combinations. Those broader claims are not introduced as -hidden prerequisites for the local, zero-acquisition-byte CPU source edge. - -## Closed or bounded findings - -- Repair Build 38526618039 passed all nine applicable jobs, including native - Linux/Windows/macOS source QA, Rust quality, frontend/desktop, actual Linux - inference packaging and confined audio dependencies. Its no-default and HF - core cohorts each passed 2,294 tests with 29 ignored; RPC passed 257 with 13 - ignored. The required ignored Linux kernel read-confinement proof was separately - executed and passed. Enabled S3 reader/acquisition tests passed 58, signing/prefix - tests passed 43 with 2 ignored, and S3 warning-deny lint passed. Zero-test - feature-gated targets do not qualify disabled features. -- Earlier catalogue timing failure did not reproduce in the complete local - no-default core cohort; retain its evidence boundary rather than resurrecting it. -- Fresh Cargo audit: zero vulnerability entries, three maintenance notices, one - lru unsoundness notice whose trigger is absent from the exact SDK key/access - path. Fresh pnpm production audit: zero advisories. The one moderate build-only - sprintf-js advisory retains its existing disposition, without suppression. - See [the dependency review](dependency-review.md). -- Default/S3 notice text and inventories regenerated identically: 378/428 entries. -- Schema-7 migration remains explicit and offline, with all readers/writers - stopped and an exact metadata-only backup. It provides no automatic downgrade, - model backup or dead-PID claim deletion. No user library was migrated here. - -## Executor limitation separate from product failures - -GitHub successfully retrieved audio artifact 11874379748 and exact df53 Linux -inference artifact 11875745665 into file references. This executor's HTTP proxy -denied both subsequent byte transfers with tunnel 403; no ZIP bytes were received -locally and no alternate host/authorization bypass was attempted. Local extraction, -inner-archive/binary hashes and local replay remain unavailable. The source-bound -successful CI package job and GitHub ZIP identities remain usable scoped evidence. -Current repaired-source artifacts from Build 38526618039 are: - -| Artifact | Bytes | GitHub ZIP SHA-256 | -| --- | --- | --- | -| `review-inference-linux-x86_64`, 11877010982 | 30,659,584 | `3dfdca18419edf3b1125f2ad6e6577c2d9b480caa293e3a612d979a7bbac4303` | -| `review-inference-evidence-linux-x86_64`, 11876891933 | 35,263 | `f321f82c812a3853be83dd87a03f29f52d93b7e016ad1d422ded7dfeb91b741c` | -| `review-audio-dependency-evidence-linux`, 11876861099 | 10,686 | `979d4b4928074b2734808b43a66fc70000d2258b23c3d24e1c5b10e2de4ccea3` | - -Earlier df53 artifacts remain separately identified: - -| Artifact | Bytes | GitHub ZIP SHA-256 | -| --- | --- | --- | -| `review-inference-linux-x86_64`, 11875745665 | 30,659,590 | `2dc6dd91e0f7f6258b5f7c96a433d45653190cb939eb6bad12c4c03283627a91` | -| `review-inference-evidence-linux-x86_64`, 11875865202 | 38,521 | `a51626da4d0460ffd083618ffa2461ade5126bb012044789c3490c6f92e498bf` | -| `review-audio-dependency-evidence-linux`, 11874379748 | 14,477 | `effe0e880f823f305e59baad54cc450a220e9897273dd5c4a7baacb835113e9c` | - -These GitHub-reported ZIP hashes identify workflow artifacts, not the contained -tarball, native binary or final release inventory. Their seven-day retention ends -2026-10-21; preserve required release evidence through the parent-approved path. diff --git a/docs/plans/v080-readiness/execution-ledger.md b/docs/plans/v080-readiness/execution-ledger.md deleted file mode 100644 index 33bdc79da..000000000 --- a/docs/plans/v080-readiness/execution-ledger.md +++ /dev/null @@ -1,80 +0,0 @@ -# Checkpoint execution ledger - -## 2026-10-14 — preparation - -- Original worktree was clean on `work` at `0dd38c70`. Fetched `origin/main` - and created task branch at `ef9eead9`; old refs and local inference work remain - untouched. No model, native runtime or user library was accessed. -- Connected GitHub search found no open Pumas PRs. PR #69 is merged; its head - `036bed9c` records successful Build 38247599905 and CodeQL 38247594558. - Those are historical author/CI records, not this executor's validation. -- Local `gh` read API requests returned Forbidden. Connected GitHub reads work; - Git fetch succeeds. Push/PR outcomes will be recorded separately. -- Plan admitted before implementation; existing headless and release-script - checks started against current source. Results pending. - -## 2026-10-14 — current baseline and launcher fixture repair - -- Complete no-default core run passed: 2,070 unit tests, 218 integration tests, - 6 doctests; 29 ignored entries, including top-level subprocess helpers and - examples. Catalogue recovery passed 7 tests with one child helper ignored at - top level. No earlier catalogue timing failure reproduced. S3 feature-gated - integration targets have zero tests in this configuration. -- Release Node suite passed 33/33; version alignment at rc.1, dependency ownership, - default/S3 attribution and Rust formatting passed. Node 24.19.0 and Python - 3.12.14 differ from repository patch pins; Rust/Cargo is the pinned 1.92.0. -- Launcher initially passed 47 and failed 2: immediate Node startup took 146 ms - against a 100 ms minimum; terminated PID 6421 remained state Z under PID 1. - Amended the plan before editing the fixture, retained actual process-group - termination and force/close checks, gave the early-exit fixture startup margin, - and observed Linux process state. Corrected complete suite passed 49/49. -- RPC first attempt stopped before tests because CMake was unavailable. CMake - 3.31.6 was installed under `/tmp/pumas-v080-cmake`; the retry uses that binary - and task-owned XDG configuration. Outcome pending. -- To stay within executor disk capacity, removed 47 task-touched disposable - incremental-cache directories after core compilation completed. Source files, - old refs and saved binaries were retained. Preserved the pre-existing RPC at - `/workspace/.pumas-tools/pre-v080-20261014-pumas-rpc`, 633,094,624 bytes, - SHA-256 `336690da08cd505c6bb86c8007cd8ddc2976c4f02ec82f089a15fb0bb3d751fa`. -- Current main and PR #69's passing head have the identical Git tree - `7301cb8e86f9e7a498f5dd64b663a4ea5e174b75`. Historical CI remains labeled - separately from current local execution. No model/native runtime was downloaded. -- Parent clarified that only actual demo dependency edges need qualification; - unrelated consumers do not need simultaneous releases. Read-only inventories - and remaining source/package gates will accompany an immutable receipt. - -## 2026-10-14 — immutable source handoff - -- Qualified code commit `5da74a2c9bd1fe3c0b1fa0184eef3667f31eed88` was pushed - without force; [draft PR #70](https://github.com/MrScripty/Pumas-Library/pull/70) - is open against main. This documentation follow-up adds the changelog, - migration/release notes, current consumer inventory and - [candidate receipt](reports/candidate.json); it changes no production source. -- RPC's second build attempt ended in linker SIGBUS while the filesystem was - full, and sandbox startup independently reported ENOSPC. Cleanup of only the - completed task-built core test executables recovered 15,991,790,400 bytes. - Automatic approval review permitted the cleanup outside the broken full-disk - sandbox. No source, saved executable or model data was deleted. -- The unchanged final RPC invocation passed: 233 unit tests and 24 integration - tests, with 13 ignored entries; S3 process targets contain zero tests without - their feature. The development binary passed health, inference-route absence - and graceful-stop smoke. Two explicitly selected native session-reference tests - passed owned start/borrowed retention/cleanup and borrowed cancellation keeping - its external owner healthy. These are not actual Chrema/Tuldok/Pantograph tests. -- Rebuilt local RPC: 752,728,784 bytes, SHA-256 - `da0bb23c6a4889baca2bc8500a07d07a38457cb43c2999d324d6d8a5419b04ed`. - Actual features are `pumas-library/hf-client,pumas-library/test-support`. - Source/target provenance is absent from its advertisement. This is a debug - test executable, not a release archive or inference qualification. -- Receipt validation checked its exact input hashes, source-commit existence, - unchanged production roots and JSON. Fourteen local documentation links and - whitespace checks passed. No permanent test harness was added for prose. -- GitHub's push notice reported 52 dependency alerts on default main (27 high, - 19 moderate, 6 low); no shipped-closure triage is claimed. Keep the existing - release security-review gate. The receipt separately lists failed/resolved - setup attempts, ignored/disabled tests, not-run suites, native artifacts, - model/hardware inference and final publication gates. -- Checkpoint preparation is accepted within its named source-information scope. - Current/final PR CI and actual consumer edges remain separately qualified; - parent owns any candidate tag, final version bump, native artifact acceptance - and release publication. No tag or release was created. diff --git a/docs/plans/v080-readiness/issues.md b/docs/plans/v080-readiness/issues.md deleted file mode 100644 index 5012133d3..000000000 --- a/docs/plans/v080-readiness/issues.md +++ /dev/null @@ -1,13 +0,0 @@ -# Checkpoint findings - -| Finding | Disposition / owner / trigger | -| --- | --- | -| Saved checkout predates merged v0.8 integration | Refreshed by new task branch; historical refs preserved | -| Earlier catalogue timing failure | Did not reproduce: complete core headless cohort passed, including 7 catalogue recovery tests. Main also includes the separate fork-inherited local-start lease fixture correction `dceaf642`. | -| Launcher qualification fixture failures | Repaired the 100 ms startup assumption and Linux zombie liveness oracle; all 49 launcher tests passed. Production process supervision unchanged. | -| RPC build prerequisite/resource failures | Missing CMake and later disk exhaustion prevented two attempts before tests. Installed task-local CMake 3.31.6 and removed completed task-built test executables; final RPC run passed 257 tests, with 13 ignored. | -| Changelog/release notes lag current rc.1 manifests | In scope: current release notes and checkpoint QA | -| Installed production audio remains unavailable | Preserve the gate; audio owner must supply the complete admitted model/runtime/read/disposal qualification before advertising production | -| Inference-enabled headless artifacts and pretrained models lack final qualification | Parent/release owner selects accepted tuples and final bytes; controlled fixtures do not close these gates | -| gh API Forbidden; standards application routing unavailable | Use connected GitHub for review/PR when available; report exact remaining capability limits, never claim routing certification | -| GitHub default-branch dependency alert notice | Push reported 52 alerts (27 high, 19 moderate, 6 low). Not independently triaged as shipped exposure; release owner retains the current security-review gate. No unrelated dependency expansion in this slice. | diff --git a/docs/plans/v080-readiness/plan.md b/docs/plans/v080-readiness/plan.md deleted file mode 100644 index 3295c8864..000000000 --- a/docs/plans/v080-readiness/plan.md +++ /dev/null @@ -1,96 +0,0 @@ -# Pumas v0.8.0 checkpoint preparation - -**Plan status:** Accepted. **Acceptance status:** satisfied for source checkpoint -preparation only; release publication remains unaccepted. -**Current phase:** parent review and promotion handoff. -**Next slice:** none. - -## Objective and scope - -Provide the parent integration owner with one immutable, tested source candidate -for Pantograph, Chrema and Tuldok demonstrations, current migration/release notes, -and a bounded publication decision. This is checkpoint preparation, not release -publication or qualification of every future modality. - -The user explicitly authorizes this plan's `start` operation. Branch -`readiness/v080-20261014` belongs to this task, targets `main`, and starts at -`ef9eead9fe6595f5b3152ef8df19c5dace30190b`. Preserve the original `work` and -`integrate/http-acquisition-baseline` refs at `0dd38c70`; no history rewrite, -user library migration, model download, final tag or release publication. -Retain the task branch for draft-PR review; parent owns integration and retirement. - -## Acceptance claims - -| ID | Observable result | Kind / environment / mode | State | -| --- | --- | --- | --- | -| A1 | Current no-inference core/RPC suites qualify the source foundation; catalogue custody failures are reproduced or explicitly dispositioned | system / representative Linux / automated | satisfied: full cohorts passed; catalogue failure did not reproduce | -| A2 | Existing release contracts, version alignment and current default/S3 notices pass | contract / representative Linux / automated | satisfied: release QA and receipt | -| A3 | Release notes and changelog describe current contracts, migration, actual consumer pins and unqualified boundaries | contract / source inspection / manual | satisfied: release notes, QA, receipt and link review | -| A4 | Qualified source commit is pushed with a draft PR and exact evidence; final tag action remains parent-controlled | integration / required-real GitHub / automated | satisfied: `5da74a2c9bd1fe3c0b1fa0184eef3667f31eed88` pushed, draft PR #70 open | - -## Decisions and standards - -Current main already contains PRs #64–#69 and versions `0.8.0-rc.1`. -Do not reapply historical fixes or change versions merely to create a new name. -Re-run the existing headless gate before deciding whether the earlier catalogue -timing failure still blocks. Preserve production audio's unavailable outcome and -all model/runtime qualification gates. The current artifact plan requires sixteen -files: ten desktop installers, three no-inference headless archives and three -inference headless archives. Native archive/model acceptance remains separate -from the ordinary PR checks. - -No repository AGENTS.md or local .agents/skills exists in this saved checkout; -the workspace .agents directory is empty. Read CONTRIBUTING, Architecture, -Development, Releasing and current integration/consumer/distribution plans. -Coding-Standards was fetched separately at -`188beda1fa477d21d576c233dd8c7f4c4c267d23`. Core/Router select Planning, -Implementation, Verification, Development Proportionality, Commit, -Documentation, Release, Library, Contracts and Contract Evolution for this -release-information slice. No runtime composition or language mechanism changes -are planned. Re-route if a reproduced defect requires source changes. -The application-purpose executable route is unavailable: its reference CLI -returns `Application invocation is unavailable; use the published interface -contract.` No connected standards tool is exposed. Direct canonical reads are -guidance, not an executable routing certificate. - -**Composed-design review:** not-applicable. The initial write set changes release -information and evidence only, adding no state, process or API composition. -A repair that changes composition triggers a design review before editing. - -## Milestone: reviewed checkpoint - -**Status:** Accepted for checkpoint preparation. -**Write set:** this plan directory, CHANGELOG.md, docs/release-notes-0.8.0.md, -docs/release-qa-0.8.0.md; directly affected current release guidance links only. -Amendment before fixture edits: `scripts/launcher/commands.test.mjs` owns two -reproduced false failures. Immediate Node startup exceeded the 100 ms negative -fixture window; the Linux descendant was actually terminated (`/proc` state Z) -but container PID 1 did not reap it. Give the early-exit fixture startup margin -and observe Linux execution state as well as PID existence. Keep actual process -group termination, force-path and child-close assertions. Add Launcher, -Resilience and Verification Oracles/Platforms guidance for these fixture facts. -No production lifecycle or runtime composition changes are admitted. -Consumer repositories are read-only inventory inputs, owned by their respective -integration agents; this task does not change their pins. - -**Gate:** A1–A4. Run existing checks, inspect the cumulative and staged diff, -commit conventionally, push without force, open a draft PR. Do not add a new -validation harness for prose. Linux source/fixture tests cannot qualify native -Windows/macOS packages, pretrained inference, GPU behavior or external consumers. - -## Blockers and re-plan triggers - -Final release remains blocked on the required native artifact/model evidence -selected by RELEASING.md. Parent qualifies only the actual consumer dependency -edges used by each demo; unrelated repositories need not release together. A missing -optional production capability is later scope when it is advertised unavailable; -a false availability claim, broken supported migration or reproduced ownership -failure is a release blocker. A new owner/contract, migration, dependency change -or unsafe operation requires an explicit scoped amendment before implementation. -Stop investigation once current tests and source inventory support a bounded -handoff; do not turn checkpoint preparation into open-ended feature expansion. - -[Execution ledger](execution-ledger.md) · [Issues](issues.md) · -[Release QA](../../release-qa-0.8.0.md) · -[Immutable receipt](reports/candidate.json) · -[Draft PR #70](https://github.com/MrScripty/Pumas-Library/pull/70) diff --git a/docs/plans/v080-readiness/reports/candidate.json b/docs/plans/v080-readiness/reports/candidate.json deleted file mode 100644 index 6799987ff..000000000 --- a/docs/plans/v080-readiness/reports/candidate.json +++ /dev/null @@ -1,367 +0,0 @@ -{ - "schema_version": 1, - "purpose": "immutable source-foundation receipt; not release approval", - "date_utc": "2026-10-14", - "source": { - "repository": "https://github.com/MrScripty/Pumas-Library", - "qualified_code_revision": "5da74a2c9bd1fe3c0b1fa0184eef3667f31eed88", - "qualified_code_tree": "b5b8e9134ba75563a37458bbab0e440e29f42022", - "production_source_revision": "ef9eead9fe6595f5b3152ef8df19c5dace30190b", - "production_source_tree": "7301cb8e86f9e7a498f5dd64b663a4ea5e174b75", - "production_equivalence_command": "git diff --exit-code ef9eead9fe6595f5b3152ef8df19c5dace30190b HEAD -- rust frontend electron package.json pnpm-lock.yaml scripts/release bindings", - "production_equivalence_result": "passed; no changes", - "version": "0.8.0-rc.1", - "receipt_followup": "The subsequent documentation commit adds this receipt, migration notes and changelog; it changes no production source." - }, - "inputs": { - "rust/Cargo.lock": { - "sha256": "91fb9823de2f0346211b4f68ca400f03a628890e55dca90e0803e2dd7ad47e42", - "bytes": 127936 - }, - "pnpm-lock.yaml": { - "sha256": "78cac9b50e2f28d293420ffb8b9d57889a723669a3969b3a670dd3e6cbfdda18", - "bytes": 210197 - }, - "rust-toolchain.toml": { - "sha256": "1d76a06616a42a984bad672eeb24ca39a0496e95a8b624e21df0d420d1557734", - "bytes": 86 - }, - ".node-version": { - "sha256": "b911698dc3cf3227d34d0ad6727f1c4408791203c9665de99ab959331a1fb07d", - "bytes": 8 - }, - ".python-version": { - "sha256": "fa682ae9d943f5c8076e68335c9ba3ab4d063ad035c07ac6928653dd4ac50af7", - "bytes": 7 - }, - "scripts/release/artifact-plan.json": { - "sha256": "66348a507f00ffdc74741fc7d70eab02f4a0eed4d3655354784cea2971662064", - "bytes": 16523 - }, - "bindings/support-matrix.json": { - "sha256": "30b301e8be9298ced5a7e51a0c750593ed3e4eed95434ef83b94c85d0d31083f", - "bytes": 3596 - } - }, - "environment": { - "execution": "Cloud Linux container", - "target": "x86_64-unknown-linux-gnu", - "rustc": "1.92.0 (ded5c06cf 2025-12-08)", - "cargo": "1.92.0 (344c4567c 2025-10-21)", - "node": "24.19.0", - "repository_node_pin": "24.15.0", - "python": "3.12.14", - "repository_python_pin": "3.12.3", - "task_local_cmake": "3.31.6", - "profile": "development test/debug; not optimized release", - "native_inference_runtime": "not provisioned or loaded", - "model_identity": null - }, - "artifacts": [ - { - "role": "local development test binary; not distributable", - "path": "rust/target/debug/pumas-rpc", - "sha256": "da0bb23c6a4889baca2bc8500a07d07a38457cb43c2999d324d6d8a5419b04ed", - "bytes": 752728784, - "build_info": { - "build_info_schema_version": 1, - "component": "pumas-rpc", - "package_version": "0.8.0-rc.1", - "compiled_features": [ - "pumas-library/hf-client", - "pumas-library/test-support" - ], - "protocols": [ - { - "name": "pumas.local-ipc", - "versions": [ - 1 - ] - }, - { - "name": "pumas.local-http", - "versions": [ - 1 - ] - } - ], - "schemas": [ - { - "name": "pumas.build-info", - "version": 1 - }, - { - "name": "pumas.discovery", - "version": 1 - }, - { - "name": "pumas.model-ref", - "version": 1 - }, - { - "name": "pumas.model-selector", - "version": 1 - }, - { - "name": "pumas.http-advertisement", - "version": 1 - }, - { - "name": "pumas.http-admission-fence", - "version": 1 - }, - { - "name": "pumas.http-owner-retention", - "version": 1 - } - ] - }, - "build_info_sha256": "c746079e822ae0614c0f2a9fe874676a3054c02456541ce7e8b198edd75d5840", - "embedded_source_revision": null, - "embedded_target": null, - "provenance_limit": "Build advertisement omits source/target provenance. Source receipt records the unchanged production checkout independently; no self-authenticated release provenance is claimed." - } - ], - "release_artifacts": { - "status": "not_produced", - "required_count": 16, - "runtime_pin_for_future_inference_archives": "CPU ONNX Runtime 1.24.2; not loaded by this task" - }, - "gates": [ - { - "id": "core-no-default", - "status": "passed", - "command": "cargo test --locked --manifest-path rust/Cargo.toml -p pumas-library --no-default-features", - "unit_passed": 2070, - "integration_passed": 218, - "doctest_passed": 6, - "ignored": 29, - "feature_gated_zero_test_targets": "S3 and other disabled feature-specific targets", - "log": "/tmp/pumas-v080-headless.log", - "log_sha256": "e9ad254f0060eb39175be06bbba02140201fb41c7f38a0dbc006c7186403e5fc" - }, - { - "id": "rpc-no-default", - "status": "passed", - "command": "XDG_CONFIG_HOME=/tmp/pumas-v080-config cargo test --locked --manifest-path rust/Cargo.toml -p pumas-rpc --no-default-features", - "unit_passed": 233, - "integration_passed": 24, - "ignored": 13, - "log": "/tmp/pumas-v080-rpc-final.log", - "log_sha256": "4700ca8f30fc976b8e3361ee4b7d253e645e92aad5db0b5194db8ca3a046425d" - }, - { - "id": "release-contracts", - "status": "passed", - "command": "node --test scripts/release/*.test.mjs", - "passed": 33, - "failed": 0, - "skipped": 0, - "log": "/tmp/pumas-v080-release.log", - "log_sha256": "6dc12ffacc75fac7a254afbfdf081d5290af8a23c1beec6f0abac46be079d80b" - }, - { - "id": "launcher", - "status": "passed", - "command": "npm run test:launcher", - "passed": 49, - "failed": 0, - "skipped": 0, - "log": "/tmp/pumas-v080-launcher-repaired.log", - "log_sha256": "3c1712ecedfde6dfb7fbb2f572a51b9795153b967ad326267f91c9ef9641ff99" - }, - { - "id": "version-alignment", - "status": "passed", - "command": "npm run check:release-versions -- v0.8.0-rc.1" - }, - { - "id": "dependency-ownership", - "status": "passed", - "command": "npm run check:dependency-ownership" - }, - { - "id": "default-attribution", - "status": "passed", - "command": "node scripts/release/check-attribution.cjs" - }, - { - "id": "s3-attribution", - "status": "passed", - "command": "node scripts/release/check-attribution.cjs --features s3" - }, - { - "id": "rust-format", - "status": "passed", - "command": "cargo fmt --manifest-path rust/Cargo.toml --all -- --check", - "log": "/tmp/pumas-v080-fmt.log", - "log_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" - }, - { - "id": "development-rpc-smoke", - "status": "passed", - "command": "python3 scripts/release/smoke-rpc.py rust/target/debug/pumas-rpc --inference-disabled", - "claims": [ - "HTTP health", - "inference route absence", - "graceful child shutdown" - ], - "log": "/tmp/pumas-v080-rpc-smoke.log", - "log_sha256": "499c48b7575abab845a33d0c179d51a8d88b2069d83c00aa2ecd15e5a5c2abc3" - }, - { - "id": "native-session-reference", - "status": "passed", - "command": "PUMAS_CONSUMER_TEST_BINARY=/workspace/Pumas-Library/rust/target/debug/pumas-rpc python3 -m unittest test_local_http_session.NativeConsumerTests.test_owned_start_borrowed_retention_and_context_cleanup test_local_http_session.NativeConsumerTests.test_cancelled_borrowed_context_leaves_external_owner_healthy -v", - "cwd": "scripts/consumers", - "passed": 2, - "skipped": 0, - "claims": [ - "owned startup and cleanup", - "borrowed retention", - "borrowed cancellation preserves external owner" - ], - "log": "/tmp/pumas-v080-consumer.log", - "log_sha256": "aa3121363a006f3da1174c7e5e86820cc3d341052f00bbe91c8801bd9987b86d" - }, - { - "id": "candidate-ci", - "status": "pending", - "reason": "Draft PR checks must run on the final review head." - }, - { - "id": "all-features-workspace-and-clippy", - "status": "not_run", - "reason": "No Rust production source changed; not rerun locally. Historical identical-runtime-base CI is separate." - }, - { - "id": "enabled-s3-source-cohorts", - "status": "not_run", - "reason": "S3 is disabled in these local Cargo invocations; attribution/release fixtures do not substitute." - }, - { - "id": "frontend-electron-torch-suites", - "status": "not_run", - "reason": "Not rerun locally for this documentation and launcher-fixture slice; no UI, Electron or Torch source changed." - }, - { - "id": "explicit-ignored-kernel-confinement-gate", - "status": "not_run", - "reason": "The ordinary Cargo invocation leaves its ignored entry unexecuted; no new confinement claim." - }, - { - "id": "external-consumer-acceptance", - "status": "not_run", - "reason": "Only read-only source inventories were inspected; each selected actual consumer edge needs its own locked/application acceptance." - }, - { - "id": "native-windows-macos", - "status": "not_run", - "reason": "These native targets were not executed in this Linux container." - }, - { - "id": "release-artifact-matrix", - "status": "not_run", - "reason": "No optimized installer/archive set, native installation acceptance or final-byte metadata was produced." - }, - { - "id": "pretrained-model-inference", - "status": "not_run", - "reason": "No provided pretrained model/tokenizer/projector fixtures; no model downloads or real model inference run." - }, - { - "id": "hardware-qualified-inference", - "status": "not_run", - "reason": "No hardware qualification performed." - }, - { - "id": "final-security-sbom-signing", - "status": "not_run", - "reason": "Not performed; freshness checks do not establish dependency/security/license or signing acceptance." - }, - { - "id": "tags-and-publication", - "status": "not_run", - "reason": "Parent-owned; no tag or release action executed." - } - ], - "earlier_attempts": [ - { - "id": "launcher-initial", - "status": "failed", - "passed": 47, - "failed": 2, - "log_sha256": "3f93b9a0f203d9e0545f2afb98aa0c788b8382c670b41b156f831e930842820b", - "disposition": "Corrected fixture startup margin and Linux zombie execution-state oracle; production launcher unchanged; full rerun passed." - }, - { - "id": "rpc-initial", - "status": "failed_before_tests", - "reason": "CMake missing", - "log_sha256": "882226528f3957d4a9bb5437d187aec0fa3d5378ded0f6e6fe86f33069253f8f", - "disposition": "Installed task-local CMake 3.31.6." - }, - { - "id": "rpc-second", - "status": "failed_before_tests", - "reason": "Linker SIGBUS while container filesystem was full; sandbox startup also failed with ENOSPC.", - "log_sha256": "a64457e4488550652c51c9655a2c9d709c8be19b91bea87486d13e73db7bfc3e", - "disposition": "Removed only completed task-built core test executables; unchanged RPC invocation subsequently passed." - } - ], - "consumer_inventory": [ - { - "repository": "MrScripty/Pantograph", - "inspected_main": "2253cbe6fe8f1969b347c61fccba31859b13a4ba", - "pumas_pin": "aa1d79ae2d53f0acb088bc85223ecc2ff46af12b", - "acceptance": "not_run; coordinate manifest, lock and CI setup pin for the actual source edge" - }, - { - "repository": "MrScripty/Chrema", - "inspected_main": "508c8b8cb724b49c655dab8bc4c8336190e516c7", - "pumas_pin": null, - "acceptance": "not_run; no Pumas adapter present on inspected main; historical qualification targets a different cohort" - }, - { - "repository": "MrScripty/Tuldok", - "inspected_main": "d856a984535a430909761ed13ce42eadd55b0710", - "pumas_contract_pin": "36c2aab2c885b8416fd4e39cf8c37c510596d6e4", - "acceptance": "not_run; operation DTO definitions unchanged by source comparison; real caption/runtime path remains separate" - } - ], - "migration": { - "download_store": "schema 7; explicit offline conversion from supported v4/v5/schema-6 states", - "backup": "exact private downloads.json metadata backup only", - "model_payloads": "not scanned, copied, hashed or rewritten by conversion", - "preconditions": [ - "all old/current readers and writers stopped", - "one-way upgrade acknowledged" - ], - "downgrade": "unsupported; no automatic restore after uncertain publication", - "old_failed_claims": "not automatically retired; dead PID alone is insufficient", - "user_library_migrated_by_this_task": false, - "authority": "docs/library-upgrade.md" - }, - "promotion": { - "owner": "parent/maintainer", - "independent_consumer_releases_required": false, - "source_pin_does_not_require_tag": true, - "candidate_tag_if_parent_accepts_all_pre_tag_gates": "v0.8.0-rc.1", - "final_tag": "v0.8.0 only after a separate aligned final-version commit and required acceptance", - "executed": false - }, - "review": { - "draft_pr": "https://github.com/MrScripty/Pumas-Library/pull/70", - "base": "main", - "branch": "readiness/v080-20261014", - "qualified_code_pushed": true, - "ci": "pending; final documentation head requires its own PR run" - }, - "github_push_notice": { - "default_branch_reported_alerts": 52, - "high": 27, - "moderate": 19, - "low": 6, - "assessment": "Not independently triaged against the shipped dependency closure; current release security-review gate remains open." - } -} diff --git a/docs/release-evidence/0.7.0/appimage-default-sandbox.txt b/docs/release-evidence/0.7.0/appimage-default-sandbox.txt deleted file mode 100644 index 8b14edfd8..000000000 --- a/docs/release-evidence/0.7.0/appimage-default-sandbox.txt +++ /dev/null @@ -1,7 +0,0 @@ -{ - "root": "/tmp/pumas-ui-verify-KbBAju", - "library_ready": true, - "preload_rpc_models": true, - "category_menu": "Network online · model library ready\nAll Categories\n\nNo library models found\n\nChoose an existing Pumas library root or its shared-resources/models folder to load your saved models into this packaged app.\n\nUse Existing Library\nLink Health\nAll links healthy\n0 links\nMigration Reports\n0 items" -} -{"exit":0,"backend_closed":true,"evidence":"/tmp/pumas-ui-verify-KbBAju"} diff --git a/docs/release-evidence/0.7.0/appimage-desktop.txt b/docs/release-evidence/0.7.0/appimage-desktop.txt deleted file mode 100644 index 2d6f6bdec..000000000 --- a/docs/release-evidence/0.7.0/appimage-desktop.txt +++ /dev/null @@ -1,7 +0,0 @@ -{ - "root": "/tmp/pumas-ui-verify-gGUqMH", - "library_ready": true, - "preload_rpc_models": true, - "category_menu": "Network online · model library ready\nAll Categories\n\nNo library models found\n\nChoose an existing Pumas library root or its shared-resources/models folder to load your saved models into this packaged app.\n\nUse Existing Library\nLink Health\nAll links healthy\n0 links\nMigration Reports\n0 items" -} -{"exit":0,"backend_closed":true,"evidence":"/tmp/pumas-ui-verify-gGUqMH"} diff --git a/docs/release-evidence/0.7.0/appimage-onnx.txt b/docs/release-evidence/0.7.0/appimage-onnx.txt deleted file mode 100644 index 429c6d001..000000000 --- a/docs/release-evidence/0.7.0/appimage-onnx.txt +++ /dev/null @@ -1,4 +0,0 @@ -import {"error": null, "model_id": "embedding/fixture/nomic", "model_path": "embedding/fixture/nomic", "path": "/tmp/pumas-packaged-inference-jiinadur/shared-resources/models/embedding/fixture/nomic", "security_tier": null, "success": true} -profile {'profile_id': 'onnx-verification', 'snapshot_required': True, 'success': True} -launch {'ready': True, 'success': True} -{"binary": "/tmp/pumas-070-verified-final-extracted/appimage/squashfs-root/resources/pumas-rpc", "import": "passed", "load": "passed", "embedding_dimensions": 256, "finite": true, "unload": "passed"} diff --git a/docs/release-evidence/0.7.0/appimage-root-recovery.txt b/docs/release-evidence/0.7.0/appimage-root-recovery.txt deleted file mode 100644 index 9620b2af1..000000000 --- a/docs/release-evidence/0.7.0/appimage-root-recovery.txt +++ /dev/null @@ -1,3 +0,0 @@ -before {"status":"recovery-required","reason":"invalid","authoritySource":"persisted","action":"select-library"} /tmp/pumas-recovery-fCzu5Y -after {"status":"ready","selectionAction":"select-library","libraryScopeId":null} -{"persisted_selection":true,"restarted_ready":true,"evidence":"/tmp/pumas-recovery-fCzu5Y"} diff --git a/docs/release-evidence/0.7.0/cargo-audit-final.json b/docs/release-evidence/0.7.0/cargo-audit-final.json deleted file mode 100644 index c35e758d9..000000000 --- a/docs/release-evidence/0.7.0/cargo-audit-final.json +++ /dev/null @@ -1 +0,0 @@ -{"database":{"advisory-count":1246,"last-commit":"e2e640471715167f73e22eaf761f2e547adafeec","last-updated":"2026-09-14T18:06:06+02:00"},"lockfile":{"dependency-count":487},"settings":{"target_arch":[],"target_os":[],"severity":null,"ignore":[],"informational_warnings":["unmaintained","unsound","notice"]},"vulnerabilities":{"found":false,"count":0,"list":[]},"warnings":{"unmaintained":[{"kind":"unmaintained","package":{"name":"bincode","version":"1.3.3","source":"registry+https://github.com/rust-lang/crates.io-index","checksum":"b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad","dependencies":[{"name":"serde","version":"1.0.228","source":"registry+https://github.com/rust-lang/crates.io-index"}],"replace":null},"advisory":{"id":"RUSTSEC-2025-0141","package":"bincode","title":"Bincode is unmaintained","description":"Due to a doxxing and harassment incident, the bincode team has taken the decision to cease development permanently.\n\nThe team considers version 1.3.3 a complete version of bincode that is not in need of any updates.\n\n## Alternatives to consider\n\n* [wincode](https://crates.io/crates/wincode)\n* [postcard](https://crates.io/crates/postcard)\n* [bitcode](https://crates.io/crates/bitcode)\n* [rkyv](https://crates.io/crates/rkyv)","date":"2025-12-16","aliases":[],"related":[],"collection":"crates","categories":[],"keywords":[],"cvss":null,"informational":"unmaintained","references":[],"source":null,"url":"https://git.sr.ht/~stygianentity/bincode/tree/v3.0/item/README.md","withdrawn":null,"license":"CC0-1.0","expect-deleted":false},"affected":null,"versions":{"patched":[],"unaffected":[]}},{"kind":"unmaintained","package":{"name":"instant","version":"0.1.13","source":"registry+https://github.com/rust-lang/crates.io-index","checksum":"e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222","dependencies":[{"name":"cfg-if","version":"1.0.4","source":"registry+https://github.com/rust-lang/crates.io-index"}],"replace":null},"advisory":{"id":"RUSTSEC-2024-0384","package":"instant","title":"`instant` is unmaintained","description":"This crate is no longer maintained, and the author recommends using the maintained [`web-time`] crate instead.\n\n[`web-time`]: https://crates.io/crates/web-time","date":"2024-09-01","aliases":[],"related":[],"collection":"crates","categories":[],"keywords":[],"cvss":null,"informational":"unmaintained","references":["https://crates.io/crates/instant/0.1.13","https://github.com/sebcrozet/instant/issues/52"],"source":null,"url":null,"withdrawn":null,"license":"CC0-1.0","expect-deleted":false},"affected":null,"versions":{"patched":[],"unaffected":[]}},{"kind":"unmaintained","package":{"name":"paste","version":"1.0.15","source":"registry+https://github.com/rust-lang/crates.io-index","checksum":"57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a","replace":null},"advisory":{"id":"RUSTSEC-2024-0436","package":"paste","title":"paste - no longer maintained","description":"The creator of the crate `paste` has stated in the [`README.md`](https://github.com/dtolnay/paste/blob/master/README.md) \nthat this project is not longer maintained as well as archived the repository\n\n## Possible Alternative(s)\n\n- [`pastey`]: a fork of paste and is aimed to be a drop-in replacement with additional features for paste crate\n- [`with_builtin_macros`]: crate providing a [superset of `paste`'s functionality including general `macro_rules!` eager expansions](https://docs.rs/with_builtin_macros/0.1.0/with_builtin_macros/macro.with_eager_expansions.html) and `concat!`/`concat_idents!` macros\n\n[`pastey`]: https://crates.io/crates/pastey\n[`with_builtin_macros`]: https://crates.io/crates/with_builtin_macros","date":"2024-10-07","aliases":[],"related":[],"collection":"crates","categories":[],"keywords":[],"cvss":null,"informational":"unmaintained","references":[],"source":null,"url":"https://github.com/dtolnay/paste","withdrawn":null,"license":"CC0-1.0","expect-deleted":false},"affected":null,"versions":{"patched":[],"unaffected":[]}},{"kind":"unmaintained","package":{"name":"proc-macro-error2","version":"2.0.1","source":"registry+https://github.com/rust-lang/crates.io-index","checksum":"11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802","dependencies":[{"name":"proc-macro-error-attr2","version":"2.0.0","source":"registry+https://github.com/rust-lang/crates.io-index"},{"name":"proc-macro2","version":"1.0.105","source":"registry+https://github.com/rust-lang/crates.io-index"},{"name":"quote","version":"1.0.43","source":"registry+https://github.com/rust-lang/crates.io-index"},{"name":"syn","version":"2.0.114","source":"registry+https://github.com/rust-lang/crates.io-index"}],"replace":null},"advisory":{"id":"RUSTSEC-2026-0173","package":"proc-macro-error2","title":"proc-macro-error2 is unmaintained","description":"The author of `proc-macro-error2` has [confirmed](https://github.com/GnomedDev/proc-macro-error-2/issues/17#issuecomment-4643215473) that the crate is no longer maintained and recommends that users migrate away from it.\n\n`proc-macro-error2` was originally created as a maintained fork of [`proc-macro-error`](https://crates.io/crates/proc-macro-error) (see [RUSTSEC-2024-0370](https://rustsec.org/advisories/RUSTSEC-2024-0370)). Both the original crate and this fork are now unmaintained.\n\n## Possible Alternative(s)\n\n- [manyhow](https://crates.io/crates/manyhow)\n- [proc-macro2-diagnostics](https://github.com/SergioBenitez/proc-macro2-diagnostics)","date":"2026-06-07","aliases":[],"related":[],"collection":"crates","categories":[],"keywords":[],"cvss":null,"informational":"unmaintained","references":[],"source":null,"url":"https://github.com/GnomedDev/proc-macro-error-2/issues/17","withdrawn":null,"license":"CC0-1.0","expect-deleted":false},"affected":null,"versions":{"patched":[],"unaffected":[]}}]}} diff --git a/docs/release-evidence/0.7.0/cargo-audit-minimized.json b/docs/release-evidence/0.7.0/cargo-audit-minimized.json deleted file mode 100644 index 7dcf86860..000000000 --- a/docs/release-evidence/0.7.0/cargo-audit-minimized.json +++ /dev/null @@ -1 +0,0 @@ -{"database":{"advisory-count":1246,"last-commit":null,"last-updated":null},"lockfile":{"dependency-count":458},"settings":{"target_arch":[],"target_os":[],"severity":null,"ignore":[],"informational_warnings":["unmaintained","unsound","notice"]},"vulnerabilities":{"found":false,"count":0,"list":[]},"warnings":{"unmaintained":[{"kind":"unmaintained","package":{"name":"bincode","version":"1.3.3","source":"registry+https://github.com/rust-lang/crates.io-index","checksum":"b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad","dependencies":[{"name":"serde","version":"1.0.228","source":"registry+https://github.com/rust-lang/crates.io-index"}],"replace":null},"advisory":{"id":"RUSTSEC-2025-0141","package":"bincode","title":"Bincode is unmaintained","description":"Due to a doxxing and harassment incident, the bincode team has taken the decision to cease development permanently.\n\nThe team considers version 1.3.3 a complete version of bincode that is not in need of any updates.\n\n## Alternatives to consider\n\n* [wincode](https://crates.io/crates/wincode)\n* [postcard](https://crates.io/crates/postcard)\n* [bitcode](https://crates.io/crates/bitcode)\n* [rkyv](https://crates.io/crates/rkyv)","date":"2025-12-16","aliases":[],"related":[],"collection":"crates","categories":[],"keywords":[],"cvss":null,"informational":"unmaintained","references":[],"source":null,"url":"https://git.sr.ht/~stygianentity/bincode/tree/v3.0/item/README.md","withdrawn":null,"license":"CC0-1.0","expect-deleted":false},"affected":null,"versions":{"patched":[],"unaffected":[]}},{"kind":"unmaintained","package":{"name":"instant","version":"0.1.13","source":"registry+https://github.com/rust-lang/crates.io-index","checksum":"e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222","dependencies":[{"name":"cfg-if","version":"1.0.4","source":"registry+https://github.com/rust-lang/crates.io-index"}],"replace":null},"advisory":{"id":"RUSTSEC-2024-0384","package":"instant","title":"`instant` is unmaintained","description":"This crate is no longer maintained, and the author recommends using the maintained [`web-time`] crate instead.\n\n[`web-time`]: https://crates.io/crates/web-time","date":"2024-09-01","aliases":[],"related":[],"collection":"crates","categories":[],"keywords":[],"cvss":null,"informational":"unmaintained","references":["https://crates.io/crates/instant/0.1.13","https://github.com/sebcrozet/instant/issues/52"],"source":null,"url":null,"withdrawn":null,"license":"CC0-1.0","expect-deleted":false},"affected":null,"versions":{"patched":[],"unaffected":[]}},{"kind":"unmaintained","package":{"name":"paste","version":"1.0.15","source":"registry+https://github.com/rust-lang/crates.io-index","checksum":"57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a","replace":null},"advisory":{"id":"RUSTSEC-2024-0436","package":"paste","title":"paste - no longer maintained","description":"The creator of the crate `paste` has stated in the [`README.md`](https://github.com/dtolnay/paste/blob/master/README.md) \nthat this project is not longer maintained as well as archived the repository\n\n## Possible Alternative(s)\n\n- [`pastey`]: a fork of paste and is aimed to be a drop-in replacement with additional features for paste crate\n- [`with_builtin_macros`]: crate providing a [superset of `paste`'s functionality including general `macro_rules!` eager expansions](https://docs.rs/with_builtin_macros/0.1.0/with_builtin_macros/macro.with_eager_expansions.html) and `concat!`/`concat_idents!` macros\n\n[`pastey`]: https://crates.io/crates/pastey\n[`with_builtin_macros`]: https://crates.io/crates/with_builtin_macros","date":"2024-10-07","aliases":[],"related":[],"collection":"crates","categories":[],"keywords":[],"cvss":null,"informational":"unmaintained","references":[],"source":null,"url":"https://github.com/dtolnay/paste","withdrawn":null,"license":"CC0-1.0","expect-deleted":false},"affected":null,"versions":{"patched":[],"unaffected":[]}}]}} diff --git a/docs/release-evidence/0.7.0/cargo-audit.json b/docs/release-evidence/0.7.0/cargo-audit.json deleted file mode 100644 index f1d70680e..000000000 --- a/docs/release-evidence/0.7.0/cargo-audit.json +++ /dev/null @@ -1,236 +0,0 @@ -{ - "database": { - "advisory-count": 1246, - "last-commit": "e2e640471715167f73e22eaf761f2e547adafeec", - "last-updated": "2026-09-14T18:06:06+02:00" - }, - "lockfile": { - "dependency-count": 487 - }, - "settings": { - "target_arch": [], - "target_os": [], - "severity": null, - "ignore": [], - "informational_warnings": [ - "unmaintained", - "unsound", - "notice" - ] - }, - "vulnerabilities": { - "found": false, - "count": 0, - "list": [] - }, - "warnings": { - "unmaintained": [ - { - "kind": "unmaintained", - "package": { - "name": "bincode", - "version": "1.3.3", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "checksum": "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad", - "dependencies": [ - { - "name": "serde", - "version": "1.0.228", - "source": "registry+https://github.com/rust-lang/crates.io-index" - } - ], - "replace": null - }, - "advisory": { - "id": "RUSTSEC-2025-0141", - "package": "bincode", - "title": "Bincode is unmaintained", - "description": "Due to a doxxing and harassment incident, the bincode team has taken the decision to cease development permanently.\n\nThe team considers version 1.3.3 a complete version of bincode that is not in need of any updates.\n\n## Alternatives to consider\n\n* [wincode](https://crates.io/crates/wincode)\n* [postcard](https://crates.io/crates/postcard)\n* [bitcode](https://crates.io/crates/bitcode)\n* [rkyv](https://crates.io/crates/rkyv)", - "date": "2025-12-16", - "aliases": [], - "related": [], - "collection": "crates", - "categories": [], - "keywords": [], - "cvss": null, - "informational": "unmaintained", - "references": [], - "source": null, - "url": "https://git.sr.ht/~stygianentity/bincode/tree/v3.0/item/README.md", - "withdrawn": null, - "license": "CC0-1.0", - "expect-deleted": false - }, - "affected": null, - "versions": { - "patched": [], - "unaffected": [] - } - }, - { - "kind": "unmaintained", - "package": { - "name": "instant", - "version": "0.1.13", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "checksum": "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222", - "dependencies": [ - { - "name": "cfg-if", - "version": "1.0.4", - "source": "registry+https://github.com/rust-lang/crates.io-index" - } - ], - "replace": null - }, - "advisory": { - "id": "RUSTSEC-2024-0384", - "package": "instant", - "title": "`instant` is unmaintained", - "description": "This crate is no longer maintained, and the author recommends using the maintained [`web-time`] crate instead.\n\n[`web-time`]: https://crates.io/crates/web-time", - "date": "2024-09-01", - "aliases": [], - "related": [], - "collection": "crates", - "categories": [], - "keywords": [], - "cvss": null, - "informational": "unmaintained", - "references": [ - "https://crates.io/crates/instant/0.1.13", - "https://github.com/sebcrozet/instant/issues/52" - ], - "source": null, - "url": null, - "withdrawn": null, - "license": "CC0-1.0", - "expect-deleted": false - }, - "affected": null, - "versions": { - "patched": [], - "unaffected": [] - } - }, - { - "kind": "unmaintained", - "package": { - "name": "paste", - "version": "1.0.15", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "checksum": "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a", - "replace": null - }, - "advisory": { - "id": "RUSTSEC-2024-0436", - "package": "paste", - "title": "paste - no longer maintained", - "description": "The creator of the crate `paste` has stated in the [`README.md`](https://github.com/dtolnay/paste/blob/master/README.md) \nthat this project is not longer maintained as well as archived the repository\n\n## Possible Alternative(s)\n\n- [`pastey`]: a fork of paste and is aimed to be a drop-in replacement with additional features for paste crate\n- [`with_builtin_macros`]: crate providing a [superset of `paste`'s functionality including general `macro_rules!` eager expansions](https://docs.rs/with_builtin_macros/0.1.0/with_builtin_macros/macro.with_eager_expansions.html) and `concat!`/`concat_idents!` macros\n\n[`pastey`]: https://crates.io/crates/pastey\n[`with_builtin_macros`]: https://crates.io/crates/with_builtin_macros", - "date": "2024-10-07", - "aliases": [], - "related": [], - "collection": "crates", - "categories": [], - "keywords": [], - "cvss": null, - "informational": "unmaintained", - "references": [], - "source": null, - "url": "https://github.com/dtolnay/paste", - "withdrawn": null, - "license": "CC0-1.0", - "expect-deleted": false - }, - "affected": null, - "versions": { - "patched": [], - "unaffected": [] - } - }, - { - "kind": "unmaintained", - "package": { - "name": "proc-macro-error2", - "version": "2.0.1", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "checksum": "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802", - "dependencies": [ - { - "name": "proc-macro-error-attr2", - "version": "2.0.0", - "source": "registry+https://github.com/rust-lang/crates.io-index" - }, - { - "name": "proc-macro2", - "version": "1.0.105", - "source": "registry+https://github.com/rust-lang/crates.io-index" - }, - { - "name": "quote", - "version": "1.0.43", - "source": "registry+https://github.com/rust-lang/crates.io-index" - }, - { - "name": "syn", - "version": "2.0.114", - "source": "registry+https://github.com/rust-lang/crates.io-index" - } - ], - "replace": null - }, - "advisory": { - "id": "RUSTSEC-2026-0173", - "package": "proc-macro-error2", - "title": "proc-macro-error2 is unmaintained", - "description": "The author of `proc-macro-error2` has [confirmed](https://github.com/GnomedDev/proc-macro-error-2/issues/17#issuecomment-4643215473) that the crate is no longer maintained and recommends that users migrate away from it.\n\n`proc-macro-error2` was originally created as a maintained fork of [`proc-macro-error`](https://crates.io/crates/proc-macro-error) (see [RUSTSEC-2024-0370](https://rustsec.org/advisories/RUSTSEC-2024-0370)). Both the original crate and this fork are now unmaintained.\n\n## Possible Alternative(s)\n\n- [manyhow](https://crates.io/crates/manyhow)\n- [proc-macro2-diagnostics](https://github.com/SergioBenitez/proc-macro2-diagnostics)", - "date": "2026-06-07", - "aliases": [], - "related": [], - "collection": "crates", - "categories": [], - "keywords": [], - "cvss": null, - "informational": "unmaintained", - "references": [], - "source": null, - "url": "https://github.com/GnomedDev/proc-macro-error-2/issues/17", - "withdrawn": null, - "license": "CC0-1.0", - "expect-deleted": false - }, - "affected": null, - "versions": { - "patched": [], - "unaffected": [] - } - } - ], - "yanked": [ - { - "kind": "yanked", - "package": { - "name": "der", - "version": "0.8.0", - "source": "registry+https://github.com/rust-lang/crates.io-index", - "checksum": "71fd89660b2dc699704064e59e9dba0147b903e85319429e131620d022be411b", - "dependencies": [ - { - "name": "pem-rfc7468", - "version": "1.0.0", - "source": "registry+https://github.com/rust-lang/crates.io-index" - }, - { - "name": "zeroize", - "version": "1.8.2", - "source": "registry+https://github.com/rust-lang/crates.io-index" - } - ], - "replace": null - }, - "advisory": null, - "affected": null, - "versions": null - } - ] - } -} diff --git a/docs/release-evidence/0.7.0/ci-repair.md b/docs/release-evidence/0.7.0/ci-repair.md deleted file mode 100644 index 827a3aa67..000000000 --- a/docs/release-evidence/0.7.0/ci-repair.md +++ /dev/null @@ -1,98 +0,0 @@ -# 0.7.0 CI repair - -## Follow-up from run 34914326630 - -[The next tag run](https://github.com/MrScripty/Pumas-Library/actions/runs/34914326630) -passed frontend conformance and the IPC restart tests, then exposed two -package-facts selection failures. Execution descriptors chose the largest file -in the directory without respecting `selected_artifact_files`. The fixture's -equally sized GGUF files made the result depend on filesystem traversal order. -Making the unselected sibling larger reproduced both failures locally. - -Execution descriptors now restrict file selection to the declared artifact -files. Legacy packages without a selection still use the largest model file, -with a stable path tie-break. Tests cover a larger unselected sibling and a -missing selected file, which must never silently switch to another artifact. - -The same run showed native compiler and action deprecation warnings. Linux-only -router observers, mutation workers, and their test helpers now have matching -platform compilation guards. Windows-only unused parameters are explicitly -handled. Shared atomic-publication result types retain their complete contract; -their non-Unix unused-code annotations explain that this platform refuses -publication admission. These annotations do not claim Windows publication works. - -The workflow explicitly installs the repository Rust toolchain and uses maintained -Node 24 actions (`pnpm/action-setup@v6.1.0`, `actions/upload-artifact@v7.0.1`, and -`actions/download-artifact@v8.0.1`). Native platform checks reject compiler warnings -before optimized compilation. The artifact archive layout remains unchanged. - -Follow-up validation: the complete local Rust quality and headless suites passed, -as did all 36 package-facts tests in debug and release builds. Candidate run -[34915702501](https://github.com/MrScripty/Pumas-Library/actions/runs/34915702501) -passed Rust quality, frontend contracts, and Linux/macOS compiler-warning checks. -Its Windows warning check exposed unused publication fault-injection helpers: -these tests now compile only on Unix, where durable publication is supported. -A non-Unix regression verifies publication refusal leaves existing bytes and the -parent directory unchanged. RPC shutdown timeouts include captured diagnostics -on every platform. Windows installs the manifest-pinned pnpm with npm to avoid -`pnpm/action-setup`'s deprecated shell invocation, and uses PowerShell to extract -the frontend archive after the download action verifies its digest, avoiding that -action's deprecated Windows Buffer API. Native CI verification continues before -moving the release tag. - -## First repair - -Investigated [Build run 34904132053](https://github.com/MrScripty/Pumas-Library/actions/runs/34904132053) -at commit `3a6e0309b8cabe891d0d4792d8b9704fc394773e`. - -## Failures and corrections - -- **Frontend and desktop contracts:** the renderer conformance suite reads the - bundled Electron preload, but the job only type-checked Electron. Removing the - local generated preload reproduced the CI `ENOENT`. The frontend contract test - command now builds Electron before generating fixtures and running Vitest. -- **Rust quality, Linux release, and headless tests:** the IPC restart fixture - could race startup reconciliation of retained declarations. Its metadata family - disagreed with its directory and lacked classification evidence, so reconciliation - could rewrite metadata or move the model after facts were cached. The fixture now - supplies coherent identity and text-generation evidence, and completes required - reconciliation before generating package facts. Adding that barrier to the old - fixture deterministically exposed `ModelNotFound`; correcting the fixture made - the existing native/IPC parity and durable-restart assertions pass. -- **macOS release:** held model relocation returned `Unsupported` outside Linux, - causing migration, reclassification, merge, and preparation tests to fail. - macOS now uses `renameatx_np` with `RENAME_EXCL`, preserving directory-relative - authority, exclusive destination creation, identity checks, and directory sync. - See [Apple's syscall contract](https://github.com/apple-oss-distributions/xnu/blob/main/bsd/man/man2/rename.2). - Relocation and substituted-parent tests now run on both supported platforms. - A syscall regression also checks that a destination created after preflight - cannot be overwritten, including an empty directory that ordinary rename could - replace. - -The attribution inventory was regenerated after the frontend script change. -Only the frontend manifest hash changed; dependency versions and notice texts -remain identical. - -## Verification scope - -- Frontend desktop conformance: 48 tests passed after reproducing the missing preload. -- IPC integration: both tests passed; the existing subprocess helper remains ignored. -- IPC durable restart: 10 repeated passes using disk temporary storage and 10 using - memory-backed temporary storage, which exposed the original startup race locally. -- Dependency ownership, version/tag alignment, attribution, and release-contract - checks passed. -- The complete `./scripts/rust/check.sh` gate passed: formatting, all-feature - check and Clippy, default workspace tests, doctests, and no-default check. - This includes 1,409 active core unit tests and 227 RPC unit tests. -- Headless core tests passed, including 1,385 active unit tests, integration - tests, and doctests. Three download timing tests initially exceeded deadlines - during concurrent compilation; all three passed in isolation, and the full - headless core rerun passed with `RUST_TEST_THREADS=4`. -- The independent headless RPC suite also passed with `RUST_TEST_THREADS=4`. -- The optimized workspace test command from the Linux release job passed: - `cargo test --locked --manifest-path rust/Cargo.toml --workspace --exclude pumas_rustler --release`. - -Native macOS execution and installer acceptance require the new GitHub Actions -run. Local Linux tests do not establish macOS execution or installer acceptance. -The maintainer explicitly requested moving the failed `v0.7.0` tag; no GitHub -release existed for that tag when checked before the repair. diff --git a/docs/release-evidence/0.7.0/debian-default-sandbox.txt b/docs/release-evidence/0.7.0/debian-default-sandbox.txt deleted file mode 100644 index 8b82fca06..000000000 --- a/docs/release-evidence/0.7.0/debian-default-sandbox.txt +++ /dev/null @@ -1,7 +0,0 @@ -{ - "root": "/tmp/pumas-ui-verify-oIiSY3", - "library_ready": true, - "preload_rpc_models": true, - "category_menu": "Network online · model library ready\nAll Categories\n\nNo library models found\n\nChoose an existing Pumas library root or its shared-resources/models folder to load your saved models into this packaged app.\n\nUse Existing Library\nLink Health\nAll links healthy\n0 links\nMigration Reports\n0 items" -} -{"exit":0,"backend_closed":true,"evidence":"/tmp/pumas-ui-verify-oIiSY3"} diff --git a/docs/release-evidence/0.7.0/debian-desktop.txt b/docs/release-evidence/0.7.0/debian-desktop.txt deleted file mode 100644 index d468e1edc..000000000 --- a/docs/release-evidence/0.7.0/debian-desktop.txt +++ /dev/null @@ -1,7 +0,0 @@ -{ - "root": "/tmp/pumas-ui-verify-9WNhKo", - "library_ready": true, - "preload_rpc_models": true, - "category_menu": "Network online · model library ready\nAll Categories\n\nNo library models found\n\nChoose an existing Pumas library root or its shared-resources/models folder to load your saved models into this packaged app.\n\nUse Existing Library\nLink Health\nAll links healthy\n0 links\nMigration Reports\n0 items" -} -{"exit":0,"backend_closed":true,"evidence":"/tmp/pumas-ui-verify-9WNhKo"} diff --git a/docs/release-evidence/0.7.0/debian-install-remove.txt b/docs/release-evidence/0.7.0/debian-install-remove.txt deleted file mode 100644 index 0c6471fda..000000000 --- a/docs/release-evidence/0.7.0/debian-install-remove.txt +++ /dev/null @@ -1,23 +0,0 @@ -Isolated root: /tmp/pumas-deb-install-6zgoorih -Selecting previously unselected package pumas-library-electron. -(Reading database ... 842242 files and directories currently installed.) -Preparing to unpack /tmp/candidate.deb ... -Unpacking pumas-library-electron (0.7.0) ... -Setting up pumas-library-electron (0.7.0) ... -update-alternatives: using /opt/Pumas Library/pumas-library-electron to provide /usr/bin/pumas-library-electron (pumas-library-electron) in auto mode -Skipping the installation of the AppArmor profile as this version of AppArmor does not seem to support the bundled profile -Processing triggers for hicolor-icon-theme (0.17-2) ... -Processing triggers for mailcap (3.70+nmu1ubuntu1.24.04.1) ... -Processing triggers for gnome-menus (3.36.0-1.1ubuntu3) ... -Processing triggers for desktop-file-utils (0.27-2build1) ... -install ok installed 0.7.0 -43.7.0 -(Reading database ... 842342 files and directories currently installed.) -Removing pumas-library-electron (0.7.0) ... -update-alternatives: warning: alternative /opt/Pumas Library/pumas-library-electron (part of link group pumas-library-electron) doesn't exist; removing from list of alternatives -update-alternatives: warning: /etc/alternatives/pumas-library-electron is dangling; it will be updated with best choice -Processing triggers for mailcap (3.70+nmu1ubuntu1.24.04.1) ... -Processing triggers for gnome-menus (3.36.0-1.1ubuntu3) ... -Processing triggers for desktop-file-utils (0.27-2build1) ... -Processing triggers for hicolor-icon-theme (0.17-2) ... -Isolated Debian installation, alternatives, runtime identity and removal passed diff --git a/docs/release-evidence/0.7.0/debian-onnx.txt b/docs/release-evidence/0.7.0/debian-onnx.txt deleted file mode 100644 index 4b0399f46..000000000 --- a/docs/release-evidence/0.7.0/debian-onnx.txt +++ /dev/null @@ -1,4 +0,0 @@ -import {"error": null, "model_id": "embedding/fixture/nomic", "model_path": "embedding/fixture/nomic", "path": "/tmp/pumas-packaged-inference-smhp3wa3/shared-resources/models/embedding/fixture/nomic", "security_tier": null, "success": true} -profile {'profile_id': 'onnx-verification', 'snapshot_required': True, 'success': True} -launch {'ready': True, 'success': True} -{"binary": "/tmp/pumas-070-verified-final-extracted/deb/opt/Pumas Library/resources/pumas-rpc", "import": "passed", "load": "passed", "embedding_dimensions": 256, "finite": true, "unload": "passed"} diff --git a/docs/release-evidence/0.7.0/debian-root-recovery.txt b/docs/release-evidence/0.7.0/debian-root-recovery.txt deleted file mode 100644 index a94604228..000000000 --- a/docs/release-evidence/0.7.0/debian-root-recovery.txt +++ /dev/null @@ -1,3 +0,0 @@ -before {"status":"recovery-required","reason":"invalid","authoritySource":"persisted","action":"select-library"} /tmp/pumas-recovery-aLK10t -after {"status":"ready","selectionAction":"select-library","libraryScopeId":null} -{"persisted_selection":true,"restarted_ready":true,"evidence":"/tmp/pumas-recovery-aLK10t"} diff --git a/docs/release-evidence/0.7.0/dependency-features-minimized.txt b/docs/release-evidence/0.7.0/dependency-features-minimized.txt deleted file mode 100644 index 1bc8804a3..000000000 --- a/docs/release-evidence/0.7.0/dependency-features-minimized.txt +++ /dev/null @@ -1,9 +0,0 @@ -x86_64-unknown-linux-gnu pumas-library headless=True: dependency feature contract passed -x86_64-unknown-linux-gnu pumas-rpc headless=True: dependency feature contract passed -x86_64-unknown-linux-gnu pumas-rpc headless=False: dependency feature contract passed -aarch64-apple-darwin pumas-library headless=True: dependency feature contract passed -aarch64-apple-darwin pumas-rpc headless=True: dependency feature contract passed -aarch64-apple-darwin pumas-rpc headless=False: dependency feature contract passed -x86_64-pc-windows-msvc pumas-library headless=True: dependency feature contract passed -x86_64-pc-windows-msvc pumas-rpc headless=True: dependency feature contract passed -x86_64-pc-windows-msvc pumas-rpc headless=False: dependency feature contract passed diff --git a/docs/release-evidence/0.7.0/dependency-inventory.json b/docs/release-evidence/0.7.0/dependency-inventory.json deleted file mode 100644 index 18c30768d..000000000 --- a/docs/release-evidence/0.7.0/dependency-inventory.json +++ /dev/null @@ -1,2214 +0,0 @@ -{ - "schema_version": 1, - "review_date": "2026-09-14", - "kind": "dependency-review-inventory-not-final-sbom", - "target": "x86_64-unknown-linux-gnu", - "scope_notes": [ - "Rust includes normal and build dependencies selected by standalone default pumas-rpc cargo tree; it is not a claim that every package is present in the runtime executable.", - "Renderer records packages with rendered modules; isolated rebuild reproduced frontend/dist bytes exactly.", - "Native ONNX transitive components and embedded Chromium component inventory have not been individually reconciled." - ], - "input_sha256": { - "rust/Cargo.lock": "b2738a39bf41ad21b9ace2253b6886704f0d674c66aebd4ed258494f5466bca6", - "pnpm-lock.yaml": "d6075c717b4f2d6ca729c49a3a14a5d1c080616494d110e880e27b1aa4d75a77", - "electron/package.json": "f4916515aeef1ed89ea134701ef653dc8991ecb35371e04aa75e187608ae0ad5" - }, - "renderer": [ - { - "name": "framer-motion", - "version": "12.43.0", - "license": "MIT", - "license_files": [ - "LICENSE.md" - ] - }, - { - "name": "loglevel", - "version": "1.9.2", - "license": "MIT", - "license_files": [ - "LICENSE-MIT" - ] - }, - { - "name": "lucide-react", - "version": "0.561.0", - "license": "ISC", - "license_files": [ - "LICENSE" - ] - }, - { - "name": "motion-dom", - "version": "12.43.0", - "license": "MIT", - "license_files": [ - "LICENSE.md" - ] - }, - { - "name": "motion-utils", - "version": "12.39.0", - "license": "MIT", - "license_files": [ - "LICENSE.md" - ] - }, - { - "name": "react-aria", - "version": "3.52.1", - "license": "Apache-2.0", - "license_files": [ - "LICENSE" - ] - }, - { - "name": "react-dom", - "version": "19.3.0", - "license": "MIT", - "license_files": [ - "LICENSE" - ] - }, - { - "name": "react-stately", - "version": "3.50.0", - "license": "Apache-2.0", - "license_files": [ - "LICENSE" - ] - }, - { - "name": "react", - "version": "19.3.0", - "license": "MIT", - "license_files": [ - "LICENSE" - ] - }, - { - "name": "scheduler", - "version": "0.28.0", - "license": "MIT", - "license_files": [ - "LICENSE" - ] - } - ], - "electron_main": [ - { - "name": "electron-log", - "version": "5.4.4", - "license": "MIT", - "packaged_license": "app.asar/node_modules/electron-log/LICENSE" - } - ], - "rust_normal_and_build": [ - { - "name": "adler2", - "version": "2.0.1", - "license_declared": "0BSD OR MIT OR Apache-2.0", - "repository": "https://github.com/oyvindln/adler2" - }, - { - "name": "aes", - "version": "0.8.4", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/RustCrypto/block-ciphers" - }, - { - "name": "ahash", - "version": "0.8.12", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/tkaitchuck/ahash" - }, - { - "name": "aho-corasick", - "version": "1.1.4", - "license_declared": "Unlicense OR MIT", - "repository": "https://github.com/BurntSushi/aho-corasick" - }, - { - "name": "ambient-authority", - "version": "0.0.2", - "license_declared": "Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT", - "repository": "https://github.com/sunfishcode/ambient-authority" - }, - { - "name": "anstream", - "version": "0.6.21", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-cli/anstyle.git" - }, - { - "name": "anstyle", - "version": "1.0.13", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-cli/anstyle.git" - }, - { - "name": "anstyle-parse", - "version": "0.2.7", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-cli/anstyle.git" - }, - { - "name": "anstyle-query", - "version": "1.1.5", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-cli/anstyle.git" - }, - { - "name": "anyhow", - "version": "1.0.103", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/dtolnay/anyhow" - }, - { - "name": "array-init", - "version": "2.1.0", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/Manishearth/array-init/" - }, - { - "name": "arrayref", - "version": "0.3.9", - "license_declared": "BSD-2-Clause", - "repository": "https://github.com/droundy/arrayref" - }, - { - "name": "arrayvec", - "version": "0.7.6", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/bluss/arrayvec" - }, - { - "name": "async-trait", - "version": "0.1.89", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/dtolnay/async-trait" - }, - { - "name": "atomic-waker", - "version": "1.1.2", - "license_declared": "Apache-2.0 OR MIT", - "repository": "https://github.com/smol-rs/atomic-waker" - }, - { - "name": "autocfg", - "version": "1.5.0", - "license_declared": "Apache-2.0 OR MIT", - "repository": "https://github.com/cuviper/autocfg" - }, - { - "name": "axum", - "version": "0.7.9", - "license_declared": "MIT", - "repository": "https://github.com/tokio-rs/axum" - }, - { - "name": "axum-core", - "version": "0.4.5", - "license_declared": "MIT", - "repository": "https://github.com/tokio-rs/axum" - }, - { - "name": "base64", - "version": "0.13.1", - "license_declared": "MIT/Apache-2.0", - "repository": "https://github.com/marshallpierce/rust-base64" - }, - { - "name": "base64", - "version": "0.22.1", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/marshallpierce/rust-base64" - }, - { - "name": "base64ct", - "version": "1.8.3", - "license_declared": "Apache-2.0 OR MIT", - "repository": "https://github.com/RustCrypto/formats" - }, - { - "name": "binrw", - "version": "0.15.0", - "license_declared": "MIT", - "repository": "https://github.com/jam1garner/binrw" - }, - { - "name": "binrw_derive", - "version": "0.15.0", - "license_declared": "MIT", - "repository": "https://github.com/jam1garner/binrw" - }, - { - "name": "bitflags", - "version": "1.3.2", - "license_declared": "MIT/Apache-2.0", - "repository": "https://github.com/bitflags/bitflags" - }, - { - "name": "bitflags", - "version": "2.10.0", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/bitflags/bitflags" - }, - { - "name": "blake3", - "version": "1.8.3", - "license_declared": "CC0-1.0 OR Apache-2.0 OR Apache-2.0 WITH LLVM-exception", - "repository": "https://github.com/BLAKE3-team/BLAKE3" - }, - { - "name": "block-buffer", - "version": "0.10.4", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/RustCrypto/utils" - }, - { - "name": "bumpalo", - "version": "3.19.1", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/fitzgen/bumpalo" - }, - { - "name": "bytemuck", - "version": "1.24.0", - "license_declared": "Zlib OR Apache-2.0 OR MIT", - "repository": "https://github.com/Lokathor/bytemuck" - }, - { - "name": "byteorder", - "version": "1.5.0", - "license_declared": "Unlicense OR MIT", - "repository": "https://github.com/BurntSushi/byteorder" - }, - { - "name": "bytes", - "version": "1.11.1", - "license_declared": "MIT", - "repository": "https://github.com/tokio-rs/bytes" - }, - { - "name": "bzip2", - "version": "0.5.2", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/trifectatechfoundation/bzip2-rs" - }, - { - "name": "bzip2-sys", - "version": "0.1.13+1.0.8", - "license_declared": "MIT/Apache-2.0", - "repository": "https://github.com/alexcrichton/bzip2-rs" - }, - { - "name": "cap-primitives", - "version": "4.0.3", - "license_declared": "Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT", - "repository": "https://github.com/bytecodealliance/cap-std" - }, - { - "name": "cap-std", - "version": "4.0.3", - "license_declared": "Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT", - "repository": "https://github.com/bytecodealliance/cap-std" - }, - { - "name": "castaway", - "version": "0.2.4", - "license_declared": "MIT", - "repository": "https://github.com/sagebind/castaway" - }, - { - "name": "cc", - "version": "1.2.53", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-lang/cc-rs" - }, - { - "name": "cfg-if", - "version": "1.0.4", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-lang/cfg-if" - }, - { - "name": "cfg_aliases", - "version": "0.2.1", - "license_declared": "MIT", - "repository": "https://github.com/katharostech/cfg_aliases" - }, - { - "name": "chrono", - "version": "0.4.43", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/chronotope/chrono" - }, - { - "name": "cipher", - "version": "0.4.4", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/RustCrypto/traits" - }, - { - "name": "clap", - "version": "4.5.54", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/clap-rs/clap" - }, - { - "name": "clap_builder", - "version": "4.5.54", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/clap-rs/clap" - }, - { - "name": "clap_derive", - "version": "4.5.49", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/clap-rs/clap" - }, - { - "name": "clap_lex", - "version": "0.7.7", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/clap-rs/clap" - }, - { - "name": "colorchoice", - "version": "1.0.4", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-cli/anstyle.git" - }, - { - "name": "compact_str", - "version": "0.9.0", - "license_declared": "MIT", - "repository": "https://github.com/ParkMyCar/compact_str" - }, - { - "name": "constant_time_eq", - "version": "0.3.1", - "license_declared": "CC0-1.0 OR MIT-0 OR Apache-2.0", - "repository": "https://github.com/cesarb/constant_time_eq" - }, - { - "name": "constant_time_eq", - "version": "0.4.2", - "license_declared": "CC0-1.0 OR MIT-0 OR Apache-2.0", - "repository": "https://github.com/cesarb/constant_time_eq" - }, - { - "name": "cpufeatures", - "version": "0.2.17", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/RustCrypto/utils" - }, - { - "name": "crc", - "version": "3.4.0", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/mrhooray/crc-rs.git" - }, - { - "name": "crc-catalog", - "version": "2.4.0", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/akhilles/crc-catalog.git" - }, - { - "name": "crc32fast", - "version": "1.5.0", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/srijs/rust-crc32fast" - }, - { - "name": "crossbeam-channel", - "version": "0.5.15", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/crossbeam-rs/crossbeam" - }, - { - "name": "crossbeam-deque", - "version": "0.8.6", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/crossbeam-rs/crossbeam" - }, - { - "name": "crossbeam-epoch", - "version": "0.9.20", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/crossbeam-rs/crossbeam" - }, - { - "name": "crossbeam-utils", - "version": "0.8.21", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/crossbeam-rs/crossbeam" - }, - { - "name": "crypto-common", - "version": "0.1.7", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/RustCrypto/traits" - }, - { - "name": "ctrlc", - "version": "3.5.1", - "license_declared": "MIT/Apache-2.0", - "repository": "https://github.com/Detegr/rust-ctrlc.git" - }, - { - "name": "daachorse", - "version": "1.0.1", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/daac-tools/daachorse" - }, - { - "name": "darling", - "version": "0.20.11", - "license_declared": "MIT", - "repository": "https://github.com/TedDriggs/darling" - }, - { - "name": "darling_core", - "version": "0.20.11", - "license_declared": "MIT", - "repository": "https://github.com/TedDriggs/darling" - }, - { - "name": "darling_macro", - "version": "0.20.11", - "license_declared": "MIT", - "repository": "https://github.com/TedDriggs/darling" - }, - { - "name": "dary_heap", - "version": "0.3.9", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/hanmertens/dary_heap" - }, - { - "name": "dashmap", - "version": "5.5.3", - "license_declared": "MIT", - "repository": "https://github.com/xacrimon/dashmap" - }, - { - "name": "dashmap", - "version": "6.1.0", - "license_declared": "MIT", - "repository": "https://github.com/xacrimon/dashmap" - }, - { - "name": "deflate64", - "version": "0.1.10", - "license_declared": "MIT", - "repository": "https://github.com/anatawa12/deflate64-rs" - }, - { - "name": "der", - "version": "0.8.0", - "license_declared": "Apache-2.0 OR MIT", - "repository": "https://github.com/RustCrypto/formats" - }, - { - "name": "deranged", - "version": "0.5.5", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/jhpratt/deranged" - }, - { - "name": "derive_builder", - "version": "0.20.2", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/colin-kiegel/rust-derive-builder" - }, - { - "name": "derive_builder_core", - "version": "0.20.2", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/colin-kiegel/rust-derive-builder" - }, - { - "name": "derive_builder_macro", - "version": "0.20.2", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/colin-kiegel/rust-derive-builder" - }, - { - "name": "digest", - "version": "0.10.7", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/RustCrypto/traits" - }, - { - "name": "dirs", - "version": "5.0.1", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/soc/dirs-rs" - }, - { - "name": "dirs-sys", - "version": "0.4.1", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/dirs-dev/dirs-sys-rs" - }, - { - "name": "displaydoc", - "version": "0.2.5", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/yaahc/displaydoc" - }, - { - "name": "either", - "version": "1.15.0", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rayon-rs/either" - }, - { - "name": "encoding_rs", - "version": "0.8.35", - "license_declared": "(Apache-2.0 OR MIT) AND BSD-3-Clause", - "repository": "https://github.com/hsivonen/encoding_rs" - }, - { - "name": "equivalent", - "version": "1.0.2", - "license_declared": "Apache-2.0 OR MIT", - "repository": "https://github.com/indexmap-rs/equivalent" - }, - { - "name": "errno", - "version": "0.3.14", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/lambda-fairy/rust-errno" - }, - { - "name": "esaxx-rs", - "version": "0.1.10", - "license_declared": "Apache-2.0", - "repository": "https://github.com/Narsil/esaxx-rs" - }, - { - "name": "fallible-iterator", - "version": "0.3.0", - "license_declared": "MIT/Apache-2.0", - "repository": "https://github.com/sfackler/rust-fallible-iterator" - }, - { - "name": "fallible-streaming-iterator", - "version": "0.1.9", - "license_declared": "MIT/Apache-2.0", - "repository": "https://github.com/sfackler/fallible-streaming-iterator" - }, - { - "name": "fastrand", - "version": "2.3.0", - "license_declared": "Apache-2.0 OR MIT", - "repository": "https://github.com/smol-rs/fastrand" - }, - { - "name": "filetime", - "version": "0.2.27", - "license_declared": "MIT/Apache-2.0", - "repository": "https://github.com/alexcrichton/filetime" - }, - { - "name": "find-msvc-tools", - "version": "0.1.8", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-lang/cc-rs" - }, - { - "name": "flate2", - "version": "1.1.8", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-lang/flate2-rs" - }, - { - "name": "fnv", - "version": "1.0.7", - "license_declared": "Apache-2.0 / MIT", - "repository": "https://github.com/servo/rust-fnv" - }, - { - "name": "foreign-types", - "version": "0.3.2", - "license_declared": "MIT/Apache-2.0", - "repository": "https://github.com/sfackler/foreign-types" - }, - { - "name": "foreign-types-shared", - "version": "0.1.1", - "license_declared": "MIT/Apache-2.0", - "repository": "https://github.com/sfackler/foreign-types" - }, - { - "name": "form_urlencoded", - "version": "1.2.2", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/servo/rust-url" - }, - { - "name": "fs-set-times", - "version": "0.20.3", - "license_declared": "Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT", - "repository": "https://github.com/bytecodealliance/fs-set-times" - }, - { - "name": "fs2", - "version": "0.4.3", - "license_declared": "MIT/Apache-2.0", - "repository": "https://github.com/danburkert/fs2-rs" - }, - { - "name": "futures", - "version": "0.3.31", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-lang/futures-rs" - }, - { - "name": "futures-channel", - "version": "0.3.31", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-lang/futures-rs" - }, - { - "name": "futures-core", - "version": "0.3.31", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-lang/futures-rs" - }, - { - "name": "futures-executor", - "version": "0.3.31", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-lang/futures-rs" - }, - { - "name": "futures-io", - "version": "0.3.31", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-lang/futures-rs" - }, - { - "name": "futures-macro", - "version": "0.3.31", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-lang/futures-rs" - }, - { - "name": "futures-sink", - "version": "0.3.31", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-lang/futures-rs" - }, - { - "name": "futures-task", - "version": "0.3.31", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-lang/futures-rs" - }, - { - "name": "futures-timer", - "version": "3.0.3", - "license_declared": "MIT/Apache-2.0", - "repository": "https://github.com/async-rs/futures-timer" - }, - { - "name": "futures-util", - "version": "0.3.31", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-lang/futures-rs" - }, - { - "name": "generic-array", - "version": "0.14.7", - "license_declared": "MIT", - "repository": "https://github.com/fizyk20/generic-array.git" - }, - { - "name": "getrandom", - "version": "0.2.17", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-random/getrandom" - }, - { - "name": "getrandom", - "version": "0.3.4", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-random/getrandom" - }, - { - "name": "getset", - "version": "0.1.6", - "license_declared": "MIT", - "repository": "https://github.com/jbaublitz/getset" - }, - { - "name": "governor", - "version": "0.7.0", - "license_declared": "MIT", - "repository": "https://github.com/boinkor-net/governor.git" - }, - { - "name": "h2", - "version": "0.4.16", - "license_declared": "MIT", - "repository": "https://github.com/hyperium/h2" - }, - { - "name": "half", - "version": "2.7.1", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/VoidStarKat/half-rs" - }, - { - "name": "hashbrown", - "version": "0.14.5", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-lang/hashbrown" - }, - { - "name": "hashbrown", - "version": "0.16.1", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-lang/hashbrown" - }, - { - "name": "hashlink", - "version": "0.9.1", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/kyren/hashlink" - }, - { - "name": "heck", - "version": "0.5.0", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/withoutboats/heck" - }, - { - "name": "hex", - "version": "0.4.3", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/KokaKiwi/rust-hex" - }, - { - "name": "hmac", - "version": "0.12.1", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/RustCrypto/MACs" - }, - { - "name": "hmac-sha256", - "version": "1.1.14", - "license_declared": "ISC", - "repository": "https://github.com/jedisct1/rust-hmac-sha256" - }, - { - "name": "http", - "version": "1.4.0", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/hyperium/http" - }, - { - "name": "http-body", - "version": "1.0.1", - "license_declared": "MIT", - "repository": "https://github.com/hyperium/http-body" - }, - { - "name": "http-body-util", - "version": "0.1.3", - "license_declared": "MIT", - "repository": "https://github.com/hyperium/http-body" - }, - { - "name": "httparse", - "version": "1.10.1", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/seanmonstar/httparse" - }, - { - "name": "httpdate", - "version": "1.0.3", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/pyfisch/httpdate" - }, - { - "name": "hyper", - "version": "1.8.1", - "license_declared": "MIT", - "repository": "https://github.com/hyperium/hyper" - }, - { - "name": "hyper-tls", - "version": "0.6.0", - "license_declared": "MIT/Apache-2.0", - "repository": "https://github.com/hyperium/hyper-tls" - }, - { - "name": "hyper-util", - "version": "0.1.19", - "license_declared": "MIT", - "repository": "https://github.com/hyperium/hyper-util" - }, - { - "name": "iana-time-zone", - "version": "0.1.64", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/strawlab/iana-time-zone" - }, - { - "name": "icu_collections", - "version": "2.1.1", - "license_declared": "Unicode-3.0", - "repository": "https://github.com/unicode-org/icu4x" - }, - { - "name": "icu_locale_core", - "version": "2.1.1", - "license_declared": "Unicode-3.0", - "repository": "https://github.com/unicode-org/icu4x" - }, - { - "name": "icu_normalizer", - "version": "2.1.1", - "license_declared": "Unicode-3.0", - "repository": "https://github.com/unicode-org/icu4x" - }, - { - "name": "icu_normalizer_data", - "version": "2.1.1", - "license_declared": "Unicode-3.0", - "repository": "https://github.com/unicode-org/icu4x" - }, - { - "name": "icu_properties", - "version": "2.1.2", - "license_declared": "Unicode-3.0", - "repository": "https://github.com/unicode-org/icu4x" - }, - { - "name": "icu_properties_data", - "version": "2.1.2", - "license_declared": "Unicode-3.0", - "repository": "https://github.com/unicode-org/icu4x" - }, - { - "name": "icu_provider", - "version": "2.1.1", - "license_declared": "Unicode-3.0", - "repository": "https://github.com/unicode-org/icu4x" - }, - { - "name": "ident_case", - "version": "1.0.1", - "license_declared": "MIT/Apache-2.0", - "repository": "https://github.com/TedDriggs/ident_case" - }, - { - "name": "idna", - "version": "1.1.0", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/servo/rust-url/" - }, - { - "name": "idna_adapter", - "version": "1.2.1", - "license_declared": "Apache-2.0 OR MIT", - "repository": "https://github.com/hsivonen/idna_adapter" - }, - { - "name": "indexmap", - "version": "2.13.0", - "license_declared": "Apache-2.0 OR MIT", - "repository": "https://github.com/indexmap-rs/indexmap" - }, - { - "name": "inotify", - "version": "0.10.2", - "license_declared": "ISC", - "repository": "https://github.com/hannobraun/inotify" - }, - { - "name": "inotify-sys", - "version": "0.1.5", - "license_declared": "ISC", - "repository": "https://github.com/hannobraun/inotify-sys" - }, - { - "name": "inout", - "version": "0.1.4", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/RustCrypto/utils" - }, - { - "name": "instant", - "version": "0.1.13", - "license_declared": "BSD-3-Clause", - "repository": "https://github.com/sebcrozet/instant" - }, - { - "name": "io-extras", - "version": "0.19.0", - "license_declared": "Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT", - "repository": "https://github.com/sunfishcode/io-extras" - }, - { - "name": "io-lifetimes", - "version": "2.0.4", - "license_declared": "Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT", - "repository": "https://github.com/sunfishcode/io-lifetimes" - }, - { - "name": "io-lifetimes", - "version": "3.0.1", - "license_declared": "Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT", - "repository": "https://github.com/sunfishcode/io-lifetimes" - }, - { - "name": "ipnet", - "version": "2.11.0", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/krisprice/ipnet" - }, - { - "name": "iri-string", - "version": "0.7.10", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/lo48576/iri-string" - }, - { - "name": "is_terminal_polyfill", - "version": "1.70.2", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/polyfill-rs/is_terminal_polyfill" - }, - { - "name": "itertools", - "version": "0.14.0", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-itertools/itertools" - }, - { - "name": "itoa", - "version": "1.0.17", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/dtolnay/itoa" - }, - { - "name": "jobserver", - "version": "0.1.34", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-lang/jobserver-rs" - }, - { - "name": "lazy_static", - "version": "1.5.0", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-lang-nursery/lazy-static.rs" - }, - { - "name": "libc", - "version": "0.2.180", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-lang/libc" - }, - { - "name": "libsqlite3-sys", - "version": "0.30.1", - "license_declared": "MIT", - "repository": "https://github.com/rusqlite/rusqlite" - }, - { - "name": "linux-raw-sys", - "version": "0.11.0", - "license_declared": "Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT", - "repository": "https://github.com/sunfishcode/linux-raw-sys" - }, - { - "name": "litemap", - "version": "0.8.1", - "license_declared": "Unicode-3.0", - "repository": "https://github.com/unicode-org/icu4x" - }, - { - "name": "lnk", - "version": "0.6.3", - "license_declared": "MIT", - "repository": "https://github.com/lilopkins/lnk-rs" - }, - { - "name": "lock_api", - "version": "0.4.14", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/Amanieu/parking_lot" - }, - { - "name": "log", - "version": "0.4.29", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-lang/log" - }, - { - "name": "lzma-rs", - "version": "0.3.0", - "license_declared": "MIT", - "repository": "https://github.com/gendx/lzma-rs" - }, - { - "name": "lzma-rust2", - "version": "0.15.7", - "license_declared": "Apache-2.0", - "repository": "https://github.com/hasenbanck/lzma-rust2/" - }, - { - "name": "lzma-sys", - "version": "0.1.20", - "license_declared": "MIT/Apache-2.0", - "repository": "https://github.com/alexcrichton/xz2-rs" - }, - { - "name": "macro_rules_attribute", - "version": "0.2.2", - "license_declared": "Apache-2.0 OR MIT OR Zlib", - "repository": "https://github.com/danielhenrymantilla/macro_rules_attribute-rs" - }, - { - "name": "macro_rules_attribute-proc_macro", - "version": "0.2.2", - "license_declared": "Apache-2.0 OR MIT OR Zlib", - "repository": "https://github.com/danielhenrymantilla/macro_rules_attribute-rs" - }, - { - "name": "matchers", - "version": "0.2.0", - "license_declared": "MIT", - "repository": "https://github.com/hawkw/matchers" - }, - { - "name": "matchit", - "version": "0.7.3", - "license_declared": "MIT AND BSD-3-Clause", - "repository": "https://github.com/ibraheemdev/matchit" - }, - { - "name": "matrixmultiply", - "version": "0.3.10", - "license_declared": "MIT/Apache-2.0", - "repository": "https://github.com/bluss/matrixmultiply/" - }, - { - "name": "maybe-owned", - "version": "0.3.4", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rustonaut/maybe-owned" - }, - { - "name": "memchr", - "version": "2.7.6", - "license_declared": "Unlicense OR MIT", - "repository": "https://github.com/BurntSushi/memchr" - }, - { - "name": "mime", - "version": "0.3.17", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/hyperium/mime" - }, - { - "name": "mini-moka", - "version": "0.10.3", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/moka-rs/mini-moka" - }, - { - "name": "minimal-lexical", - "version": "0.2.1", - "license_declared": "MIT/Apache-2.0", - "repository": "https://github.com/Alexhuszagh/minimal-lexical" - }, - { - "name": "miniz_oxide", - "version": "0.8.9", - "license_declared": "MIT OR Zlib OR Apache-2.0", - "repository": "https://github.com/Frommi/miniz_oxide/tree/master/miniz_oxide" - }, - { - "name": "mio", - "version": "1.1.1", - "license_declared": "MIT", - "repository": "https://github.com/tokio-rs/mio" - }, - { - "name": "monostate", - "version": "0.1.18", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/dtolnay/monostate" - }, - { - "name": "monostate-impl", - "version": "0.1.18", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/dtolnay/monostate" - }, - { - "name": "native-tls", - "version": "0.2.14", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/sfackler/rust-native-tls" - }, - { - "name": "ndarray", - "version": "0.17.2", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-ndarray/ndarray" - }, - { - "name": "nix", - "version": "0.29.0", - "license_declared": "MIT", - "repository": "https://github.com/nix-rust/nix" - }, - { - "name": "nix", - "version": "0.30.1", - "license_declared": "MIT", - "repository": "https://github.com/nix-rust/nix" - }, - { - "name": "no-std-compat", - "version": "0.4.1", - "license_declared": "MIT", - "repository": "https://gitlab.com/jD91mZM2/no-std-compat" - }, - { - "name": "nom", - "version": "7.1.3", - "license_declared": "MIT", - "repository": "https://github.com/Geal/nom" - }, - { - "name": "nonzero_ext", - "version": "0.3.0", - "license_declared": "Apache-2.0", - "repository": "https://github.com/antifuchs/nonzero_ext" - }, - { - "name": "notify", - "version": "7.0.0", - "license_declared": "CC0-1.0", - "repository": "https://github.com/notify-rs/notify.git" - }, - { - "name": "notify-types", - "version": "1.0.1", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/notify-rs/notify.git" - }, - { - "name": "nu-ansi-term", - "version": "0.50.3", - "license_declared": "MIT", - "repository": "https://github.com/nushell/nu-ansi-term" - }, - { - "name": "num-complex", - "version": "0.4.6", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-num/num-complex" - }, - { - "name": "num-conv", - "version": "0.2.2", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/jhpratt/num-conv" - }, - { - "name": "num-derive", - "version": "0.3.3", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-num/num-derive" - }, - { - "name": "num-derive", - "version": "0.4.2", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-num/num-derive" - }, - { - "name": "num-integer", - "version": "0.1.46", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-num/num-integer" - }, - { - "name": "num-traits", - "version": "0.2.19", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-num/num-traits" - }, - { - "name": "once_cell", - "version": "1.21.3", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/matklad/once_cell" - }, - { - "name": "onig", - "version": "6.5.3", - "license_declared": "MIT", - "repository": "https://github.com/iwillspeak/rust-onig" - }, - { - "name": "onig_sys", - "version": "69.9.3", - "license_declared": "MIT", - "repository": "https://github.com/rust-onig/rust-onig" - }, - { - "name": "openssl", - "version": "0.10.75", - "license_declared": "Apache-2.0", - "repository": "https://github.com/rust-openssl/rust-openssl" - }, - { - "name": "openssl-macros", - "version": "0.1.1", - "license_declared": "MIT/Apache-2.0", - "repository": null - }, - { - "name": "openssl-probe", - "version": "0.1.6", - "license_declared": "MIT/Apache-2.0", - "repository": "https://github.com/alexcrichton/openssl-probe" - }, - { - "name": "openssl-sys", - "version": "0.9.111", - "license_declared": "MIT", - "repository": "https://github.com/rust-openssl/rust-openssl" - }, - { - "name": "option-ext", - "version": "0.2.0", - "license_declared": "MPL-2.0", - "repository": "https://github.com/soc/option-ext.git" - }, - { - "name": "ort", - "version": "2.0.0-rc.12", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/pykeio/ort" - }, - { - "name": "ort-sys", - "version": "2.0.0-rc.12", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/pykeio/ort" - }, - { - "name": "owo-colors", - "version": "4.2.3", - "license_declared": "MIT", - "repository": "https://github.com/owo-colors/owo-colors" - }, - { - "name": "parking_lot", - "version": "0.12.5", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/Amanieu/parking_lot" - }, - { - "name": "parking_lot_core", - "version": "0.9.12", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/Amanieu/parking_lot" - }, - { - "name": "paste", - "version": "1.0.15", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/dtolnay/paste" - }, - { - "name": "pbkdf2", - "version": "0.12.2", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/RustCrypto/password-hashes/tree/master/pbkdf2" - }, - { - "name": "pem-rfc7468", - "version": "1.0.0", - "license_declared": "Apache-2.0 OR MIT", - "repository": "https://github.com/RustCrypto/formats" - }, - { - "name": "percent-encoding", - "version": "2.3.2", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/servo/rust-url/" - }, - { - "name": "pin-project-lite", - "version": "0.2.16", - "license_declared": "Apache-2.0 OR MIT", - "repository": "https://github.com/taiki-e/pin-project-lite" - }, - { - "name": "pin-utils", - "version": "0.1.0", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-lang-nursery/pin-utils" - }, - { - "name": "pkg-config", - "version": "0.3.32", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-lang/pkg-config-rs" - }, - { - "name": "portable-atomic", - "version": "1.13.0", - "license_declared": "Apache-2.0 OR MIT", - "repository": "https://github.com/taiki-e/portable-atomic" - }, - { - "name": "potential_utf", - "version": "0.1.4", - "license_declared": "Unicode-3.0", - "repository": "https://github.com/unicode-org/icu4x" - }, - { - "name": "powerfmt", - "version": "0.2.0", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/jhpratt/powerfmt" - }, - { - "name": "ppv-lite86", - "version": "0.2.21", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/cryptocorrosion/cryptocorrosion" - }, - { - "name": "proc-macro-error-attr2", - "version": "2.0.0", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/GnomedDev/proc-macro-error-2" - }, - { - "name": "proc-macro-error2", - "version": "2.0.1", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/GnomedDev/proc-macro-error-2" - }, - { - "name": "proc-macro2", - "version": "1.0.105", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/dtolnay/proc-macro2" - }, - { - "name": "pumas-app-manager", - "version": "0.7.0", - "license_declared": "MIT", - "repository": null - }, - { - "name": "pumas-library", - "version": "0.7.0", - "license_declared": "MIT", - "repository": "https://github.com/MrScripty/Pumas-Library" - }, - { - "name": "pumas-rpc", - "version": "0.7.0", - "license_declared": "MIT", - "repository": null - }, - { - "name": "quanta", - "version": "0.12.6", - "license_declared": "MIT", - "repository": "https://github.com/metrics-rs/quanta" - }, - { - "name": "quote", - "version": "1.0.43", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/dtolnay/quote" - }, - { - "name": "rand", - "version": "0.8.6", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-random/rand" - }, - { - "name": "rand", - "version": "0.9.3", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-random/rand" - }, - { - "name": "rand_chacha", - "version": "0.3.1", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-random/rand" - }, - { - "name": "rand_chacha", - "version": "0.9.0", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-random/rand" - }, - { - "name": "rand_core", - "version": "0.6.4", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-random/rand" - }, - { - "name": "rand_core", - "version": "0.9.5", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-random/rand" - }, - { - "name": "raw-cpuid", - "version": "11.6.0", - "license_declared": "MIT", - "repository": "https://github.com/gz/rust-cpuid" - }, - { - "name": "rawpointer", - "version": "0.2.1", - "license_declared": "MIT/Apache-2.0", - "repository": "https://github.com/bluss/rawpointer/" - }, - { - "name": "rayon", - "version": "1.11.0", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rayon-rs/rayon" - }, - { - "name": "rayon-cond", - "version": "0.4.0", - "license_declared": "Apache-2.0/MIT", - "repository": "https://github.com/cuviper/rayon-cond" - }, - { - "name": "rayon-core", - "version": "1.13.0", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rayon-rs/rayon" - }, - { - "name": "regex", - "version": "1.12.2", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-lang/regex" - }, - { - "name": "regex-automata", - "version": "0.4.13", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-lang/regex" - }, - { - "name": "regex-syntax", - "version": "0.8.8", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-lang/regex" - }, - { - "name": "reqwest", - "version": "0.12.28", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/seanmonstar/reqwest" - }, - { - "name": "rusqlite", - "version": "0.32.1", - "license_declared": "MIT", - "repository": "https://github.com/rusqlite/rusqlite" - }, - { - "name": "rustix", - "version": "1.1.3", - "license_declared": "Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT", - "repository": "https://github.com/bytecodealliance/rustix" - }, - { - "name": "rustix-linux-procfs", - "version": "0.1.1", - "license_declared": "Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT", - "repository": "https://github.com/sunfishcode/rustix-linux-procfs" - }, - { - "name": "rustls-pki-types", - "version": "1.14.0", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rustls/pki-types" - }, - { - "name": "rustversion", - "version": "1.0.22", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/dtolnay/rustversion" - }, - { - "name": "ryu", - "version": "1.0.22", - "license_declared": "Apache-2.0 OR BSL-1.0", - "repository": "https://github.com/dtolnay/ryu" - }, - { - "name": "same-file", - "version": "1.0.6", - "license_declared": "Unlicense/MIT", - "repository": "https://github.com/BurntSushi/same-file" - }, - { - "name": "scopeguard", - "version": "1.2.0", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/bluss/scopeguard" - }, - { - "name": "semver", - "version": "1.0.27", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/dtolnay/semver" - }, - { - "name": "serde", - "version": "1.0.228", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/serde-rs/serde" - }, - { - "name": "serde_core", - "version": "1.0.228", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/serde-rs/serde" - }, - { - "name": "serde_derive", - "version": "1.0.228", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/serde-rs/serde" - }, - { - "name": "serde_json", - "version": "1.0.149", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/serde-rs/json" - }, - { - "name": "serde_path_to_error", - "version": "0.1.20", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/dtolnay/path-to-error" - }, - { - "name": "serde_urlencoded", - "version": "0.7.1", - "license_declared": "MIT/Apache-2.0", - "repository": "https://github.com/nox/serde_urlencoded" - }, - { - "name": "sha1", - "version": "0.10.6", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/RustCrypto/hashes" - }, - { - "name": "sha2", - "version": "0.10.9", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/RustCrypto/hashes" - }, - { - "name": "sharded-slab", - "version": "0.1.7", - "license_declared": "MIT", - "repository": "https://github.com/hawkw/sharded-slab" - }, - { - "name": "shlex", - "version": "1.3.0", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/comex/rust-shlex" - }, - { - "name": "signal-hook-registry", - "version": "1.4.8", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/vorner/signal-hook" - }, - { - "name": "simd-adler32", - "version": "0.3.8", - "license_declared": "MIT", - "repository": "https://github.com/mcountryman/simd-adler32" - }, - { - "name": "slab", - "version": "0.4.11", - "license_declared": "MIT", - "repository": "https://github.com/tokio-rs/slab" - }, - { - "name": "smallvec", - "version": "1.15.1", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/servo/rust-smallvec" - }, - { - "name": "socket2", - "version": "0.6.1", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/rust-lang/socket2" - }, - { - "name": "socks", - "version": "0.3.4", - "license_declared": "MIT/Apache-2.0", - "repository": "https://github.com/sfackler/rust-socks" - }, - { - "name": "spinning_top", - "version": "0.3.0", - "license_declared": "MIT/Apache-2.0", - "repository": "https://github.com/rust-osdev/spinning_top" - }, - { - "name": "spm_precompiled", - "version": "0.1.4", - "license_declared": "Apache-2.0", - "repository": "https://github.com/huggingface/spm_precompiled" - }, - { - "name": "stable_deref_trait", - "version": "1.2.1", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/storyyeller/stable_deref_trait" - }, - { - "name": "static_assertions", - "version": "1.1.0", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/nvzqz/static-assertions-rs" - }, - { - "name": "strsim", - "version": "0.11.1", - "license_declared": "MIT", - "repository": "https://github.com/rapidfuzz/strsim-rs" - }, - { - "name": "substring", - "version": "1.4.5", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/Anders429/substring" - }, - { - "name": "subtle", - "version": "2.6.1", - "license_declared": "BSD-3-Clause", - "repository": "https://github.com/dalek-cryptography/subtle" - }, - { - "name": "syn", - "version": "1.0.109", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/dtolnay/syn" - }, - { - "name": "syn", - "version": "2.0.114", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/dtolnay/syn" - }, - { - "name": "sync_wrapper", - "version": "1.0.2", - "license_declared": "Apache-2.0", - "repository": "https://github.com/Actyx/sync_wrapper" - }, - { - "name": "synstructure", - "version": "0.13.2", - "license_declared": "MIT", - "repository": "https://github.com/mystor/synstructure" - }, - { - "name": "sysinfo", - "version": "0.32.1", - "license_declared": "MIT", - "repository": "https://github.com/GuillaumeGomez/sysinfo" - }, - { - "name": "tagptr", - "version": "0.2.0", - "license_declared": "MIT/Apache-2.0", - "repository": "https://github.com/oliver-giersch/tagptr.git" - }, - { - "name": "tar", - "version": "0.4.45", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/alexcrichton/tar-rs" - }, - { - "name": "tempfile", - "version": "3.24.0", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/Stebalien/tempfile" - }, - { - "name": "thiserror", - "version": "1.0.69", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/dtolnay/thiserror" - }, - { - "name": "thiserror", - "version": "2.0.18", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/dtolnay/thiserror" - }, - { - "name": "thiserror-impl", - "version": "1.0.69", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/dtolnay/thiserror" - }, - { - "name": "thiserror-impl", - "version": "2.0.18", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/dtolnay/thiserror" - }, - { - "name": "thread_local", - "version": "1.1.9", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/Amanieu/thread_local-rs" - }, - { - "name": "time", - "version": "0.3.47", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/time-rs/time" - }, - { - "name": "time-core", - "version": "0.1.8", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/time-rs/time" - }, - { - "name": "tinystr", - "version": "0.8.2", - "license_declared": "Unicode-3.0", - "repository": "https://github.com/unicode-org/icu4x" - }, - { - "name": "tokenizers", - "version": "0.23.1", - "license_declared": "Apache-2.0", - "repository": "https://github.com/huggingface/tokenizers" - }, - { - "name": "tokio", - "version": "1.49.0", - "license_declared": "MIT", - "repository": "https://github.com/tokio-rs/tokio" - }, - { - "name": "tokio-macros", - "version": "2.6.0", - "license_declared": "MIT", - "repository": "https://github.com/tokio-rs/tokio" - }, - { - "name": "tokio-native-tls", - "version": "0.3.1", - "license_declared": "MIT", - "repository": "https://github.com/tokio-rs/tls" - }, - { - "name": "tokio-util", - "version": "0.7.18", - "license_declared": "MIT", - "repository": "https://github.com/tokio-rs/tokio" - }, - { - "name": "tower", - "version": "0.5.3", - "license_declared": "MIT", - "repository": "https://github.com/tower-rs/tower" - }, - { - "name": "tower-http", - "version": "0.6.8", - "license_declared": "MIT", - "repository": "https://github.com/tower-rs/tower-http" - }, - { - "name": "tower-layer", - "version": "0.3.3", - "license_declared": "MIT", - "repository": "https://github.com/tower-rs/tower" - }, - { - "name": "tower-service", - "version": "0.3.3", - "license_declared": "MIT", - "repository": "https://github.com/tower-rs/tower" - }, - { - "name": "tracing", - "version": "0.1.44", - "license_declared": "MIT", - "repository": "https://github.com/tokio-rs/tracing" - }, - { - "name": "tracing-attributes", - "version": "0.1.31", - "license_declared": "MIT", - "repository": "https://github.com/tokio-rs/tracing" - }, - { - "name": "tracing-core", - "version": "0.1.36", - "license_declared": "MIT", - "repository": "https://github.com/tokio-rs/tracing" - }, - { - "name": "tracing-log", - "version": "0.2.0", - "license_declared": "MIT", - "repository": "https://github.com/tokio-rs/tracing" - }, - { - "name": "tracing-serde", - "version": "0.2.0", - "license_declared": "MIT", - "repository": "https://github.com/tokio-rs/tracing" - }, - { - "name": "tracing-subscriber", - "version": "0.3.22", - "license_declared": "MIT", - "repository": "https://github.com/tokio-rs/tracing" - }, - { - "name": "triomphe", - "version": "0.1.15", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/Manishearth/triomphe" - }, - { - "name": "try-lock", - "version": "0.2.5", - "license_declared": "MIT", - "repository": "https://github.com/seanmonstar/try-lock" - }, - { - "name": "typenum", - "version": "1.19.0", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/paholg/typenum" - }, - { - "name": "unicode-ident", - "version": "1.0.22", - "license_declared": "(MIT OR Apache-2.0) AND Unicode-3.0", - "repository": "https://github.com/dtolnay/unicode-ident" - }, - { - "name": "unicode-normalization-alignments", - "version": "0.1.12", - "license_declared": "MIT/Apache-2.0", - "repository": "https://github.com/n1t0/unicode-normalization" - }, - { - "name": "unicode-segmentation", - "version": "1.13.2", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/unicode-rs/unicode-segmentation" - }, - { - "name": "unicode_categories", - "version": "0.1.1", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/swgillespie/unicode-categories" - }, - { - "name": "ureq", - "version": "3.3.0", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/algesten/ureq" - }, - { - "name": "ureq-proto", - "version": "0.6.0", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/algesten/ureq-proto" - }, - { - "name": "url", - "version": "2.5.8", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/servo/rust-url" - }, - { - "name": "urlencoding", - "version": "2.1.3", - "license_declared": "MIT", - "repository": "https://github.com/kornelski/rust_urlencoding" - }, - { - "name": "utf8-zero", - "version": "0.8.1", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/algesten/utf8-zero" - }, - { - "name": "utf8_iter", - "version": "1.0.4", - "license_declared": "Apache-2.0 OR MIT", - "repository": "https://github.com/hsivonen/utf8_iter" - }, - { - "name": "utf8parse", - "version": "0.2.2", - "license_declared": "Apache-2.0 OR MIT", - "repository": "https://github.com/alacritty/vte" - }, - { - "name": "uuid", - "version": "1.19.0", - "license_declared": "Apache-2.0 OR MIT", - "repository": "https://github.com/uuid-rs/uuid" - }, - { - "name": "vcpkg", - "version": "0.2.15", - "license_declared": "MIT/Apache-2.0", - "repository": "https://github.com/mcgoo/vcpkg-rs" - }, - { - "name": "version_check", - "version": "0.9.5", - "license_declared": "MIT/Apache-2.0", - "repository": "https://github.com/SergioBenitez/version_check" - }, - { - "name": "walkdir", - "version": "2.5.0", - "license_declared": "Unlicense/MIT", - "repository": "https://github.com/BurntSushi/walkdir" - }, - { - "name": "want", - "version": "0.3.1", - "license_declared": "MIT", - "repository": "https://github.com/seanmonstar/want" - }, - { - "name": "webpki-root-certs", - "version": "1.0.7", - "license_declared": "CDLA-Permissive-2.0", - "repository": "https://github.com/rustls/webpki-roots" - }, - { - "name": "winstructs", - "version": "0.3.2", - "license_declared": "MIT/Apache-2.0", - "repository": "https://github.com/omerbenamram/winstructs/tree/master" - }, - { - "name": "writeable", - "version": "0.6.2", - "license_declared": "Unicode-3.0", - "repository": "https://github.com/unicode-org/icu4x" - }, - { - "name": "xattr", - "version": "1.6.1", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/Stebalien/xattr" - }, - { - "name": "xz2", - "version": "0.1.7", - "license_declared": "MIT/Apache-2.0", - "repository": "https://github.com/alexcrichton/xz2-rs" - }, - { - "name": "yoke", - "version": "0.8.1", - "license_declared": "Unicode-3.0", - "repository": "https://github.com/unicode-org/icu4x" - }, - { - "name": "yoke-derive", - "version": "0.8.1", - "license_declared": "Unicode-3.0", - "repository": "https://github.com/unicode-org/icu4x" - }, - { - "name": "zerocopy", - "version": "0.8.33", - "license_declared": "BSD-2-Clause OR Apache-2.0 OR MIT", - "repository": "https://github.com/google/zerocopy" - }, - { - "name": "zerocopy-derive", - "version": "0.8.33", - "license_declared": "BSD-2-Clause OR Apache-2.0 OR MIT", - "repository": "https://github.com/google/zerocopy" - }, - { - "name": "zerofrom", - "version": "0.1.6", - "license_declared": "Unicode-3.0", - "repository": "https://github.com/unicode-org/icu4x" - }, - { - "name": "zerofrom-derive", - "version": "0.1.6", - "license_declared": "Unicode-3.0", - "repository": "https://github.com/unicode-org/icu4x" - }, - { - "name": "zeroize", - "version": "1.8.2", - "license_declared": "Apache-2.0 OR MIT", - "repository": "https://github.com/RustCrypto/utils" - }, - { - "name": "zeroize_derive", - "version": "1.4.3", - "license_declared": "Apache-2.0 OR MIT", - "repository": "https://github.com/RustCrypto/utils/tree/master/zeroize/derive" - }, - { - "name": "zerotrie", - "version": "0.2.3", - "license_declared": "Unicode-3.0", - "repository": "https://github.com/unicode-org/icu4x" - }, - { - "name": "zerovec", - "version": "0.11.5", - "license_declared": "Unicode-3.0", - "repository": "https://github.com/unicode-org/icu4x" - }, - { - "name": "zerovec-derive", - "version": "0.11.2", - "license_declared": "Unicode-3.0", - "repository": "https://github.com/unicode-org/icu4x" - }, - { - "name": "zip", - "version": "2.4.2", - "license_declared": "MIT", - "repository": "https://github.com/zip-rs/zip2.git" - }, - { - "name": "zmij", - "version": "1.0.16", - "license_declared": "MIT", - "repository": "https://github.com/dtolnay/zmij" - }, - { - "name": "zopfli", - "version": "0.8.3", - "license_declared": "Apache-2.0", - "repository": "https://github.com/zopfli-rs/zopfli" - }, - { - "name": "zstd", - "version": "0.13.3", - "license_declared": "MIT", - "repository": "https://github.com/gyscos/zstd-rs" - }, - { - "name": "zstd-safe", - "version": "7.2.4", - "license_declared": "MIT OR Apache-2.0", - "repository": "https://github.com/gyscos/zstd-rs" - }, - { - "name": "zstd-sys", - "version": "2.0.16+zstd.1.5.7", - "license_declared": "MIT/Apache-2.0", - "repository": "https://github.com/gyscos/zstd-rs" - } - ], - "native_onnx": { - "version": "1.24.2", - "delivery": "static library from ort-sys pinned download table", - "archive_sha256": "acc1cba79c337594ead1d88ca72516147aa60054c84217b53399a31caa5ba671", - "third_party_notice_coverage": "not verified for Pyke-built archive" - }, - "installers": [ - { - "filename": "Pumas.Library-0.7.0.AppImage", - "sha256": "c309094efd1366cab3260f112baf26caef5c6715a1638a64c8b957be1b1bca4d", - "notices": { - "LICENSE.electron.txt": { - "present": true, - "sha256": "5154e165bd6c2cc0cfbcd8916498c7abab0497923bafcd5cb07673fe8480087d" - }, - "LICENSES.chromium.html": { - "present": true, - "sha256": "f9c475876b01bb4d654b8f630f11219cc96198efe91d7f2602a97f0f3c86c3cb" - }, - "resources/LICENSE.txt": { - "present": true, - "sha256": "cd39fd1216a0187a1c36350649249f3f98391c5c65426ec41c6c8043e1039281" - }, - "resources/THIRD-PARTY-NOTICES.txt": { - "present": false, - "sha256": null - } - }, - "sbom_present": false - }, - { - "filename": "pumas-library-electron_0.7.0_amd64.deb", - "sha256": "a56e1f02b8f7d61fe91e37ca971fb711c4dd97b282bc5ef30bc95a884217adf6", - "notices": { - "LICENSE.electron.txt": { - "present": true, - "sha256": "5154e165bd6c2cc0cfbcd8916498c7abab0497923bafcd5cb07673fe8480087d" - }, - "LICENSES.chromium.html": { - "present": true, - "sha256": "f9c475876b01bb4d654b8f630f11219cc96198efe91d7f2602a97f0f3c86c3cb" - }, - "resources/LICENSE.txt": { - "present": true, - "sha256": "cd39fd1216a0187a1c36350649249f3f98391c5c65426ec41c6c8043e1039281" - }, - "resources/THIRD-PARTY-NOTICES.txt": { - "present": false, - "sha256": null - } - }, - "sbom_present": false - } - ] -} diff --git a/docs/release-evidence/0.7.0/dependency-minimization.md b/docs/release-evidence/0.7.0/dependency-minimization.md deleted file mode 100644 index 45475dd43..000000000 --- a/docs/release-evidence/0.7.0/dependency-minimization.md +++ /dev/null @@ -1,90 +0,0 @@ -# Dependency minimization and macOS follow-up - -This follow-up supersedes the dependency graph and Linux artifact inputs in -[the earlier installer report](follow-up.md). Earlier hashes remain historical -receipts; those installers do not include these dependency reductions. - -## Resolved findings - -- Removed unused `lnk` and its parser/macro dependencies on all targets. -- Removed the unused core `zip` declaration; app-manager owns ZIP extraction. -- Disabled ZIP defaults and selected existing decoders explicitly. Removed AES - encryption, ZIP time conversions and the Zopfli compression encoder. Stored - and DEFLATE runtime extraction have a payload round-trip regression test. - Other existing decoders remain intentional compatibility support for upstream - archives; this release does not narrow accepted runtime download formats. -- Limited `sysinfo` to system/process, disk and multithreaded collection. Removed - unused component, network and user enumeration features. -- Removed JSON formatting from `tracing-subscriber` and unused form extraction - and tower logging from Axum. Kept the actual JSON/query/original-URI routing, - tracing and HTTP server features. -- Removed redundant `@types/loglevel` and unused direct frontend `glob` and - `brace-expansion`. Existing transitive security overrides remain in place. -- Made ONNX execution, `ort`, tokenizers and `half` optional through the core - `onnx-runtime` feature. Default core and RPC inference builds retain execution; - no-default core/RPC builds omit it. Model metadata remains available. - -Reqwest retains TLS, system proxy discovery, HTTP/2, text decoding, JSON and -streaming for existing upstream/runtime clients. Those are compatibility and -network behavior, not unused extras. Tokenizer `onig` and the selected ONNX -API/native build features remain for the verified Nomic inference path. - -The lockfile removes 29 Rust packages without adding or upgrading any. Cargo -feature contracts are checked for default RPC and separate no-default core/RPC -closures across Linux x64, macOS ARM64 and Windows x64; see -[the feature checks](dependency-features-minimized.txt). Those graph checks prove -resolution, not native compilation or execution on the other platforms. - -The regenerated attribution has 367 entries (previously 401). Freshness checks -now include Cargo manifests, so feature-only changes invalidate attribution. -The [audit](cargo-audit-minimized.json) against the advisory database refreshed during this release review -reports zero vulnerabilities/yanks and three unmaintained notices (`instant`, -`paste`, `bincode`); removing `lnk` also removed `proc-macro-error2`. - -## macOS acceptance - -CI now installs the pinned Python and runs `smoke-macos-package.py` on the DMG. -It mounts read-only, copies the app, unmounts, verifies version/resource hashes -and ARM64 executables, and starts packaged RPC and Electron from the copied app. -Smoke processes use a temporary registry and library. A failed desktop startup -has process-group cleanup. The claim is package loading/startup, not interactive -UI, child-shutdown correctness, signing/notarization or Gatekeeper acceptance. - -The helper and workflow receive local static checks. Native macOS execution, -interactive recovery and the Apple SDK attribution caveat remain explicit -platform acceptance requirements. macOS remains required; Windows remains best -effort. No remote workflow is dispatched or artifact published by this work. - -## Verification - -Both no-default suites, all-feature workspace Clippy and the default workspace -suite passed. The optimized RPC build/tests and standalone opt-in ONNX check -also passed; [Rust QA summary](qa-minimized.txt) records the commands and results. -Existing ignored live-network/host fixtures remain unchanged. Frontend types/lint/build and 678 tests, Electron lint and 11 tests, -launcher process tests, and 22 Torch source fixtures also passed. - -The full core suite exposed a five-second reconciliation fixture timeout under -parallel load. Its isolated run passed. The fixture now sleeps between polls -and uses a bounded 30-second budget for real filesystem/database work; it does -not assert a latency SLA. The full no-default and default suites passed after -that fixture change. Production reconciliation code is unchanged. - -The rebuilt Linux candidates are in `/tmp/pumas-070-minimized-linux/`; exact -hashes and limitations are in [the candidate receipt](minimized-linux-candidate.json). -The earlier Linux artifacts must not be published as evidence for this graph. - -| Rebuilt artifact claim | Evidence | -| --- | --- | -| Exact resources, embedded attribution and RPC health in both formats | [Resource checks](minimized-installer-resources.txt) | -| Real ONNX import/load/finite 256-dimensional embeddings/unload | [AppImage](minimized-appimage-onnx.txt), [Debian](minimized-debian-onnx.txt) | -| Desktop readiness, category menu, close and backend termination with the sandbox enabled | [AppImage](minimized-appimage-desktop.txt), [Debian](minimized-debian-desktop.txt) | -| Actual isolated Debian installation, maintainer scripts, alternatives, Electron identity and removal | [Install/remove](minimized-debian-install.txt) | - -Both SPDX inventories passed structural schema validation (format annotations -were disabled), and checksums cover both installers, both inventories, notices -and unsigned local provenance. Native component-level SBOM limits remain as -recorded in the attribution report. Desktop checks disabled GPU rendering; -chooser recovery evidence remains from the earlier candidate, with no chooser -code changed here. Live host AppArmor policy loading is outside the isolated -Debian installation claim. Electron-builder retains its existing desktop-name -association warning; this is not a dependency or installer-startup failure. diff --git a/docs/release-evidence/0.7.0/electron-upgrade.json b/docs/release-evidence/0.7.0/electron-upgrade.json deleted file mode 100644 index ed237fd9d..000000000 --- a/docs/release-evidence/0.7.0/electron-upgrade.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "date": "2026-09-14", - "electron_version": "43.7.0", - "product_version": "0.7.0", - "platform_verified": "linux-x86_64", - "input_sha256": { - "electron/package.json": "cdf4f1954bd50426423e927056393568987dd824ffb3a4e8ab25729fa70edac1", - "pnpm-lock.yaml": "d7612d38ff34fe72473c3168b80e6da59ae1eec0867368190d23f002f554a810", - "rust/Cargo.lock": "b2738a39bf41ad21b9ace2253b6886704f0d674c66aebd4ed258494f5466bca6" - }, - "staged_rpc_sha256": "a2273d9ea1d2176d08ef6bf0f530ac8b71b335f251a1ba01f508dd834b4a87ba", - "pnpm_audit": { - "raw_counts": { - "info": 0, - "low": 8, - "moderate": 29, - "high": 13, - "critical": 1 - }, - "actual_installed_version_advisories": [], - "workspace_importer_false_positive_count": 51 - }, - "legacy_extract_zip_present_in_lockfile": false, - "validation": { - "electron_lint": "passed", - "electron_types": "passed", - "desktop_tests": { - "passed": 172, - "failed": 0, - "skipped": 0, - "real_sandboxed_preload_oracle": true - }, - "contract_generation": "passed", - "contract_conformance_tests": 41, - "launcher_tests": 49, - "launcher_smoke": "passed", - "workflow_lint": "passed", - "installer_inventory": "passed", - "extracted_resource_hashes_and_rpc_health": "passed", - "both_extracted_desktop_startup_and_shutdown": "passed", - "both_extracted_electron_versions": "43.7.0" - }, - "installers": [ - { - "filename": "Pumas.Library-0.7.0.AppImage", - "sha256": "961bc495d8dd4820b5b6a08dcd975b5d99ec33647ca3dafd5a6f0602b7d27972", - "bytes": 154146664 - }, - { - "filename": "pumas-library-electron_0.7.0_amd64.deb", - "sha256": "850a18c4eb5c8ef0650c0842eb5646721356efeb398d6470bc253264c2c2ff10", - "bytes": 120103200 - } - ], - "remaining_limits": [ - "Native Windows and macOS not exercised locally", - "Combined third-party notices and per-installer SPDX SBOMs remain incomplete", - "Rust der update remains separate", - "Initial implicit test-import download stalled; CI now initializes runtime explicitly with timeout and skipped native tests no longer load the runtime" - ] -} diff --git a/docs/release-evidence/0.7.0/extractor-reproduction.json b/docs/release-evidence/0.7.0/extractor-reproduction.json deleted file mode 100644 index 029383b46..000000000 --- a/docs/release-evidence/0.7.0/extractor-reproduction.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "fixture": "temporary sibling sentinel only", - "outside_destination_overwritten": true -} diff --git a/docs/release-evidence/0.7.0/final-linux-candidate.json b/docs/release-evidence/0.7.0/final-linux-candidate.json deleted file mode 100644 index 4c050b8ce..000000000 --- a/docs/release-evidence/0.7.0/final-linux-candidate.json +++ /dev/null @@ -1,79 +0,0 @@ -{ - "date": "2026-09-14", - "kind": "local-linux-candidate-follow-up", - "source_base": "45d491a9", - "der_version": "0.8.2", - "cargo_audit": { - "vulnerabilities": 0, - "yanked": 0, - "unmaintained": 4 - }, - "artifacts": [ - { - "filename": "Pumas.Library-0.7.0.AppImage", - "bytes": 154483121, - "sha256": "87e59b8be5a6acc299916dbc8b0eed8db814301dc126c0a23586001bd80ec5b6" - }, - { - "filename": "Pumas.Library-0.7.0.AppImage.spdx.json", - "bytes": 364746, - "sha256": "e367e9f28d40ba55f68aa3227057ee69d0b0e7228f8b9912ef3a8e7b4e0377a4" - }, - { - "filename": "THIRD-PARTY-NOTICES-0.7.0.txt", - "bytes": 4256762, - "sha256": "71dbacd48cc0cffc59ea8bd692dcf04de5789e4d4a521a6e738923c268a435bf" - }, - { - "filename": "checksums-sha256.txt", - "bytes": 619, - "sha256": "955dadba723d7c7fdfe2829333ab14bf9a9581c5426f62a4e7b4295ddd283e95" - }, - { - "filename": "pumas-library-0.7.0.provenance.jsonl", - "bytes": 1672, - "sha256": "6ad8395fdea4e06c2ff64cc791aa46b1a7e1f49a61798ee884e8bea52d8effb7" - }, - { - "filename": "pumas-library-electron_0.7.0_amd64.deb", - "bytes": 120180252, - "sha256": "b07af27025c63dd5f777b92917a290d4fa4b01f728e27fe0052c34445aefa375" - }, - { - "filename": "pumas-library-electron_0.7.0_amd64.deb.spdx.json", - "bytes": 360039, - "sha256": "3e1070a3638f87f6ec7061b290eebcebf2cf562c47dcf743ef92b0afced64cec" - } - ], - "notices_entries": 401, - "evidence_scope": { - "spdx": "Exact extracted application files plus conservative dependency attribution closure; native components retain vendor notices", - "provenance": "Unsigned local self-report; upstream ONNX archive attestation verified separately" - }, - "remaining_native_targets": [ - "macos-arm64", - "windows-x86_64-msvc" - ], - "checks": { - "release_rpc_build": "passed", - "optimized_rpc_suites": "passed", - "final_cargo_audit": "passed, four reviewed maintenance notices", - "attribution_freshness_and_negative_tests": "passed", - "workflow_lint": "passed", - "spdx_2_3_schema": "passed, format annotations not validated", - "both_installer_resource_hashes_and_health": "passed", - "both_packaged_onnx_import_load_embedding_unload": "passed", - "both_desktop_filter_and_preload_rpc": "passed", - "both_desktop_close_and_backend_termination": "passed", - "both_native_chooser_persistence_and_restart": "passed on real X11 desktop", - "debian_install_alternatives_version_and_remove": "passed in isolated user/mount namespace", - "both_desktop_default_electron_sandbox": "passed" - }, - "environment_limits": [ - "Desktop checks also passed with the default Electron sandbox; GPU rendering was disabled", - "Virtual-display portal chooser could not be qualified; real desktop chooser path passed", - "No native macOS or Windows verification", - "SPDX native transitive components retained through vendor notices rather than exhaustive component-level identities", - "Local provenance is unsigned and self-reported" - ] -} diff --git a/docs/release-evidence/0.7.0/follow-up.md b/docs/release-evidence/0.7.0/follow-up.md deleted file mode 100644 index fd2c3efdf..000000000 --- a/docs/release-evidence/0.7.0/follow-up.md +++ /dev/null @@ -1,88 +0,0 @@ -# Dependency, attribution and installer follow-up - -Completed locally on 2026-09-14. The exact Linux artifacts and metadata hashes -are recorded in [final-linux-candidate.json](final-linux-candidate.json). -Candidate files are in `/tmp/pumas-070-final-linux/`; nothing was pushed, tagged, -or published and no remote workflow was dispatched. - -## Dependency follow-up - -Only `der` changed in Cargo.lock: 0.8.0 to 0.8.2, plus its checksum. The default -optimized RPC/ONNX build and optimized RPC suites passed. The -[final Cargo audit](cargo-audit-final.json) contains no vulnerabilities or yanked -versions. The four reviewed unmaintained-dependency notices remain tracked in -[the Rust review](../../dependency-review-rust-0.7.0.md), without blanket suppression. - -## Attribution and metadata - -The [attribution report](../../release-attribution/0.7.0/README.md) describes the -401 package notice entries, exact upstream sources, source-availability links, -SQLite dedication, preserved Electron/Chromium notices and ONNX/Pyke notices. -The exact ONNX archive's upstream signature/provenance was verified; its embedded -source commit matches the versioned notice source. - -Both installers embed the current combined notice and project license. Packaging -and CI now reject stale attribution inputs or missing/altered notice material. -Negative checks for dependency drift, altered upstream text and missing notices -passed. Python lint/format checks and Actionlint also passed. - -Both per-installer SPDX 2.3 inventories passed the official JSON schema's -structural validation (format annotations were disabled in the validator). -They describe exact extracted application files and a conservative dependency -attribution closure; vendor notices retain native transitive attribution without -inventing individually resolved native component versions. The local provenance -statement is explicitly unsigned/self-reported and claims no SLSA level. -Checksums cover both installers, both SPDX files, the combined release notice and -provenance statement. CI builds must regenerate their own metadata. - -## Linux installer evidence - -| Claim | Result and evidence | -| --- | --- | -| Exact AppImage/Deb extraction, embedded notices and build-input hashes | Passed: [resource checks](linux-installer-resources.txt) | -| Packaged RPC health in both formats | Passed in the same resource checks | -| Real ONNX import, load, 256-dimensional finite gateway embeddings and unload | Passed: [AppImage](appimage-onnx.txt), [Deb](debian-onnx.txt) | -| Renderer readiness, preload-to-RPC access and category-menu interaction | Passed: [AppImage](appimage-desktop.txt), [Deb](debian-desktop.txt) | -| Window close, exit code zero and backend port shutdown | Passed in both desktop records | -| Desktop readiness, menu interaction and shutdown with the default Electron sandbox | Passed: [AppImage](appimage-default-sandbox.txt), [Deb](debian-default-sandbox.txt); GPU rendering disabled | -| Corrupt root preference, native directory selection, durable replacement and restart into ready state | Passed: [AppImage](appimage-root-recovery.txt), [Deb](debian-root-recovery.txt) | -| Debian install, maintainer scripts/triggers, alternatives registration, version identity and removal | Passed: [isolated installation](debian-install-remove.txt) | - -The ONNX fixture was copied into a temporary library and was never modified in -place. The Debian check used user/mount/network namespaces, copies of package -state and the required writable configuration directories, with the host root -read-only. It exercised real dpkg installation/removal and maintainer scripts, -not just archive extraction. Live host AppArmor policy loading was outside that -namespace's acceptance claim. - -Initial chooser automation was sensitive to focus and GTK's distinction between -opening a directory and accepting it. Real desktop selection and restart passed; -the separate virtual-display portal backend was unavailable. These results do -not qualify every desktop portal implementation. The recorded recovery path -used the real native chooser, not a substituted dialog or direct preference edit. -The corrupt preference was the input fixture; the application wrote its repair. - -## Reproduce - -- `python3 scripts/release/smoke-linux-packages.py CANDIDATE_DIRECTORY` -- `python3 scripts/release/verify-packaged-onnx.py PACKAGED_RPC NOMIC_FIXTURE_ROOT` -- `python3 scripts/release/verify-deb-install.py CANDIDATE_DEB` -- `python3 scripts/release/write-linux-metadata.py CANDIDATE_DIRECTORY EXTRACTED_DIRECTORY` -- `sha256sum -c checksums-sha256.txt` from the candidate directory. - -For desktop evidence, launch each extracted executable with isolated -`XDG_CONFIG_HOME` and a temporary library, confirm the category filter and library -view, and close the window. Confirm both the desktop and its backend terminate. -For recovery, put malformed JSON in the isolated application's -`launcher-root.json`, start without an explicit library override, select a valid -root in the native chooser and confirm the restarted app is ready and the new -preference survives. Model payloads and personal libraries are not test fixtures. - -## Remaining release boundaries - -GitHub CI has not run this candidate. Native macOS and Windows installation and -behavior remain unverified; Windows remains best effort and its known non-Unix -mutation/publication limitations are unchanged. The Apple bridge upstream -licensing statement retains its SDK-related caveat for native platform review. -No Torch GPU runtime distribution or host-binding artifact is newly qualified. -These local results are not authorization to publish unverified target artifacts. diff --git a/docs/release-evidence/0.7.0/linux-installer-resources.txt b/docs/release-evidence/0.7.0/linux-installer-resources.txt deleted file mode 100644 index 2303740c4..000000000 --- a/docs/release-evidence/0.7.0/linux-installer-resources.txt +++ /dev/null @@ -1,5 +0,0 @@ -Verified 2 nonempty installers for linux v0.7.0 -{"health": "passed", "inference_disabled": false} -{"health": "passed", "inference_disabled": false} -Verified extracted installer resources and RPC: /tmp/pumas-installer-smoke-gk5q7k7w/squashfs-root/resources -Verified extracted installer resources and RPC: /tmp/pumas-installer-smoke-gk5q7k7w/deb/opt/Pumas Library/resources diff --git a/docs/release-evidence/0.7.0/minimized-appimage-desktop.txt b/docs/release-evidence/0.7.0/minimized-appimage-desktop.txt deleted file mode 100644 index 097a63618..000000000 --- a/docs/release-evidence/0.7.0/minimized-appimage-desktop.txt +++ /dev/null @@ -1,7 +0,0 @@ -{ - "root": "/tmp/pumas-ui-verify-7GkhgN", - "library_ready": true, - "preload_rpc_models": true, - "category_menu": "Network online · model library ready\nAll Categories\n\nNo library models found\n\nChoose an existing Pumas library root or its shared-resources/models folder to load your saved models into this packaged app.\n\nUse Existing Library\nLink Health\nAll links healthy\n0 links\nMigration Reports\n0 items" -} -{"exit":0,"backend_closed":true,"evidence":"/tmp/pumas-ui-verify-7GkhgN"} diff --git a/docs/release-evidence/0.7.0/minimized-appimage-onnx.txt b/docs/release-evidence/0.7.0/minimized-appimage-onnx.txt deleted file mode 100644 index b80092b61..000000000 --- a/docs/release-evidence/0.7.0/minimized-appimage-onnx.txt +++ /dev/null @@ -1,4 +0,0 @@ -import {"error": null, "model_id": "embedding/fixture/nomic", "model_path": "embedding/fixture/nomic", "path": "/tmp/pumas-packaged-inference-rw5lh_ly/shared-resources/models/embedding/fixture/nomic", "security_tier": null, "success": true} -profile {'profile_id': 'onnx-verification', 'snapshot_required': True, 'success': True} -launch {'ready': True, 'success': True} -{"binary": "/tmp/pumas-070-minimized-extracted/appimage/squashfs-root/resources/pumas-rpc", "import": "passed", "load": "passed", "embedding_dimensions": 256, "finite": true, "unload": "passed"} diff --git a/docs/release-evidence/0.7.0/minimized-debian-desktop.txt b/docs/release-evidence/0.7.0/minimized-debian-desktop.txt deleted file mode 100644 index ceab00dc5..000000000 --- a/docs/release-evidence/0.7.0/minimized-debian-desktop.txt +++ /dev/null @@ -1,7 +0,0 @@ -{ - "root": "/tmp/pumas-ui-verify-dyfG3b", - "library_ready": true, - "preload_rpc_models": true, - "category_menu": "Network online · model library ready\nAll Categories\n\nNo library models found\n\nChoose an existing Pumas library root or its shared-resources/models folder to load your saved models into this packaged app.\n\nUse Existing Library\nLink Health\nAll links healthy\n0 links\nMigration Reports\n0 items" -} -{"exit":0,"backend_closed":true,"evidence":"/tmp/pumas-ui-verify-dyfG3b"} diff --git a/docs/release-evidence/0.7.0/minimized-debian-install.txt b/docs/release-evidence/0.7.0/minimized-debian-install.txt deleted file mode 100644 index 6183a602d..000000000 --- a/docs/release-evidence/0.7.0/minimized-debian-install.txt +++ /dev/null @@ -1,23 +0,0 @@ -Isolated root: /tmp/pumas-deb-install-7xu8wqm0 -Selecting previously unselected package pumas-library-electron. -(Reading database ... 842242 files and directories currently installed.) -Preparing to unpack /tmp/candidate.deb ... -Unpacking pumas-library-electron (0.7.0) ... -Setting up pumas-library-electron (0.7.0) ... -update-alternatives: using /opt/Pumas Library/pumas-library-electron to provide /usr/bin/pumas-library-electron (pumas-library-electron) in auto mode -Skipping the installation of the AppArmor profile as this version of AppArmor does not seem to support the bundled profile -Processing triggers for hicolor-icon-theme (0.17-2) ... -Processing triggers for mailcap (3.70+nmu1ubuntu1.24.04.1) ... -Processing triggers for gnome-menus (3.36.0-1.1ubuntu3) ... -Processing triggers for desktop-file-utils (0.27-2build1) ... -install ok installed 0.7.0 -43.7.0 -(Reading database ... 842342 files and directories currently installed.) -Removing pumas-library-electron (0.7.0) ... -update-alternatives: warning: alternative /opt/Pumas Library/pumas-library-electron (part of link group pumas-library-electron) doesn't exist; removing from list of alternatives -update-alternatives: warning: /etc/alternatives/pumas-library-electron is dangling; it will be updated with best choice -Processing triggers for mailcap (3.70+nmu1ubuntu1.24.04.1) ... -Processing triggers for gnome-menus (3.36.0-1.1ubuntu3) ... -Processing triggers for desktop-file-utils (0.27-2build1) ... -Processing triggers for hicolor-icon-theme (0.17-2) ... -Isolated Debian installation, alternatives, runtime identity and removal passed diff --git a/docs/release-evidence/0.7.0/minimized-debian-onnx.txt b/docs/release-evidence/0.7.0/minimized-debian-onnx.txt deleted file mode 100644 index aa43b5313..000000000 --- a/docs/release-evidence/0.7.0/minimized-debian-onnx.txt +++ /dev/null @@ -1,4 +0,0 @@ -import {"error": null, "model_id": "embedding/fixture/nomic", "model_path": "embedding/fixture/nomic", "path": "/tmp/pumas-packaged-inference-g6mzd2fk/shared-resources/models/embedding/fixture/nomic", "security_tier": null, "success": true} -profile {'profile_id': 'onnx-verification', 'snapshot_required': True, 'success': True} -launch {'ready': True, 'success': True} -{"binary": "/tmp/pumas-070-minimized-extracted/deb/opt/Pumas Library/resources/pumas-rpc", "import": "passed", "load": "passed", "embedding_dimensions": 256, "finite": true, "unload": "passed"} diff --git a/docs/release-evidence/0.7.0/minimized-installer-resources.txt b/docs/release-evidence/0.7.0/minimized-installer-resources.txt deleted file mode 100644 index c3a287731..000000000 --- a/docs/release-evidence/0.7.0/minimized-installer-resources.txt +++ /dev/null @@ -1,5 +0,0 @@ -Verified 2 nonempty installers for linux v0.7.0 -{"health": "passed", "inference_disabled": false} -{"health": "passed", "inference_disabled": false} -Verified extracted installer resources and RPC: /tmp/pumas-installer-smoke-mzktco6q/squashfs-root/resources -Verified extracted installer resources and RPC: /tmp/pumas-installer-smoke-mzktco6q/deb/opt/Pumas Library/resources diff --git a/docs/release-evidence/0.7.0/minimized-linux-candidate.json b/docs/release-evidence/0.7.0/minimized-linux-candidate.json deleted file mode 100644 index 52eb742f4..000000000 --- a/docs/release-evidence/0.7.0/minimized-linux-candidate.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "date": "2026-09-14", - "source_commit": "7e3faf332aa2e1bddef9217b8d94a4b810a8067d", - "kind": "local-linux-candidate-after-dependency-minimization", - "directory": "/tmp/pumas-070-minimized-linux", - "artifacts": [ - { - "filename": "Pumas.Library-0.7.0.AppImage", - "bytes": 154163302, - "sha256": "9e7d52db4d85a624b85c53edda0b6ac134aa0a0fb36c7413dae3dc6de29a6b12" - }, - { - "filename": "Pumas.Library-0.7.0.AppImage.spdx.json", - "bytes": 339510, - "sha256": "8432373fab1eacbf4e6aadcd17bc2b4fbc3fd0dc90d25281db570aa39ca4abbc" - }, - { - "filename": "THIRD-PARTY-NOTICES-0.7.0.txt", - "bytes": 3924204, - "sha256": "e4fca768460b0db777f4a2f226f5f20a71a9d0bf349a4aab5cf89fb1581fdcd2" - }, - { - "filename": "checksums-sha256.txt", - "bytes": 619, - "sha256": "9e0cf144ab61d5fd10d514d56804b70fe5651809032a15dc88fcf9c3f72028fd" - }, - { - "filename": "pumas-library-0.7.0.provenance.jsonl", - "bytes": 2080, - "sha256": "e53f2443e82976de01ba0be073dc7ed3fbf5fe0a296fa104634e401a0ccd42db" - }, - { - "filename": "pumas-library-electron_0.7.0_amd64.deb", - "bytes": 119948220, - "sha256": "41770b006cad8e1fce5ed5eaca2fb359fdde252caf30a9515f55c673938e6738" - }, - { - "filename": "pumas-library-electron_0.7.0_amd64.deb.spdx.json", - "bytes": 334803, - "sha256": "68aa3818ed7889bcc39a2e3356c7976ddd0249a859684ed5964d912aefc29320" - } - ], - "notices_entries": 367, - "rust_lock_packages_removed": 29, - "rust_lock_packages_added": 0, - "audit": { - "vulnerabilities": 0, - "yanked": 0, - "unmaintained": 3 - }, - "installer_checks": { - "resources_and_health": "passed in both formats", - "onnx_import_load_embed_unload": "passed in both formats", - "desktop_sandbox_readiness_menu_and_shutdown": "passed in both formats, GPU disabled", - "debian_install_remove": "passed in isolated user/mount/network namespaces", - "spdx_schema": "passed, format annotations disabled", - "checksums": "passed" - }, - "limitations": [ - "Native macOS and Windows execution pending", - "macOS smoke helper has local static validation; native DMG and Gatekeeper acceptance are outstanding", - "Windows remains best effort", - "Linux chooser recovery evidence belongs to the earlier candidate; no chooser code changed in this follow-up", - "SPDX inventories do not individually resolve every native vendor component", - "Provenance is unsigned and self-reported", - "Live host AppArmor policy loading is outside the Debian namespace check" - ], - "qa": { - "headless-core": "passed", - "headless-rpc": "passed", - "clippy": "passed", - "default-workspace": "passed", - "release-build": "passed", - "onnx-only-check": "passed", - "release-rpc-tests": "passed" - } -} diff --git a/docs/release-evidence/0.7.0/pnpm-audit.json b/docs/release-evidence/0.7.0/pnpm-audit.json deleted file mode 100644 index 09cb2ef0d..000000000 --- a/docs/release-evidence/0.7.0/pnpm-audit.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "metadata": { - "vulnerabilities": { - "info": 0, - "low": 8, - "moderate": 29, - "high": 15, - "critical": 1 - }, - "dependencies": 715, - "devDependencies": 0, - "optionalDependencies": 0, - "totalDependencies": 715 - }, - "real_dependency_advisories": [ - { - "id": "GHSA-jmr9-qjv8-65gv", - "package": "extract-zip", - "severity": "high", - "url": "https://github.com/advisories/GHSA-jmr9-qjv8-65gv", - "findings": [ - { - "version": "2.0.1", - "paths": [ - "electron>electron>extract-zip" - ] - } - ] - }, - { - "id": "GHSA-7pqw-9j4j-h8q3", - "package": "extract-zip", - "severity": "high", - "url": "https://github.com/advisories/GHSA-7pqw-9j4j-h8q3", - "findings": [ - { - "version": "2.0.1", - "paths": [ - "electron>electron>extract-zip" - ] - } - ] - } - ], - "workspace_importer_false_positive_count": 51 -} diff --git a/docs/release-evidence/0.7.0/qa-minimized.txt b/docs/release-evidence/0.7.0/qa-minimized.txt deleted file mode 100644 index d12552aea..000000000 --- a/docs/release-evidence/0.7.0/qa-minimized.txt +++ /dev/null @@ -1,111 +0,0 @@ -Local verification after dependency minimization; all listed invocations exited zero. -Rust tests retain their existing ignored fixtures; no new ignore or audit suppression was added. - -cargo test --locked --offline --manifest-path rust/Cargo.toml -p pumas-library --no-default-features -Finished `test` profile [unoptimized + debuginfo] target(s) in 36.70s -Running unittests src/lib.rs (rust/target/debug/deps/pumas_library-3679247c9cd843d5) -test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 1389 filtered out; finished in 0.00s -test result: ok. 1384 passed; 0 failed; 6 ignored; 0 measured; 0 filtered out; finished in 59.37s -Running tests/api_tests.rs (rust/target/debug/deps/api_tests-e5abb0e914624e10) -test result: ok. 36 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 30.63s -Running tests/artifact_load_target_contract_fixtures.rs (rust/target/debug/deps/artifact_load_target_contract_fixtures-e8b253241ab7f47c) -test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s -Running tests/dependency_requirements_contract_fixtures.rs (rust/target/debug/deps/dependency_requirements_contract_fixtures-8f9971263b6aa507) -test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s -Running tests/intent_api_tests.rs (rust/target/debug/deps/intent_api_tests-d4ccdbf154e102bc) -test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 6.47s -Running tests/intent_desired_crash_tests.rs (rust/target/debug/deps/intent_desired_crash_tests-74ecffdc320d523a) -test result: ok. 1 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.92s -Running tests/intent_desired_state_tests.rs (rust/target/debug/deps/intent_desired_state_tests-ff05a1d4b0ad9122) -test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.03s -Running tests/intent_ipc_tests.rs (rust/target/debug/deps/intent_ipc_tests-93486c303cf77fa4) -test result: ok. 2 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 2.39s -Running tests/link_health.rs (rust/target/debug/deps/link_health-481258a300c9f710) -test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s -Running tests/metadata_artifact_tests.rs (rust/target/debug/deps/metadata_artifact_tests-b42b7a1c0a547493) -test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s -Running tests/model_ref_contract_fixtures.rs (rust/target/debug/deps/model_ref_contract_fixtures-3b6754f1c32e4285) -test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s -Running tests/package_facts_contract_fixtures.rs (rust/target/debug/deps/package_facts_contract_fixtures-b9bff893ecb2b0d2) -test result: ok. 16 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s -Running tests/package_facts_resolution.rs (rust/target/debug/deps/package_facts_resolution-6104add0fdfb6f02) -test result: ok. 35 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.24s -Running tests/runtime_profile_contract_fixtures.rs (rust/target/debug/deps/runtime_profile_contract_fixtures-4f341458c6d39e0c) -test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s -Doc-tests pumas_library -test result: ok. 6 passed; 0 failed; 8 ignored; 0 measured; 0 filtered out; finished in 1.01s - -cargo test --locked --offline --manifest-path rust/Cargo.toml -p pumas-rpc --no-default-features -Finished `test` profile [unoptimized + debuginfo] target(s) in 9.18s -Running unittests src/main.rs (rust/target/debug/deps/pumas_rpc-494b34459de13d4d) -test result: ok. 159 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 27.75s -Running tests/integration_tests.rs (rust/target/debug/deps/integration_tests-46c1f4254a19a02d) -test result: ok. 13 passed; 0 failed; 10 ignored; 0 measured; 0 filtered out; finished in 4.41s -Running tests/intent_integration_tests.rs (rust/target/debug/deps/intent_integration_tests-00caf66cb21ef75f) -test result: ok. 2 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 7.03s - -cargo clippy --locked --offline --manifest-path rust/Cargo.toml --workspace --exclude pumas_rustler --all-targets --all-features -- -D warnings -Finished `dev` profile [unoptimized + debuginfo] target(s) in 39.10s - -cargo test --locked --offline --manifest-path rust/Cargo.toml --workspace --exclude pumas_rustler -Finished `test` profile [unoptimized + debuginfo] target(s) in 1m 34s -Running unittests src/lib.rs (rust/target/debug/deps/pumas_app_manager-aeebb50c8072d781) -test result: ok. 91 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.50s -Running unittests src/lib.rs (rust/target/debug/deps/pumas_library-cea9a9eb945cff48) -test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 1413 filtered out; finished in 0.00s -test result: ok. 1408 passed; 0 failed; 6 ignored; 0 measured; 0 filtered out; finished in 64.21s -Running tests/api_tests.rs (rust/target/debug/deps/api_tests-cd0dba9428b4a530) -test result: ok. 36 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 32.97s -Running tests/artifact_load_target_contract_fixtures.rs (rust/target/debug/deps/artifact_load_target_contract_fixtures-65e4aef0dfad9616) -test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s -Running tests/dependency_requirements_contract_fixtures.rs (rust/target/debug/deps/dependency_requirements_contract_fixtures-914cb6cd376c0093) -test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s -Running tests/intent_api_tests.rs (rust/target/debug/deps/intent_api_tests-71150101189eb342) -test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 5.72s -Running tests/intent_desired_crash_tests.rs (rust/target/debug/deps/intent_desired_crash_tests-0aa39615e5bca719) -test result: ok. 1 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.86s -Running tests/intent_desired_state_tests.rs (rust/target/debug/deps/intent_desired_state_tests-1e18227dd0320f9e) -test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.83s -Running tests/intent_ipc_tests.rs (rust/target/debug/deps/intent_ipc_tests-0e47576da44fdad1) -test result: ok. 2 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 2.27s -Running tests/link_health.rs (rust/target/debug/deps/link_health-619a5a8ce99384bf) -test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s -Running tests/metadata_artifact_tests.rs (rust/target/debug/deps/metadata_artifact_tests-8db257da69a908ec) -test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s -Running tests/model_ref_contract_fixtures.rs (rust/target/debug/deps/model_ref_contract_fixtures-35e160f540e2f5ad) -test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s -Running tests/package_facts_contract_fixtures.rs (rust/target/debug/deps/package_facts_contract_fixtures-e4f48d8f22f02c8e) -test result: ok. 16 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s -Running tests/package_facts_resolution.rs (rust/target/debug/deps/package_facts_resolution-58cc3e089b4c2599) -test result: ok. 35 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.96s -Running tests/runtime_profile_contract_fixtures.rs (rust/target/debug/deps/runtime_profile_contract_fixtures-8d19904e29c64db4) -test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s -Running unittests src/main.rs (rust/target/debug/deps/pumas_rpc-f1f6e8d49d30e241) -test result: ok. 227 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 38.02s -Running tests/integration_tests.rs (rust/target/debug/deps/integration_tests-8294b102c5f508c2) -test result: ok. 16 passed; 0 failed; 10 ignored; 0 measured; 0 filtered out; finished in 6.16s -Running tests/intent_integration_tests.rs (rust/target/debug/deps/intent_integration_tests-10302b083313616e) -test result: ok. 2 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 3.86s -Running unittests src/lib.rs (rust/target/debug/deps/pumas_uniffi-39200f28d23d1a2c) -test result: ok. 16 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s -Doc-tests pumas_app_manager -test result: ok. 0 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s -Doc-tests pumas_library -test result: ok. 6 passed; 0 failed; 8 ignored; 0 measured; 0 filtered out; finished in 1.32s -Doc-tests pumas_uniffi -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s - -cargo build --locked --offline --manifest-path rust/Cargo.toml -p pumas-rpc --release -Finished `release` profile [optimized] target(s) in 5m 32s - -cargo check --locked --offline --manifest-path rust/Cargo.toml -p pumas-library --no-default-features --features onnx-runtime -Finished `dev` profile [unoptimized + debuginfo] target(s) in 19.91s - -cargo test --locked --offline --manifest-path rust/Cargo.toml -p pumas-rpc --release -Finished `release` profile [optimized] target(s) in 6m 19s -Running unittests src/main.rs (rust/target/release/deps/pumas_rpc-f827aa8c33596052) -test result: ok. 227 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 25.14s -Running tests/integration_tests.rs (rust/target/release/deps/integration_tests-ea7c8aa3c561cbc6) -test result: ok. 16 passed; 0 failed; 10 ignored; 0 measured; 0 filtered out; finished in 4.57s -Running tests/intent_integration_tests.rs (rust/target/release/deps/intent_integration_tests-379250b16b3a2e00) -test result: ok. 2 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 2.81s diff --git a/docs/release-notes-0.7.0.md b/docs/release-notes-0.7.0.md deleted file mode 100644 index fddef776a..000000000 --- a/docs/release-notes-0.7.0.md +++ /dev/null @@ -1,220 +0,0 @@ -# Pumas Library v0.7.0 - -Pumas Library 0.7.0 expands the headless model-management core introduced in -0.6. Applications can discover, acquire, validate, retain, convert, and access -local AI models through a shared library service. - -Optional inference integrations provide convenient local execution for -applications, development, and testing. Model management remains Pumas's primary -role; the gateway does not provide production scheduling, distributed inference, -GPU arbitration across tenants, autoscaling, or production request batching. - -## Headless operation and model intent - -The core and RPC backend can be built and run independently of Electron and the -frontend. Direct Cargo builds require no Node or Corepack; the convenience -launcher wrappers still require Node. GUI and inference integrations can be -selected independently. - -The new **Model Intent API** lets an application describe what it needs and ask -Pumas to reconcile that requirement against the local library. It supports local -queries, model requests, optional upstream acquisition, acquisition status, and -durable consumer declarations. Requirements can constrain source, Hugging Face -repository, revision, artifact, format, and quantization. Upstream branch and tag -selectors are resolved to immutable commits before acquisition. - -Durable declarations survive client disconnection and Pumas restarts. Different -consumers retain independent requirements, and declarations participate in -checks that protect models from destructive operations. Releasing a declaration -removes the consumer's requirement without deleting the model. - -The RPC operations are `intent_query_models`, `intent_get_model`, -`intent_get_model_status`, `intent_ensure_model`, `intent_get_ensure_status`, -`intent_list_declarations`, and `intent_release_model`. - -## Ownership, concurrency, and recovery - -0.7 strengthens the explicit ownership model established in 0.6: -`PumasApi` and `PumasLibraryInstance` own a library root, while `PumasLocalClient` -connects to an existing owner and `PumasReadOnlyLibrary` provides direct read-only -access. A second owning instance fails when another live process owns the root. - -**Copied-import compatibility change:** `ModelImporter::import` and -`import_with_progress` (including copied Diffusers bundles) now require the -lifecycle-owned `ModelLibrary` provided by `PumasApi` / `PumasLibraryInstance`. -Constructing `ModelLibrary` and `ModelImporter` directly no longer admits these -copy mutations: it returns an actionable `PumasError::Config` before staging. -Use the existing owning API for imports; standalone read-only access remains -available. There is no per-call runtime fallback or new standalone mutation API. - -Admitted copied imports continue to publication or workspace settlement after -the initiating caller disconnects. Shutdown rejects new admission and drains -that work. Unpublished metadata is excluded from model discovery. Copy/name -collisions preserve source files. Copy, hash, metadata, or rename failures clean -only the held workspace; observed replacement or failed cleanup reports a -retained/unknown workspace and the original error, with no automatic cleanup -retry. A successful rename is never rolled back for a later sync, confirmation, -or indexing failure; that error identifies the published model for inspection. -Source symlinks/non-regular entries and payloads colliding with the reserved -`metadata.json`, `metadata.json.bak`, `overrides.json` or -`.pumas_import_publication.json` names are refused, including original names, -normalized aliases and filesystem-equivalent collisions. - -New copied imports persist Pending metadata until a versioned receipt confirms -the exact published payload. Windows publication releases only child directory -handles and verifies their identities after rename. Unknown or replaced content -remains unavailable and retained. Existing Pending index entries cannot be -promoted by watchers, cached package facts, metadata edits or in-place recovery. -A confirmed payload can still report uncertain final metadata durability; that -error is not success and does not authorize rollback or an automatic retry. -There is currently no supported API to resume a retained Pending import; retain -its payload and receipt for manual diagnosis. Digests are computed during copying, -then one full destination hash verifies the payload after the last callback. -Cold adoption of an already Ready asset also verifies its complete payload. - -Canonical metadata damage cannot be hidden by Ready cached facts. Conditional -index commits protect newer publication state from stale watcher/rebuild results, -and deep rebuild preserves Pending fences. Metadata/override edits require a -finalized Ready index; normal metadata backups remain supported. Primary metadata -and publication receipts have a shared 16 MiB producer/reader limit. - -Same-root reclassification preserves publication identity through a conditional -index-ID transfer. Cross-root merge now refuses copied assets using the new receipt -before moving them; a supported re-publication workflow is not yet available. -Legacy assets without the new receipt retain their existing readiness contract. - -Downloads and acquisition now have stronger root-level mutation exclusion, -durable ownership, restart reconciliation, cancellation, and shutdown handling. -Admitted work is retained by the backend across initiating-client disconnection. -Destructive-operation checks and explicit uncertain outcomes help preserve -recovery state when an operation is interrupted. - -Hugging Face downloads also gain stricter destination validation, resumable -acquisition handling, and coordination with local metadata and recovery state. - -Startup shard inspection is now read-only. It reports nested shard sets beneath -canonical model roots, missing ordinal ranges, ambiguous names, and unavailable -or invalid index evidence. It no longer starts new downloads using a repository -guessed from a shard directory name. Persisted authorized download recovery and -the separate interrupted-download path retain their existing behavior. An -orphan shard set needs an explicit recovery/download request with a verified -source; matching filename counts alone do not prove a complete model package. - -Rust consumers can use `ModelImporter::discover_shard_recovery` (or its async -variant) for the typed report and must retain its incomplete-scan diagnostics. -The old Vec-returning helpers are deprecated compatibility projections, with -nested filenames relative to the canonical model root. They cannot prove -completeness or authorize downloads. Inspection does not migrate or clean up -existing model directories. - -## Backend-owned conversion - -Applications can request conversion independently of the GUI. Pumas manages -conversion dependencies, setup state, process ownership, cancellation, output -publication, and incomplete-operation recovery. - -Workflows include GGUF conversion through managed llama.cpp tooling and new FP8 -and NVFP4 Safetensors outputs: - -- **FP8:** compatible local Transformers models, using E4M3FN linear weights, - block scaling, and BF16 embeddings and output weights where appropriate. -- **NVFP4:** managed NVIDIA Model Optimizer tooling, with packed E2M1 weights - and associated scaling metadata. - -Environment and root locking, readiness validation, and collision-safe output -publication protect ongoing conversions and existing model files. - -## Optional local inference - -The Pumas gateway exposes provider capabilities and live endpoints through RPC. -Backend state distinguishes installed runtimes, runtime profiles, model routes, -loading models, ready served instances, and their available capabilities. -Model-library, download, runtime-profile, serving, and telemetry events keep -clients informed without making the desktop UI the state owner. - -### ONNX Runtime embeddings - -The in-process ONNX Runtime provider loads supported models, tokenizes input, -executes inference, post-processes embeddings, and unloads sessions. Embedding -models are available through the gateway without a Python sidecar. - -### Torch image generation - -The optional Torch integration adds adapters for Nunchaku Z-Image-Turbo and -FLUX.2 Klein. Ready models advertise `image_generation`; bounded single-image -requests use supported output dimensions and return PNG image data. - -The integration manages model components and runtime dependencies, with hardware -telemetry, per-device operation ownership, cancellation, and unload protection -while generation is active. These adapters require a compatible managed runtime -and device; this does not establish support for every desktop platform or GPU. - -### llama.cpp reliability - -Managed llama.cpp serving gains library/router reconciliation, clearer loading -state, explicit start/stop controls, model-specific context configuration, -readiness checks, stronger process identity and shutdown ownership, and automatic -discovery of compatible sibling `mmproj` vision projectors. - -## Integration and upgrade notes - -Windows supports download/library operations and durable metadata publication. -The release candidate requires native Windows tests and startup checks for both -the installed application and portable executable, alongside Linux and macOS. - -### Distribution lines - -0.7.0 ships three product lines, all verified by the same candidate workflow: - -- Full desktop (GUI with inference plugins): `Pumas.Library-{version}.AppImage`, - `pumas-library-electron_{version}_amd64.deb`, - `Pumas.Library.Setup.{version}.exe`, - `Pumas.Library.{version}.exe` (portable), and - `Pumas.Library-{version}-arm64.dmg`. -- Desktop without inference (GUI with an inference-disabled backend): - the same five installer types with `-no-inference` in the filename and - application identity `com.pumas.library.no-inference`. Packaged backends - answer `/health` but return 404 on the inference routes. Install only one - desktop variant per machine; AppImage and portable are side-by-side safe. -- Headless embedding archives (inference-disabled `pumas-rpc` for - sidecar/subprocess embedding): - `pumas-rpc-no-inference-{version}-linux-x86_64.tar.gz`, - `pumas-rpc-no-inference-{version}-macos-arm64.tar.gz`, and - `pumas-rpc-no-inference-{version}-windows-x86_64.zip`. Each archive holds - a single backend binary plus `LICENSE.txt` and `THIRD-PARTY-NOTICES.txt`. - The binary is the whole library: `pumas-rpc` has the `pumas-library` core - compiled into it, so embedding needs no second binary — spawn it and call - HTTP, or depend on the `pumas-library` crate to link the core in-process. - AppImage and portable executables keep their own filesystem dir: library - data lives in a `pumas-data` directory next to the file (or a - user-selected root), never fully inside the single binary. - -In-process Rust API consumers depend on the immutable Git revision, not on a -binary archive. Host-language binding bundles remain unsupported. - -- Use the `pumas-library` Rust crate in `pumas-core` for direct integration, or - `pumas-rpc` when process separation is useful. Language-binding adapters remain - in the source tree, but no host-binding release bundle is currently supported. -- Applications still relying on older automatic owner/client selection should - choose `PumasApi` / `PumasLibraryInstance`, `PumasLocalClient`, or - `PumasReadOnlyLibrary` explicitly. -- Consider the Intent API when a model must remain available across restarts or - for multiple independent consumers. -- The package-facts contract is now version 2, with structured Diffusers, - image-family, GGUF, value-source, and inspection-manifest data. Update consumers - that decode those DTOs directly. -- Inference integrations remain optional for applications that only need model - management. - -### Optional ONNX build dependency - -Rust consumers using `default-features = false` can now omit ONNX Runtime, -tokenizers and half-precision tensor dependencies. Enable the core -`onnx-runtime` feature to use its ONNX execution APIs. Default core builds and -the RPC `inference-plugins` feature continue to include ONNX support. - -## Outside this release - -Fleet/cluster operation, remote-node reconciliation, distributed acquisition, -network-wide capability discovery, MCP integration, shared/community Hugging Face -caches, and production inference orchestration remain deferred. diff --git a/docs/release-notes-0.8.0-rc.1.md b/docs/release-notes-0.8.0-rc.1.md deleted file mode 100644 index fcac6e276..000000000 --- a/docs/release-notes-0.8.0-rc.1.md +++ /dev/null @@ -1,56 +0,0 @@ -# 0.8.0-rc.1 local candidate changes - -This unpublished Linux desktop candidate continues the existing 0.8.0-rc.1 -version. It is built for local review; Windows/macOS execution and model -inference are not qualified by its Linux packaging checks. - -- Downloaded files are checked against supplied SHA values during acquisition. - Subsequent startup, model reads, reconciliation and runtime preparation no - longer compare file contents with historical SHA values. Original checksums - remain stored for explicit integrity verification. Required files, lengths, - ownership and valid acquisition receipts are still checked. -- The normal staged audio installer derives all 68 version constraints from the - pinned recipe and verifies package name, version, URL and acquisition hash - before publishing the runtime. Cold and warm installs match the same recipe. - Installed-tree byte fingerprints no longer control runtime admission. -- Startup recovery refuses unsupported legacy library schemas before registering - a claim, including headless builds. Cross-platform cancellation fixtures share - their readiness timeout. GGUF corruption tests isolate filesystem reconciliation - and separately exercise live reindexing. -- A partial catalog model with a managed download no longer shows the inactive - recovery warning while downloading, queued, pausing, paused, cancelling or - awaiting retry. Live pause/resume controls continue to use the exact download - ID. Inactive partial models still require current recovery information. -- Failed model deletion now shows an accessible error on the exact selected - model row, including partial entries. Delete controls stay disabled while the - request is pending and allow retry after refusal. Busy-library RPC errors - explain that the owning download or operation must finish or be cancelled; - the existing whole-library exclusion remains in effect. -- Primary API and local IPC deletion can remove one model while an unrelated HF - download runs. Exact destination custody, admission and intent protections remain - enforced; the sibling download's partial data and receipts are preserved. -- HTTP resume retains partial downloads across pause, failure and process restart. - When the selected file has a supplied SHA, it continues from the actual saved - offset and checks the assembled download before publication. Unsupported or - invalid continuation leaves the partial intact; a server ignoring the range - request cannot silently restart the download. -- A failed download now shows an accessible error beside its exact library - weight or unassociated activity row. Its retry control retains the download - identity. An enabled play action still requires a complete catalog entry; - transfer progress alone does not mark a model ready. - -Direct Rust consumers must recompile and handle the optional checksum returned by -`RuntimeReadFile::sha256`; `RuntimeReadFile::observed` represents absent historical -evidence. The removed public fixed installed-byte validation helper has no -automatic replacement. Existing acquisition receipts and RPC shapes are unchanged. - -The experimental owned Cohere session uses a coordinated private v2 layout -correlation identifier. An older installed v1 worker needs a fresh runtime -installation before using that path; incompatible workers are refused and drained. -The shipping audio admission catalog remains closed. The [retained-download recovery](runbooks/download-location-reconciliation.md) -action now inspects moved legacy files and explicitly settles the old failure -in the running desktop. It preserves model files and original Error history. -The first confirmation upgrades only the HF partition to format 6; older direct -library readers must update their Pumas dependency. Local acceptance creates no -verified HF receipt and makes no inference claim. Read-only update streams now -close cleanly without marking the instance shutdown as failed. diff --git a/docs/release-notes-0.8.0.md b/docs/release-notes-0.8.0.md index cef2bb88d..9a610d1c2 100644 --- a/docs/release-notes-0.8.0.md +++ b/docs/release-notes-0.8.0.md @@ -1,105 +1,192 @@ -# Pumas Library 0.8.0 - -Status: source manifests identify `0.8.0`; the release is not yet tagged or -published. [Release QA](release-qa-0.8.0.md) owns candidate identity, observed -consumer revisions, evidence and remaining gates. - -## Consumer-visible changes - -The generic HTTP operation boundary accepts typed text, embeddings, image and -audio requests against an explicitly selected model/profile. Capability -descriptors report what the current serving context can execute. Bounded -Image-to-Text adds named image and image-bearing message inputs, preserving -request identity, image bytes, resource bounds and typed refusal outcomes. -See the [Image-to-Text contract](contracts/image-to-text-v0.8.md). -Production installed Audio-to-Text remains unavailable; qualification-only -constructors and controlled provider replies do not enable production speech. - -Local consumers can discover and explicitly attach to a selected ready owner, -retain its lifetime and fence requests against root/generation changes. An -existing catalogue entry does not imply a loaded or executable model. Borrowed -attachment must not terminate another application's owner; a disconnect or -uncertain request result does not authorize inference replay. - -Acquisition includes digest-bound local input capabilities and conditional S3 -single-object/authored-bundle GGUF imports. Hugging Face browse/cache observations -remain separate from download details resolved after selection. Managed models -keep receipt-bound identities, including the selected GGUF primary/projector -through owned library moves. These contracts do not promise arbitrary -ONNX/Safetensors/Diffusers imports through the public S3 GGUF path. -The current S3 checks use controlled HTTPS fixtures; they do not certify AWS, -non-AWS providers or MinIO endpoint combinations. Those provider-specific claims -retain their existing AQ-S3 acceptance gate. - -### Typed API for consumers - -Start from `GET /v1/served-models`: it lists each served model and profile with -its capabilities and runtime limits. A request needs only `model`, `input` and -`output`; add `capability` when Pumas reports `ambiguous_operation`, and -`profile` when `profile_required` is true. Every error has a stable `code`, an -`outcome` and a human-readable `message`. Responses grow additively within -contract version 1, so consumers must ignore fields, capabilities and enum -values they do not use. New capabilities: `multimodal_embedding` (EmbeddingGemma -2 and other projector-backed embedders; EmbeddingGemma 2 needs llama.cpp b11454 -or newer, the first published build with its `gemma-embedding2` architecture) -and `decision` (llama.cpp decision models such as Kev and OpenJev, which need -llama.cpp b11429 or newer). See the +# Pumas Library v0.8.0 + +Pumas Library 0.8 makes Pumas easier to build on. Applications that use Pumas +for their models get one typed API to discover what is served and run it, and +the desktop library now shows models by what they are used for. + +The largest changes are: + +- a typed model-operations API with model discovery (`GET /v1/served-models`) +- new `decision` and `multimodal_embedding` capabilities, and bounded + image-to-text +- models grouped by use, with new **Decision and evaluation** and **Video + generation** categories, input/output badges and adapter marking +- a model's category is metadata: changing it never moves a model or changes + its ID +- local owner discovery for applications that embed Pumas +- digest-checked local imports and S3 imports +- inference-enabled headless builds for Linux, Windows and macOS +- an explicit, backed-up upgrade for older libraries + +## For desktop users + +### Models grouped by use + +The library groups models by what you would use them for: LLM, +vision-language, **Decision and evaluation** (new), embedding, reranking, image +generation, **Video generation** (new), audio and vision. Each row shows the +inputs and outputs the model handles (for example *image → video* or +*audio → text*), and LoRA/PEFT adapters are marked **Adapter**. + +Detection now trusts what the files say over a repository's task tag: a GGUF +with a decision head is a decision model, a `…ForASR` architecture is audio, +and video tasks are video. When a task tag disagrees, the model is flagged for +review instead of being overruled by the tag. + +If Pumas gets a category wrong, choose **Used as** in the model's metadata +window. Your choice is kept by later re-scans; clearing it re-detects the +category. + +### Categories never move your models + +A model's category is now metadata. Re-detection or your own choice changes +how the model is grouped, never its folder or ID, so served-model IDs and +runtime profiles keep working. (A change of model family can still move it.) + +The first time 0.8.0 opens a library it updates the library's classification +rules in place; the next refresh re-detects categories without moving anything. + +### Clearer startup and recovery + +- If the backend cannot start, the recovery screen shows the actual reason. +- Download state written by a newer Pumas no longer stops the backend: the + library, models and inference start, downloads are paused without rewriting + that state, and a banner explains why. +- A failed Torch startup trial says why the managed launch failed. +- Desktop views that receive an invalid update report it and reload instead of + going stale. + +## For applications that use Pumas + +### One typed API + +Start from `GET /v1/served-models`: it lists every served model and profile +with its provider, context size and capabilities, so you discover models +instead of configuring profiles by hand. Send operations to +`/v1/model-operations`. A request needs only `model`, `input` and `output`; add +`capability` when Pumas answers `ambiguous_operation`, and `profile` when +`profile_required` is true. Every request accepted before stays valid. + +Every error carries a stable `code`, an `outcome` and a human-readable +`message`, echoes your `request_id` when it is readable, and uses an HTTP +status that matches the code. Provider failure reasons reach you with +credential-shaped text redacted. + +Limits come from the serving runtime rather than fixed caps: `max_tokens` is +bounded by the served context, ONNX batch limits apply only to ONNX, and a +requested embedding dimension is applied by Matryoshka truncation when the +provider ignores it. `/v1/models` lists each model ID once, with its profiles. + +Responses may gain fields, capabilities and enum values within contract +version 1. Ignore what you do not use. See the [model operations contract](contracts/model-operations-v1.md). -## Existing libraries and migration - -Read [Opening an older library](library-upgrade.md) before opening a shared -library with this candidate. Download-store schema 7 is an explicit one-way -metadata conversion from the supported v4/v5/schema-6 states. Stop all readers, -writers, old applications and developer instances first. Use the desktop's -**Upgrade Library** confirmation or the documented Linux offline RPC command. -The converter creates a private exact backup of `downloads.json`; it does not -copy, scan, hash or rewrite model payloads. Opening the converted library then -performs ordinary startup work. - -Do not reopen upgraded metadata with an older binary or automatically restore -the backup after an uncertain publication. Preserve metadata, backups and logs -on failure. Unsupported/corrupt stores are refused. Migration cannot retire a -previously retained failed owner claim: a dead PID is insufficient authority to -delete registry state. Recovery requires the existing custody contract. - -Model categories are now metadata. Opening a library updates its system -classification rules in place; the next library refresh re-detects categories -(adding Decision and Video) without moving folders or changing model IDs, so -served-model IDs and runtime profiles keep working. A category you choose in -the model's metadata window is kept by later refreshes. - -Missing download destinations remain represented in their retained error/paused -state without startup creating folders or pretending absent bytes completed. -Interactive download-location reconciliation is separately planned work; this -checkpoint does not turn its proposal into implemented functionality. - -## Compatibility and distribution - -Native Rust consumers use an immutable Git revision and their locked dependency -closure. Update Pantograph's manifest, lockfile and CI setup pin as one consumer -cohort, then run its actual library/IPC/lifecycle checks. Independent HTTP -consumers must validate the named protocol/schema advertisements and closed -operation variants they use; matching product versions alone is insufficient. -The source-exported Python session helper is a reference, not a supported SDK. -The binding support matrix still accepts no UniFFI/Rustler host package tuple. - -The [artifact plan](../scripts/release/artifact-plan.json) requires sixteen -files: five full desktop installers, five no-inference desktop installers, -three no-inference headless archives and three inference headless archives. -Targets are Linux x86_64, Windows x86_64 and macOS ARM64. Headless binaries -include the core; embedders do not need a separate core binary. Choose the -correct inference variant explicitly. Run only one desktop variant per machine -because their product name is shared. - -Inference archives bind exact source/schema/runtime bytes and upstream notices. -CPU ONNX Runtime is pinned to 1.24.2; Cargo never downloads it. Current PR Linux -review can prove an extracted archive's finite untrained-graph execution and -cleanup. This is distinct from pretrained Nomic quality, native Windows/macOS -acceptance, vision model/projector execution, production speech and final -distribution acceptance. Follow [Releasing](../RELEASING.md) for native runtime -prerequisites, packaged model checks, notices, security review and publication. - -Custom Torch component assembly, additional discovery networks, arbitrary -modality pairs and new language SDKs are later scope. Their absence does not -authorize weakening current capability, ownership or migration refusals. +### New capabilities + +- **`decision`**: typed choice, score and yes/no questions answered with + probabilities by llama.cpp native decision models such as Kev and OpenJev. + Needs llama.cpp **b11429** or newer. +- **`multimodal_embedding`**: image and mixed text/image embeddings from + llama.cpp embedding models with a projector, such as EmbeddingGemma 2. Needs + llama.cpp **b11454** or newer. +- **Image-to-text**: named image and image-bearing message inputs with bounded + sizes and typed refusals. Vision-language models published as + `image-text-to-text` (Gemma, Qwen VL) are available for chat and + image-to-text. See the [image-to-text contract](contracts/image-to-text-v0.8.md). + +### Embedding Pumas + +Local applications can discover a running Pumas owner, attach to a library +explicitly, keep that owner alive while they use it, and detect when the +library or its owner changed underneath them. Attaching never terminates +another application's owner, and a disconnect or uncertain result never +replays an inference request. + +Rust consumers pin an immutable Git revision of `pumas-library`. Update the +manifest, lockfile and CI pin together, then run your own library and +lifecycle tests. HTTP consumers should check the advertised protocol and +schema versions rather than matching product versions. + +### Changes for Rust consumers + +- `ModelImporter::import` and `import_with_progress` (including copied + Diffusers bundles) need the `ModelLibrary` owned by `PumasApi` or + `PumasLibraryInstance`. A directly constructed library returns + `PumasError::Config` before staging anything; read-only use is unchanged. +- `ModelImporter::discover_shard_recovery` (and `_async`) returns a typed, + read-only report. `recover_incomplete_shards` is deprecated: a guessed path + never starts a download. +- Merging libraries refuses copied imports that carry a publication receipt + bound to their current library root; leave those in place. + +### Acquisition + +- Local imports are bound to the digest of the file you selected. +- S3 imports of a single object or an authored bundle, optionally conditional + on a strong ETag plus SHA-256, for any package the importer supports. These + are tested against controlled HTTPS fixtures; specific providers (AWS, MinIO + and others) are not yet certified. +- Hugging Face browsing and cache results stay separate from the download + details resolved after you select a model. +- A managed GGUF keeps its selected primary file and projector through library + moves, and a directory's primary file is never its projector. + +### llama.cpp serving + +- Embedding and reranking models launch in embedding/reranking mode in + dedicated profiles too, with a micro-batch that fits whole inputs (the served + context, otherwise 8,192 tokens, never more than the trained context). +- Ollama embedding models load through `/api/embed`. + +## Upgrading an existing library + +Libraries from earlier versions need a one-time metadata upgrade. Read +[Opening an older library](library-upgrade.md) first. In short: + +1. Stop every other app, backend and tool that uses the library. +2. Choose **Upgrade Library** on the desktop recovery screen (or use the + documented offline command on Linux). +3. Pumas backs up `downloads.json` exactly, then converts it. Model files are + never copied, scanned, hashed or rewritten. + +The upgrade is one-way: older Pumas versions cannot open the upgraded +metadata. If anything fails, keep the metadata, backup and logs; do not restore +the backup automatically. + +## Downloads + +Sixteen files are published, for Linux x86_64, Windows x86_64 and macOS ARM64. +The standard builds include inference-plugin integration; **no-inference** +builds leave it out and only manage libraries and downloads. Inference runtimes +such as llama.cpp have their own setup requirements. + +| Use | Linux x86_64 | Windows x86_64 | macOS ARM64 | +| --- | --- | --- | --- | +| Desktop app | `Pumas.Library-0.8.0.AppImage`, `pumas-library-electron_0.8.0_amd64.deb` | `Pumas.Library.Setup.0.8.0.exe` (installer), `Pumas.Library.0.8.0.exe` (portable) | `Pumas.Library-0.8.0-arm64.dmg` | +| Desktop app, no inference | `Pumas.Library-no-inference-0.8.0.AppImage`, `pumas-library-electron-no-inference_0.8.0_amd64.deb` | `Pumas.Library.Setup.no-inference.0.8.0.exe`, `Pumas.Library.no-inference.0.8.0.exe` | `Pumas.Library-no-inference-0.8.0-arm64.dmg` | +| Headless server | `pumas-rpc-inference-0.8.0-linux-x86_64.tar.gz` | `pumas-rpc-inference-0.8.0-windows-x86_64.zip` | `pumas-rpc-inference-0.8.0-macos-arm64.tar.gz` | +| Headless server, no inference | `pumas-rpc-no-inference-0.8.0-linux-x86_64.tar.gz` | `pumas-rpc-no-inference-0.8.0-windows-x86_64.zip` | `pumas-rpc-no-inference-0.8.0-macos-arm64.tar.gz` | + +The full and no-inference installers (`.deb`, Windows setup, `.dmg`) share a +product name, so install only one of them per machine; AppImage, portable and +headless builds can sit side by side. +Headless archives include the core, so no separate core binary is needed. +`THIRD-PARTY-NOTICES-0.8.0.txt` and `pumas-library-0.8.0.provenance.jsonl` +accompany the release. + +## Known limitations + +- Installers are not code-signed or notarized. Windows SmartScreen and macOS + Gatekeeper will warn on first launch. +- Production audio-to-text (speech transcription) is not available yet. +- An adapter with no task tag or base-model evidence (for example the LTX-2.3 + IC-LoRA) stays under image generation until you choose **Video generation** + for it. +- A model reports only the inputs and outputs its metadata records. LTX-2.3 + shows *image → video*; it also accepts text and produces audio, which its + published metadata does not state. +- S3 imports are not certified for specific providers. +- No UniFFI or Rustler host packages are published; the Python session helper + is a reference example, not a supported SDK. + +The full list of changes is in the [changelog](../CHANGELOG.md). diff --git a/docs/release-qa-0.7.0.md b/docs/release-qa-0.7.0.md deleted file mode 100644 index 27266a8f6..000000000 --- a/docs/release-qa-0.7.0.md +++ /dev/null @@ -1,134 +0,0 @@ -# 0.7.0 local release preparation - -Current dependency-minimization results and macOS follow-up are tracked in -[the minimization report](release-evidence/0.7.0/dependency-minimization.md). - -See [the dependency and installer follow-up](release-evidence/0.7.0/follow-up.md) -for the earlier der 0.8.2, attribution, metadata and installer evidence. -The original preparation record below is retained as the earlier baseline. - -Prepared on 2026-09-14 against `af45f3e0` plus the local release changes. -Preparation and verification were local. No push, tag, remote workflow dispatch, or publication was performed. -This is a local candidate, not approval to publish all advertised platforms. - -## Changes and historical findings - -The release histories through v0.6 repeatedly repaired binding generation, -pnpm/native dependencies, action pins, platform paths, symlinks, fixture isolation, -lint, and RAM-disk setup after attempts to release. The most recent remote main -run (`34836933217`) also failed formatting, Windows compilation, and Linux/macOS -Rust tests. - -The replacement workflow rehearses the same candidate pipeline on PRs, main, -manual dispatch, and tags. It uses repository toolchain pins, locked dependency -resolution, independent headless checks, native release tests, desktop contracts, -Python QA, exact installer inventory, and checksums. Linux installers are extracted -and their backend/renderer/license/native resources checked against build inputs; -the extracted RPC servers must start successfully. Missing artifacts fail the job. -Publication is separate and repository permissions are read-only. - -Versions are aligned at 0.7.0. Electron, packaging, frontend tooling and vulnerable -Rust dependencies were updated. Staging excludes stale Rustler/UniFFI libraries. -Test fixtures now supply real mutation authority, use canonical paths, exercise -current conversion setup probes, start an owned runtime for shutdown verification, -and respect Torch's prohibition on in-place dependency repair. The initial -preparation removed nightly-only Windows metadata calls. The subsequent Windows -implementation adds native download authority and durable JSON publication. - -The [release notes](release-notes-0.7.0.md) remove repeated feature descriptions, -correct the ownership transition's chronology (already present in v0.6), and avoid -claiming unsupported binding distributions or universally qualified GPU runtimes. - -## Local evidence - -Toolchain: Linux x86_64, Rust 1.92.0, Node 24.15.0, pnpm 10.33.0. -Commands and acceptance requirements are in [RELEASING.md](../RELEASING.md). - -| Check | Result | -| --- | --- | -| Workflow syntax, dependency ownership, version/tag alignment | Passed; mismatched tag rejected | -| Installer inventory regression checks | Passed | -| Frontend lint, types, tests, default/library-only builds | Passed; 117 files, 678 tests | -| Electron lint, types, tests | Passed; 172 tests | -| Desktop contract generation/conformance | Passed, including 48 frontend contract tests | -| Launcher tests | Passed; 49 tests | -| Torch Python lint/format and unit tests | Passed; 22 tests | -| Release Python scripts lint/format | Passed | -| Rust formatting, all-feature check/Clippy, default workspace tests/docs | Passed; core 1,408 tests, API 36, RPC 227; other integration/workspace suites also passed | -| Rust no-default workspace check and independent headless suites | Passed | -| Optimized workspace tests | Passed, including RPC and doctests | -| Inference-disabled optimized RPC build and route smoke | Passed; health 200, inference routes 404 | -| Canonical-path recovery regression through a symlinked temp root | Passed | -| Default optimized backend and launcher build | Passed | -| Real ONNX load/embed/unload and gateway embedding fixture | Passed; source integration tests using the local Nomic fixture | -| Linux AppImage and Debian package build/extraction | Passed | -| Extracted installer backend health and resource hashes | Passed for both formats | -| Extracted AppImage and Debian desktop startup/shutdown | Passed with an isolated library and CI-style sandbox flags | - -Existing ignored tests were not broadly enabled, including live Hugging Face/CDN -acquisition tests and environment-dependent examples. The explicitly supplied real -ONNX fixture is additional evidence; standard suite success does not qualify all -external services or devices. - -The desktop smokes log an in-flight RPC socket closure during shutdown, then -completes cleanup and exits successfully. This bounded smoke does not establish -all desktop lifecycle/user flows. Real ONNX fixture tests are distinct from the -packaged backend health checks; packaged model inference remains an acceptance -obligation. - -Local installers and SHA-256 checksums are in `/tmp/pumas-070-candidate-linux-electron43/`. -The inference-disabled diagnostic binary is in `/tmp/pumas-070-headless/`; the -normal inference-enabled launcher backend was restored from verified staging. -Detailed transient logs are `/tmp/pumas-070-*.log`; they are not committed evidence -or durable release assets. The installed system was not changed to test the Debian -package: extraction and execution of its bundled backend were verified. - -## Remaining release and platform blockers - -- **Native candidate validation:** Windows now implements held filesystem identity, - no-follow directory traversal, execution locking, native rename, and directory - synchronization. Windows is a required candidate gate alongside Linux and macOS. - The [native Windows verification](https://github.com/MrScripty/Pumas-Library/actions/runs/35028010502) - passed filesystem/recovery checks, API/RPC integration tests, and backend startup; - its three remaining failures were Unix directory opens in test fixtures, now - switched to the native helper. The final candidate must also pass release tests - and installed/portable application startup checks. Earlier - [Linux/macOS CI](https://github.com/MrScripty/Pumas-Library/actions/runs/35011477450) - passed their release and installer checks; those gates remain required after - the Windows changes. -- **Dependency review:** the [review](dependency-review-0.7.0.md) found the - unsupported Electron 39 line and reproduced its legacy extractor's overwrite - flaw. The follow-up upgrade to Electron 43.7.0 removes that dependency; fresh - pnpm audit has no actual installed-version advisories (workspace-importer false - positives remain). All 172 Electron tests, including the native preload oracle, - plus launcher and both extracted Linux package checks pass. Fresh Cargo audit - reports zero vulnerabilities; the `der` update and maintenance follow-up remain. -- **Publication acceptance:** complete per-installer third-party notices, SPDX - SBOMs, provenance, target-native installation/lifecycle flows, and packaged - inference evidence remain required by the artifact plan. The project license is - now bundled, but it is not a substitute for complete third-party notices. -- **Excluded surfaces:** no host-binding tuple is accepted by the binding support - matrix; Rustler requires an Erlang host and is excluded from ordinary workspace - QA. No Torch runtime distribution or real GPU/device tuple was qualified here. - -Do not tag or publish until these obligations are satisfied or the release's -claimed target/artifact scope is explicitly revised and reverified. - -The best-effort Windows workflow change and required-only installer assembly were -validated with Actionlint and inventory regression tests locally. No Windows -runner was executed. Dependency triage is recorded in -[dependency-review-0.7.0.md](dependency-review-0.7.0.md). - -## Electron 43.7.0 follow-up - -The current desktop candidates use Electron 43.7.0. CI explicitly installs its -lazily downloaded runtime before native tests/smoke; test discovery now resolves -the executable only when the optional native preload oracle actually runs. An -initial cold downloader stalled before that separation and was interrupted; the -subsequent explicit install, all 172 tests (zero skipped with the native oracle -enabled), 41 contract-conformance tests, 49 launcher tests, and desktop startup/ -shutdown passed. Both extracted installer executables report Electron 43.7.0. -See [upgrade evidence](release-evidence/0.7.0/electron-upgrade.json) for current -installer and lockfile hashes. Earlier inventory/installer evidence is retained -as the Electron 39 baseline. Rust sources and the staged RPC binary are unchanged -by this Electron upgrade; their previous verification remains applicable. diff --git a/docs/release-qa-0.8.0.md b/docs/release-qa-0.8.0.md deleted file mode 100644 index a258d361d..000000000 --- a/docs/release-qa-0.8.0.md +++ /dev/null @@ -1,155 +0,0 @@ -# v0.8.0 source checkpoint - -Checkpoint owner: parent cross-repository integrator. Preparation date: -2026-10-14. Runtime source baseline: -`ef9eead9fe6595f5b3152ef8df19c5dace30190b` (merged PR #69). -The immutable qualified code revision is -`5da74a2c9bd1fe3c0b1fa0184eef3667f31eed88`; its subsequent documentation commit -adds this handoff without production changes. [Draft PR #70](https://github.com/MrScripty/Pumas-Library/pull/70) -owns review of both. The [machine-readable receipt](plans/v080-readiness/reports/candidate.json) -binds source/tree, lockfiles, input hashes, local artifact bytes and each gate. -This slice changes release information and launcher -fixtures, not production APIs, runtime code, dependency resolution or manifests. -Version remains `0.8.0-rc.1`. No tag, final release or accepted archive is created. - -Qualification continued after preparation. Repair commit -`aa40e155846cdac6cd94b6f5c2fd6a35cddce16e` changes only a cleanup fixture and -qualification records. [The current decision report](plans/v080-qualification/reports/release-blockers.md) -owns the original df53 CI failure, repair CI, current dependency/notices review, -actual package identities and remaining release gates. The initial receipt and -tables below retain their original scope; they are not relabeled as repair results. -Repair Build [38526618039](https://github.com/MrScripty/Pumas-Library/actions/runs/38526618039) -is terminal success: all nine applicable jobs passed. The -[qualification receipt](plans/v080-qualification/reports/qualification.json) -retains exact jobs, headless totals, artifact ZIP hashes and review limits. - -## Current consumer inventory - -These are read-only observations of consumer `main` on 2026-10-14, not successful -downstream builds. Each consumer owner qualifies the actual dependency edge used -by its demo; unrelated repositories do not need to release together. A Pumas-only -test cannot accept the external application. - -| Consumer / inspected revision | Actual Pumas boundary | Required next acceptance | -| --- | --- | --- | -| Pantograph `2253cbe6fe8f1969b347c61fccba31859b13a4ba` | Cargo.toml, Cargo.lock and `.github/workflows/quality-gates.yml` all pin `aa1d79ae2d53f0acb088bc85223ecc2ff46af12b`. Native Rust library consumer. | Coordinate all three pins to one reviewed Pumas SHA, retain lockfile resolution, then run actual locked Rust/library/IPC and lifecycle tests. This inventory does not establish source compatibility across that revision gap. | -| Chrema `508c8b8cb724b49c655dab8bc4c8336190e516c7` | Current main contains reusable workflow/content-ledger packages and host-supplied provider adapters. Pantograph PR78 now supplies an actual host composition using these public packages and Pumas. | Qualify the host's exact Pumas edge; no new Chrema release or Pumas-specific Chrema SDK is required. Historical Pumas `qualify_chrema_native.py` requires Chrema `d9f660beb8273aac16e62fae3902b9f5e4d1559b` and Pumas `fe3c9f04c243f436a393ae47e16f616244a85cee`; it cannot be relabeled current-main acceptance. | -| Tuldok `d856a984535a430909761ed13ce42eadd55b0710` | `docs/contracts/pumas-image-to-text-consumer.md` and fixture `source.json` pin merged Pumas `36c2aab2c885b8416fd4e39cf8c37c510596d6e4`. Opt-in typed HTTP caption consumer. | Retain its seven-variant parser and six actual DTO-schema pins, then qualify final source/schema advertisements, finite real model/projector captioning, cancellation and borrowed-owner survival. The inspected operation DTO definitions are unchanged from that merge; this is source comparison, not a new schema-export or model receipt. | - -Protocol/schema advertisement, exact selected owner/root/generation, artifact -digest, model/profile and runtime identity remain separate compatibility facts. -Do not substitute a product-version match or a successful health check for them. -The [release notes](release-notes-0.8.0.md) link the supported migration path. - -[Pantograph PR78](https://github.com/MrScripty/Pantograph/pull/78) now has a repaired -baseline and a separate [published consumer receipt](https://github.com/MrScripty/Pantograph/blob/3649df2d3c4c718aa278e809f27cbc2a915f8c47/docs/plans/pumas-pr70-cpu-consumer/reports/consumer-compatibility.md) -for Pumas df53. Pantograph source `039cee079d273a8d4968df56a4b35e8eb8aacbbe` -passed 19 integration, 598 library (2 existing ignores) and 4 HTTP contracts, -plus independent consumer review, without an API repair. It exercises actual -public Chrema/Pumas/untrained-BERT CPU composition. PR78's adopted baseline pin -remains aa1d79ae; the separate df53 receipt is not silently promoted to aa40. -The parent owns final source/pin adoption and any lineage acceptance. - -## Initial preparation evidence - -Environment: this Cloud Linux x86_64 container, Rust/Cargo 1.92.0 from the repository -pin, Node 24.19.0 (repository pin 24.15.0), Python 3.12.14 (repository pin 3.12.3). -Node/Python results are supporting compatibility observations on these patch -versions, not a claim that the exact pinned environment was run here. No models, -native inference runtime or external S3 account were provisioned by this task. - -| Command | Observed result / proof boundary | -| --- | --- | -| `node --test scripts/release/*.test.mjs` | 33 passed, zero failed/skipped; existing release/packaging fixture contracts, not actual release archives | -| `npm run check:release-versions -- v0.8.0-rc.1` | Passed; aligned workspace source manifests | -| `npm run check:dependency-ownership` | Passed; workspace ownership declarations | -| `node scripts/release/check-attribution.cjs` and `--features s3` | Both passed; current inputs/pinned notice text freshness, not final SBOM/security approval | -| `npm run test:launcher` | Initial 47 passed / 2 failed. After fixture correction, 49 passed / zero failed/skipped. See diagnosis below. | -| `cargo test --locked --manifest-path rust/Cargo.toml -p pumas-library --no-default-features` | Passed: 2,070 unit tests, 218 integration tests and 6 doctests; 29 ignored entries including child helpers/doctest examples. Catalogue recovery: 7 passed, 1 child helper ignored at top level. Feature-gated S3 targets contain zero tests in this configuration. No pretrained inference is exercised. | -| `cargo test --locked --manifest-path rust/Cargo.toml -p pumas-rpc --no-default-features` | Passed with task-local CMake and XDG configuration: 233 unit and 24 integration tests; 13 ignored entries. S3 feature-gated process targets contain zero tests. | -| `cargo fmt --manifest-path rust/Cargo.toml --all -- --check` | Passed | -| `python3 scripts/release/smoke-rpc.py rust/target/debug/pumas-rpc --inference-disabled` | Passed HTTP health, inference-route absence and graceful stop against the rebuilt development test binary | -| Two selected `NativeConsumerTests` in `scripts/consumers/test_local_http_session.py` | Passed actual owned start/borrowed retention/cleanup and borrowed cancellation preserving the external owner. This is Pumas's source reference, not acceptance of an external application. Exact command is in the receipt. | - -Raw preparation logs are task-local `/tmp/pumas-v080-*.log`; -they are not permanent downloadable release assets. The execution ledger and PR -retain reviewed result summaries. - -The initial launcher failures had distinct observations: an immediate Node child -exited after 146 ms, exceeding the negative fixture's 100 ms threshold; a killed -descendant remained as Linux state `Z` under container PID 1. The fixture now -allows one second for the early-exit discriminator and checks Linux execution -state rather than interpreting every retained PID as live work. Actual process -group termination and force/close assertions remain exercised. Production -launcher code is unchanged. Native Windows/macOS launcher evidence is not run here. - -RPC's first attempt stopped before tests because CMake was missing. The second -link attempt terminated with SIGBUS while the container filesystem was full; -sandbox startup independently reported ENOSPC. After task-local CMake 3.31.6 and -removal of completed task-built test executables, the unchanged RPC invocation -passed. These attempts and log digests remain in the receipt. - -The local test binary is 752,728,784 bytes, SHA-256 -`da0bb23c6a4889baca2bc8500a07d07a38457cb43c2999d324d6d8a5419b04ed`. -Its actual advertisement lists `pumas-library/hf-client` and -`pumas-library/test-support`, with no inference feature. Source/target provenance -fields are absent; checkout equivalence is recorded independently. This debug -test executable is not an optimized, self-authenticating or shipped artifact. -No native inference runtime was loaded. The original saved executable is retained -separately; its path and hash are in the execution ledger. - -Current local execution does not include all-feature workspace/Clippy, -enabled-S3 source cohorts, frontend/Electron/Torch suites, the explicitly ignored -kernel-confinement gate, external consumer applications, native Windows/macOS, -optimized packaging, pretrained inference or final security/SBOM/signing review. -The receipt lists each as not-run; historical CI never silently closes them. - -Historical PR #69 head `036bed9cb60a91a440034b7324fd6f611ea58c2a` -records successful [Build 38247599905](https://github.com/MrScripty/Pumas-Library/actions/runs/38247599905) -and [CodeQL 38247594558](https://github.com/MrScripty/Pumas-Library/actions/runs/38247594558). -Its Linux extracted inference archive exercised finite 256-dimensional embeddings -through real ORT with an untrained graph; its audio job acquired the frozen cohort, -imported dependencies and performed a CPU operation with `production_available=false`. -These are historical recorded CI results for that head, not this executor's -inference tests, pretrained quality acceptance or final candidate artifacts. - -## Release blockers and later scope - -| Item | Disposition / owner / required evidence | -| --- | --- | -| Earlier headless catalogue ownership timing failure | Did not reproduce in the complete current core headless cohort, including actual catalogue cold-recovery tests. Do not carry it forward as a current reproduced blocker. | -| Consumer dependency edges | Pantograph's published df53 receipt qualifies its bounded public Chrema/Pumas CPU edge; parent adopts the actual final pin or explicitly accepts test-only lineage. Tuldok captioning still requires its advertised schema and model path. No new Chrema SDK or unrelated release is required. | -| Final version and notices | Parent decides promotion from rc.1 to 0.8.0. Change the four manifest sources and matching workspace lock entries without dependency updates, regenerate/review both versioned attribution sets, run version and release tests | -| Sixteen exact candidate artifacts | Blocks release publication: all native targets and package/install/start/recovery/shutdown flows required by RELEASING.md, plus exact final-file checksums/provenance/SBOM and maintainer review. Current exact-lock audits and regenerated notices are reviewed in the continuation receipt; the generic 52-alert push notice is not treated as confirmed shipped exposure. | -| Pretrained ONNX and vision/runtime evidence | Blocks claims of those production/demo capabilities. Use explicitly provided model/tokenizer/projector fixtures and the extracted pinned runtime; synthetic graphs and provider responses do not satisfy this | -| Production installed speech | Later capability scope while admission stays unavailable. Its owner must satisfy actual model/runtime/read containment/disposal gates before advertising support; do not expand this checkpoint to enable it | -| Interactive download-location reconciliation, custom Torch assembly, new SDKs/network discovery | Later scope under their existing owners; do not treat plans as delivered features | - -## Exact parent release action - -First review/merge this draft and record the accepted full candidate SHA. Source -demonstrations may pin that immutable revision within their explicitly qualified -capabilities; accept each actual consumer edge separately. They need no final tag. - -If the parent selects the unchanged prerelease version after required pre-tag -qualification, its candidate action is `git tag -a v0.8.0-rc.1 - -m 'Pumas Library v0.8.0-rc.1'` followed by -`git push origin refs/tags/v0.8.0-rc.1`. It must first verify that this tag does -not exist. This task does not execute either command. - -After the final-version commit and all **pre-tag** QA in RELEASING.md are accepted, -the parent/maintainer may run the following with the actual reviewed full SHA: - -```bash -npm run check:release-versions -- v0.8.0 -git tag -a v0.8.0 -m 'Pumas Library v0.8.0' -git push origin refs/tags/v0.8.0 -``` - -This is a proposed future action, not an executed command. Current rc.1 manifests -must not be tagged v0.8.0. The tag triggers candidate assembly, which must pass on -that exact SHA for all sixteen planned files. Inspect native results and final -metadata, stage a draft release with the reviewed notes, then let the maintainer -authorize publication. Never move a published tag or substitute historical CI -artifacts. If pre-tag qualification remains incomplete, keep the source checkpoint -pinned and the release blocked. diff --git a/electron/README.md b/electron/README.md index 18e432b99..d97d9e0c3 100644 --- a/electron/README.md +++ b/electron/README.md @@ -38,7 +38,7 @@ can contain backend diagnostics and must not expose credentials. `start_backend_setup(backend, expectedPreviousOperationId?)` and `get_backend_setup(backend)` expose the retained Rust setup owner for -`python_conversion`, `llama_cpp`, `nvfp4` and `sherry`, independently of inference +`python_conversion`, `llama_cpp`, `nvfp4`, `fp8` and `sherry`, independently of inference plugin support. Preload and main IPC validate requests with the Rust-generated decoders; preload validates the existing redacted setup outcomes. Neither layer installs, retries or falls back automatically. A missing/unsupported RPC method @@ -66,7 +66,8 @@ It does not confer filesystem or recovery authority. Request projections describe the canonical desktop outbound spelling accepted by Electron's registry and Rust. They do not promise every standalone Rust -deserialization alias; unselected `Legacy` methods remain outside this slice. +deserialization alias; methods still dispatched through the `Legacy` command +remain outside the generated contract. `pnpm --dir electron run generate:desktop-contract` rebuilds that exporter and generates identical `src/generated/desktop-contract*` artifacts in Electron @@ -129,8 +130,8 @@ renderer. It must make startup, ready, timeout, exit, and shutdown outcomes distinct. Events coordinate or invalidate cached state; they do not transfer durable ownership into Electron. -The RPC server is loopback-only by default. Pumas RPC LAN mode is currently -unauthenticated and must not be exposed to an untrusted network. +The RPC server binds loopback only and has no LAN mode; see +[Security](../docs/SECURITY.md) for its Host/Origin admission checks. ## Commands diff --git a/frontend/README.md b/frontend/README.md index 2adaac79d..71e36c31c 100644 --- a/frontend/README.md +++ b/frontend/README.md @@ -1,286 +1,70 @@ # Frontend -The frontend is the React renderer for the Pumas desktop app. It presents -backend-owned library and runtime state; it does not access the filesystem, -spawn processes, or decide durable model status. +## Purpose -## Stack and Boundary +The React renderer for the Pumas desktop app. It presents backend-owned library +and runtime state and collects user intent; the backend and the Rust API remain +usable without it. -- React 19 and TypeScript -- Vite 6 -- Tailwind CSS 4 and semantic CSS tokens -- Framer Motion -- React Aria interaction primitives -- Vitest, Testing Library, and jsdom +## Responsibility -The renderer calls the typed adapter under `src/api/`, which delegates to the -sandboxed Electron preload API. Values received from Electron, the backend, or -browser persistence are untrusted at runtime even when a TypeScript interface -describes their expected shape. Decode them before they enter application -state. - -```text -components and hooks - -> frontend API adapter - -> window.electronAPI - -> Electron IPC and local RPC -``` - -## State Ownership - -- Hooks own async work, cancellation, cleanup, stale-invocation protection, and - renderer subscriptions. - Components own presentation and short-lived interaction drafts. -- The Rust backend owns model availability, download state, repair outcomes, - runtime profiles, serving instances, and status telemetry. -- Cached startup data is a projection. Its age, provenance, refresh state, and - degraded outcome must remain visible to the caller and, where relevant, the - user. - -Do not infer that a model is complete from its name, repository, or a partial -set of files. Repository identity and artifact identity are distinct: one -Hugging Face repository may contain multiple files or quantizations, while the -same model published in another repository remains a separate model. - -Hugging Face download-details responses are decoded in preload from the -backend-owned contract before hydration. Unknown sizes remain null, and ordered -quant/file-group identities are preserved. A response for a different repository -or an invalid nested payload cannot replace the current row's details; failures -leave the existing projection intact and allow retry. This does not validate -all search responses or prove remote files are downloadable. - -Download-details requests accept omitted/null quant selection or an array of -strings. Malformed selections are rejected before IPC and at RPC admission, -not replaced with an empty selection. RPC accepts either `repo_id` or `repoId`, -but not both or extra fields; exact string contents and ordering are preserved. - -Inference-settings reads use backend-generated decoding, including nullable -constraints and structured JSON defaults. The modal keeps drafts and read -results scoped to one model and rejects mismatched identities. Failed settings -reads show an unavailable state, not an editable empty list; close and reopen -to retry. Structured defaults display as read-only JSON. Settings updates require -an explicit array; malformed or missing settings reject before IPC and RPC -persistence. An explicit empty array clears stored overrides and restores the -backend's lazy defaults. Valid strings, ordering and nested JSON remain intact. - -Notes updates accept text or an intentional clear (omitted, null, or blank). -Malformed values, duplicate aliases and unknown fields reject before IPC and -RPC persistence, rather than accidentally clearing notes. Nonblank Markdown, -Unicode and whitespace are preserved exactly. - -Notes/settings save confirmations use generated response decoding and must -match the requested model. Notes clears omit the returned text; missing-model -failures are distinct from successful saves. Malformed responses or transport -errors leave drafts intact and display an unconfirmed-save warning, without -automatic retries. Reopen the model to check persisted values before retrying: -an unconfirmed response does not prove that the backend write failed. - -Available runtime-version reads decode the backend's camelCase release and -asset fields, including nullable sizes and descriptions. Rate-limit responses -have no version list; the UI keeps its last releases and records the known or -unknown retry delay. Malformed responses reject rather than dropping individual -rows or accepting legacy field spellings. Existing refresh timing is unchanged. - -Runtime GitHub cache snapshots are decoded before entering hook state. Full -snapshots preserve nullable age, timestamp and release count; the existing -no-manager response omits those fields and contains only three false flags. -Malformed snapshots leave the last valid state intact. This does not establish -runtime availability or change cache polling timing. - -Installed runtime-version lists are decoded before entering state. Exact tags, -ordering and duplicates are preserved; malformed lists report an error and keep -the last valid list. Runtime lookup and installation behavior are unchanged. - -Active/default version reads share a validated string response. Empty strings -retain the existing wire meaning of no selection and display as null; other -tags remain exact. Invalid replies leave the previous selection intact. - -Comprehensive runtime status validates required nullable selections, the installed -count and each version's dependency lists before entering state. Invalid replies -report an error and retain the previous status and default selection. Existing -no-manager empty snapshots and failed dependency checks represented as empty -lists remain limitations; validation does not establish runtime or dependency -availability. - -The dedicated `check_version_dependencies` bridge method uses the generated -request/outcome contract and requires both a runtime tag and app id. It reports -the backend's installed/missing names and optional `requirementsFile` after a -subprocess-backed path/requirements/`pip list` observation. Rust makes no -explicit dependency-install, cache-write or network call, but inherited -Python/pip subprocess effects are not excluded or proved absent. Unknown app -identities remain missing-manager errors, disabled inference-plugin builds are -unsupported, and missing versions remain errors, while an absent venv or -requirements file retains the -backend's explicit report semantics. A valid response means the check returned a -typed report, not that dependencies are ready. There is currently no hook or UI -state consumer for this route, so the direct exposed bridge is the renderer -boundary; malformed responses and transport failures reject without becoming -empty data or triggering retries. FE-I42 and FE-I43 track tag-derived path -reachability and flattened package-list failures. - -The dedicated `get_release_dependencies` bridge method uses the generated -request/outcome contract and requires both a runtime tag and app id. It reads -the selected release's `requirements.txt` and preserves the backend's extracted -strings, ordering and duplicates exactly; the wire also preserves all admitted -strings, including empty values. The earlier preload -signature accepted an optional numeric `topN`, omitted the required app identity -and sent an unused `top_n` field; the coordinated internal bridge now sends the -actual Rust request instead. Missing versions or requirements files remain -successful empty lists, so success proves only that the current textual -extraction completed or the file was absent. It does not establish dependency -completeness, installation or runtime readiness. There is no current hook or UI -state consumer: malformed responses and transport failures reject at the direct -bridge without retries, state replacement or dependency installation. FE-I42 -tracks tag-derived path reachability and FE-I44 tracks ambiguous empty results -and the approximate parser. - -The dedicated `install_version_dependencies` bridge method requires a runtime -tag and app id through the generated request contract, then validates the exact -`{success:boolean}` confirmation. The awaited backend operation may create a -virtual environment, run `ensurepip`, upgrade pip, install requirements, read or -write constraint/cache data, create a pip-cache directory and contact package -services. A true response means either no requirements file was found after any -virtual-environment setup or the final pip install exited successfully; it does -not prove dependency readiness, prerequisite command success or that constraints -were applied. There is no current hook or UI state consumer, so the direct bridge -is the renderer boundary. False confirmations pass through; malformed responses -and transport errors reject after one mutation request without an automatic -retry. FE-I42 tracks tag-derived process and mutation reachability, FE-I45 tracks -the unbounded/cancellation-free subprocess lifecycle and unsafe uncertain retry, -and FE-I46 tracks ignored prerequisite and constraint/cache failures. - -Runtime-version info preserves the backend's exact tag and installed flag with -its current required null size. It does not expose installation paths, dates, -release metadata or a computed size. The generated preload decoder rejects -missing fields, non-null size and invented metadata before the hook receives the -record. A no-manager installed-false result does not prove runtime availability. - -Runtime installation validation returns the backend's raw removed-tag list, -orphan-directory path list and valid count without a success wrapper. Validation -may remove stale installation metadata, but does not delete reported orphaned -directories. The preload rejects malformed results without retrying the -operation. Empty no-manager results do not establish runtime availability. - -Runtime installation progress is validated as the backend's raw nullable -camelCase snapshot before one explicit projection into the UI's established -snake_case state. Terminal success/failure facts, nullable fields and completed -items are preserved; malformed reads keep the last progress, mark network state -failed and continue scheduled polling without repeating the installation -mutation. A null no-manager/no-progress result does not establish availability. - -Runtime installation start validates one generated request and the backend's -exact discriminated started/failed records. A successful start means release -lookup completed and a detached worker was spawned; installation completion is -still established only by progress polling. False, malformed and transport -failures do not start polling, refresh versions or retry the mutation. An -uncertain response is not proof that no worker started. The backend's shared -installation state and detached-worker lifecycle remain documented limitations. - -Runtime installation cancellation validates the backend's exact success boolean. -Success means a cooperative cancellation request was accepted, not that the -worker has stopped. False confirmations remain visible failures; malformed -confirmations reject after one request and are never retried. A false no-manager -result does not establish runtime availability. - -Runtime-version removal validates its own generated success-boolean outcome. -Success is returned only after the backend removal method completes and the hook -awaits its version refresh. False or malformed confirmations do not refresh, and -a rejecting refresh callback after accepted removal never retries the destructive -request. Current refresh readers can retain prior values and expose their own -error state without rejecting, so success does not prove every read refreshed. -Backend removal is sequential rather than transactional, so an error must not be -interpreted as proof that no removal effect occurred. - -Runtime-version switching validates its own generated success-boolean outcome in -both the direct bridge method and the composed launch path. False or malformed -confirmations cannot refresh or launch a runtime, and later refresh or launch -failures never repeat selection. Success means the backend selection writes -completed; it does not establish that a runtime process is running or ready. - -Runtime launch validates an exact generated outcome with `success` and optional -non-null `error`, `log_path`, and `ready` fields. Direct Ollama/Torch launch and -the composed version-selection adapter share that decoder. A successful launch -means process creation and the producer's bounded TCP-connect readiness observation -completed; `ready: false` remains a successful launch, and readiness is not -proof of process or version identity or continuing health. The active process -hook uses its later status observation, rather than `ready`, to clear starting -state. A decoded false outcome updates or clears the log from that failure; -malformed and transport outcomes preserve the prior log. All surface failure and -never retry launch. Composed selection is not transactional: -a successful switch remains applied if the later launch fails or is uncertain. - -Runtime stop validates an exact generated `{success:boolean}` result for the -direct Ollama/Torch routes and supported branches of the composed `stop_app` -adapter. True and false are preserved; malformed and transport responses reject -after one stop request and never retry. The active process hook keeps its log, -uses false and rejected responses as distinct generic failures, and retains -stopping state after true until external status reports the process stopped. -Immediate and delayed status refreshes are observations, not stop retries. -The boolean is the producer's current report and does not prove complete process- -tree shutdown; scanning and PID identity remain documented backend limitations. - -Default runtime-version selection shares one generated request contract across -preload, Electron main and standalone Rust RPC. Omitted/null tags clear the -selection; exact strings are preserved and malformed values reject before any -mutation. Its exact success boolean is decoded before hook state changes. True -applies the confirmed selection and performs one status refresh; false or -malformed replies do neither, and refresh failure never repeats the mutation. -Backend persistence follows the in-memory change, so an error is not proof that -no selection effect occurred. - -Library metadata reads preserve omitted optional payloads and validate present -metadata as objects, including nested JSON and component-manifest states. -Malformed responses cannot enter the modal; nested values display without -object coercion, and non-string link fields remain plain text. This does not -change metadata extraction or its existing handling of unavailable metadata. - -Complete current GGUF and safetensors rows offer format conversion to the other -format (F16). The dialog requires explicit tool-installation consent, observes -backend progress and requests cancellation without assuming it has completed. -Closing stops UI polling, not backend conversion; reopening reads existing work. -Unconfirmed start/setup outcomes block repeated requests in that dialog. Setup -readiness requires verified Python imports, not merely an existing interpreter. -The backend and desktop APIs remain usable without the GUI. Quantization-specific -configuration remains [FE-I23](../docs/plans/current-standards-remediation-2026-09-03/frontend-and-ui/issues.md) -follow-up; the format-conversion control does not advertise quantization. - -## Source Guide - -| Path | Responsibility | -| --- | --- | -| `src/api/` | Electron/backend adapter and response normalization | -| `src/components/` | Screens, panels, and reusable UI | -| `src/hooks/` | Async workflows and subscriptions | -| `src/types/` | Consumer-side TypeScript projections | -| `src/config/` | Feature and theme mappings | -| `src/utils/` | Pure presentation and provider utilities | -| `src/test/` | Shared test setup and helpers | - -Prefer grouping code by owned capability over adding another cross-cutting -utility or an explanatory README in every directory. - -## Themes and Accessibility - -Theme tokens are defined in `src/index.css`; programmatic theme mappings live -in `src/config/theme.ts`. Use semantic tokens instead of hard-coded colors. +- Hooks own async work, cancellation, cleanup, stale-invocation protection and + renderer subscriptions. +- `src/api/` adapts the sandboxed `window.electronAPI` preload bridge. The + renderer has no filesystem, process or network access of its own. + +The Rust backend owns model availability, categories, download state, repair +outcomes, runtime installations, runtime profiles, serving instances and status +telemetry. The frontend never decides durable model status. + +Stack: React 19, TypeScript, Vite 6, Tailwind CSS 4 with semantic tokens, +Framer Motion, React Aria interactions, and Vitest with Testing Library/jsdom. + +## Invariants + +- Values from Electron, the backend or browser persistence are untrusted until + decoded. Requests and responses use the generated desktop contract + (`src/generated/desktop-contract*`, produced from the Rust export; see + [Electron](../electron/README.md#generated-catalog-and-download-contract)). + TypeScript types alone are not validation. +- A malformed or failed read leaves the last valid state in place and reports + the failure; it never becomes empty data or a default. +- Mutations (install, remove, switch, launch, stop, setup, conversion, saves) + are sent once and never retried automatically. A malformed or lost response + is an unconfirmed outcome, not proof that no effect happened; the UI says so + and lets the user re-read before acting again. +- A success flag means only what the producer reports: an accepted start or + cancellation request, a completed selection write, or a launch whose bounded + readiness check finished. It does not prove that work finished, a process is + healthy, or a runtime or dependency is ready. +- Responses are matched to the model or selection that requested them; a reply + for another identity cannot replace the current view. +- Cached startup data is a projection whose age, provenance, refresh state and + degraded outcome stay visible. +- Do not infer that a model is complete from its name, repository or a partial + set of files. One Hugging Face repository can hold several files or + quantizations, and the same weights in another repository are a separate + model. +- A model's category is backend metadata. The **Used as** choice in the + metadata window sends `set_model_category`; the backend keeps that choice + across re-detection. Rows show the inputs/outputs the model handles and mark + adapters from the backend's metadata. + +## Accessibility and Themes + +Theme tokens live in `src/index.css`; programmatic mappings live in +`src/config/theme.ts`. Use semantic tokens rather than hard-coded colors. Prefer native semantic controls. Composite widgets must provide complete -keyboard, focus, naming, dismissal, and state behavior. The lint policy -requires React Aria `useHover` instead of raw mouse hover handlers. jsdom tests -are useful for component contracts but do not prove real focus, layout, -contrast, reduced motion, or assistive-technology behavior. - -Installation details expose named, determinate progress. Routine progress -updates are not live announcements; one atomic terminal region announces -failure assertively and cancellation or success politely. This installation -surface exists only in the default build. +keyboard, focus, naming, dismissal and state behavior. The lint policy requires +React Aria `useHover` instead of raw mouse hover handlers. Routine progress +updates are not live announcements; one terminal region announces failure +assertively and cancellation or success politely. The renderer follows the +operating-system reduced-motion preference. jsdom tests do not prove real +focus, layout, contrast, reduced motion or assistive-technology behavior. -The renderer follows the operating-system reduced-motion preference. Reduced -mode removes nonessential Popover entry and dismissal translation while -retaining opacity feedback, and bounds CSS animations and transitions to a -near-zero duration and one iteration. - -## Commands +## Entry Points From the repository root: @@ -291,11 +75,12 @@ npm run -w frontend check:types npm run -w frontend test:run npm run -w frontend build npm run -w frontend build:library-only +pnpm --dir frontend test:desktop-contract ``` -The default build includes inference integrations. `build:library-only` -removes their UI. - -For representative desktop behavior, build and run through the root launcher. -See [Development](../docs/DEVELOPMENT.md) and the +The default build includes inference integrations; `build:library-only` removes +their UI. `test:desktop-contract` crosses the real bundled preload and renderer; +[Development](../docs/DEVELOPMENT.md) describes its prerequisites. For +representative desktop behavior, build and run through the root launcher. +Open frontend findings are tracked in the [current standards audit](../docs/audits/current-standards-2026-09-03/README.md). diff --git a/rust/README.md b/rust/README.md index af79458f0..8c5785f50 100644 --- a/rust/README.md +++ b/rust/README.md @@ -10,8 +10,8 @@ integration, and experimental host-language adapters. | `pumas-library` (`crates/pumas-core`) | Library state, metadata, SQLite index, imports, downloads, reconciliation, runtime profiles, and serving contracts | | `pumas-app-manager` | External runtime installation, version selection, processes, and service clients | | `pumas-rpc` | Desktop sidecar, HTTP/JSON-RPC dispatch, events, and `/v1` gateway | -| `pumas-uniffi` | Experimental UniFFI adapter and binding generation surface | -| `pumas-rustler` | Experimental Rustler/NIF conversion surface | +| `pumas-uniffi` | Experimental UniFFI adapter; no supported host binding ([status](../docs/native-bindings.md)) | +| `pumas-rustler` | Experimental Rustler/NIF conversion surface; no supported host binding | `pumas-rustler` is excluded from the default workspace test set because it requires an Erlang/OTP host. It does not currently expose the core library API. @@ -37,18 +37,27 @@ gateway capability checks remain separate contracts. See ## Features and Variants -`pumas-rpc` enables `inference-plugins` by default. Its verified library-only -variant is: +This section owns the Cargo feature facts that other guides link to. + +`pumas-rpc` enables `inference-plugins` by default (`pumas-app-manager` plus the +core `onnx-runtime`, `process-manager` and `gpu-monitor` features). Its verified +inference-disabled variant is: ```bash cargo build --manifest-path rust/Cargo.toml -p pumas-rpc --no-default-features ``` -The `pumas-core` `hf-client`, `process-manager`, and `gpu-monitor` feature names -currently do not remove their dependencies or public modules. Only the optional -`uniffi` dependency has a direct feature gate. Do not describe -`pumas-library --no-default-features` as a minimal build until that contract is -corrected and tested. +`s3` (S3 import RPCs), `export-contract` (desktop contract export) and +`test-support` are opt-in. + +`pumas-library` enables `full` by default: `hf-client`, `process-manager`, +`gpu-monitor` and `onnx-runtime`. Only `onnx-runtime`, `s3`, `contract-schema` +and `uniffi` gate optional dependencies. `hf-client` and `gpu-monitor` change +only the advertised build-info feature list, and `process-manager` only whether +the builder may enable the process manager; none of the three removes a +dependency or public module. `default-features = false` therefore drops ONNX +Runtime, tokenizers and half-precision support, but is not otherwise a minimal +build. Do not describe it as minimal until those three features gate their code. ## Verification diff --git a/rust/crates/pumas-app-manager/src/version_manager/NATIVE-CLEANUP.md b/rust/crates/pumas-app-manager/src/version_manager/NATIVE-CLEANUP.md index e3858f6f9..344d67423 100644 --- a/rust/crates/pumas-app-manager/src/version_manager/NATIVE-CLEANUP.md +++ b/rust/crates/pumas-app-manager/src/version_manager/NATIVE-CLEANUP.md @@ -9,8 +9,8 @@ identity, revocation, and lease. Reads and writes through acquisition use held capabilities and refuse an observed pathname replacement. Observed acquisition subdirectory replacements are checked before cleanup mutates content. Existing native output extraction/publication helpers retain their path-based interfaces, -with grant checks at their effect boundaries; this slice does not replace those -helpers or claim adversarial path-race safety for them. +with grant checks at their effect boundaries; this contract does not replace +those helpers or claim adversarial path-race safety for them. The contract excludes arbitrary concurrent mutation inside the owned tree by an actor with identical filesystem authority. In particular, Unix cannot atomically @@ -88,8 +88,9 @@ retained cleanup diagnostics. Linux integration fixtures additionally cover adopted verified output with v1/v2 retained staging and failed cancellation clear with durable Using preservation. Crash-state fixtures are not power-loss tests. -Hosted Linux, macOS, and Windows focused/package gates remain required; local -formatting or source review does not establish cross-platform parity. +CI runs the focused `pumas-app-manager` `native_` tests on native Linux, macOS +and Windows (`torch-quality` job); local formatting or source review does not +establish cross-platform parity. Implementation references for the pinned-directory mechanism are cap-std v4.0.3 [open_dir](https://github.com/bytecodealliance/cap-std/blob/v4.0.3/cap-primitives/src/fs/open_dir.rs) diff --git a/rust/crates/pumas-core/README.md b/rust/crates/pumas-core/README.md index 03d180bf4..14d1845e6 100644 --- a/rust/crates/pumas-core/README.md +++ b/rust/crates/pumas-core/README.md @@ -7,9 +7,9 @@ imports, integrity reconciliation, runtime profiles, and serving state. ## Optional inference dependencies Default builds retain ONNX execution through the `full` feature. Model-management -consumers can use `default-features = false` (and `features = ["hf-client"]` for -Hugging Face access) without compiling ONNX Runtime, tokenizers or half-precision -tensor support. Enable `onnx-runtime` explicitly to expose `onnx_runtime` and its +consumers can use `default-features = false` without compiling ONNX Runtime, +tokenizers or half-precision tensor support; Hugging Face access is compiled in +either way (see [Features](#features)). Enable `onnx-runtime` explicitly to expose `onnx_runtime` and its re-exported execution types. Provider descriptions and model metadata remain available without that feature. RPC enables it through `inference-plugins`. @@ -89,8 +89,9 @@ backend fallback. Requests use the existing reqwest transport pool, constrained to the configured origin and GET/HEAD. SDK construction, complete request futures and body polls use scoped diagnostics to prevent credential-header tracing while preserving outer acquisition status events. Error bodies are bounded to 1 MiB; -provider diagnostics are never propagated. Prefix listing and its reviewed XML -validation guard remain separate planned work. +provider diagnostics are never propagated. `S3Reader::enumerate_prefix` lists an +explicitly authorized prefix within `S3PrefixLimits`, under a 4096-node, no-DTD +XML guard; it pins each listed object but downloads and imports nothing. The maintained SDK signs HEAD and conditional range GET with SigV4 and includes the optional session token. Credentials remain in the in-memory reader/selection @@ -122,10 +123,13 @@ With `s3` enabled, `PumasApi::import_s3_model(request, control)` composes explic source selection, shared acquisition/verification and the existing model importer. `S3ModelImportRequest` supplies endpoint/region/bucket/addressing/timeout facts, `Vec` with exact key/VersionId/logical path/SHA-256 evidence, -`ModelImportSpec` naming the selected primary GGUF, a caller-reserved +`ModelImportSpec` naming the selected primary weight file, a caller-reserved `AcquisitionWorkspace`, positive finite `AcquisitionRetryPolicy` budgets and a -caller-retained `operation_id: Uuid`. One GGUF and optional explicit data/text -auxiliaries use the existing importer eligibility and receipt rules. +caller-retained `operation_id: Uuid`. The acquired set must pass the shared +importer's supported package qualification (`ModelImporter::import_acquired_model`) +and receipt rules. `import_s3_conditional_model` and +`import_s3_conditional_bundle` are the conditional (strong ETag plus mandatory +SHA-256) single-object and authored-bundle variants of the same path. Set `credentials: None` for anonymous access, or move explicit `S3Credentials` into `Some(...)` for HTTPS authentication. The request has no Debug or serde @@ -152,8 +156,9 @@ for the same logical request, and reconcile retained work through the existing `model.s3.workflow` acquisition consumer and exact model-output proof pipeline. A reused control is refused; never use a new UUID to replay uncertain publication. Dropping the result waiter reports `Interrupted`, not completion; shared -`shutdown_acquisition()` drains registered effects. RPC/desktop source entry, -credential refresh and real-provider acceptance remain separate. +`shutdown_acquisition()` drains registered effects. The RPC and desktop entry +points are described in the [RPC guide](../pumas-rpc/README.md#explicit-s3-model-import); +credential refresh and live-provider acceptance are not provided. ### Shared S3 acquisition and one-file GGUF import @@ -242,11 +247,14 @@ auxiliary extensions are json, txt, md, model, tiktoken, vocab and merges. Anoth weight file, executable auxiliary and reserved root metadata name are refused. Output receipt versions and ordinary/single-object behavior remain unchanged. -Authenticated stores, prefix discovery, sharded/multifile weight formats, -desktop source selection, and live AWS/non-AWS/MinIO qualification -remain open. Local synthetic GGUF fixtures prove model-library publication, -not inference execution, packaged consumers, or the AQ-S3 gate. Hosted S3 -commands explicitly enable `s3`; ordinary feature graphs omit the reader. +The low-level GGUF consumer path above does not accept sharded GGUF or other +weight formats; use `PumasApi::import_s3_model` for packages the shared importer +supports. Live AWS, non-AWS and MinIO qualification remains open (the AQ-S3 +gate). Local synthetic fixtures prove model-library publication, not inference +execution or packaged consumers. Hosted S3 commands explicitly enable `s3`; +ordinary feature graphs omit the reader. The +[artifact acquisition contract](../../../docs/contracts/artifact-acquisition.md#6-s3-and-other-source-readers) +owns the cross-source S3 rules. ## Choose the Correct Access Role @@ -332,10 +340,12 @@ result becomes `Available`. Public operational `DownloadRequest` values retain their existing default-main behavior. Intent acquisition carries its immutable revision through metadata, auxiliary files, retries, persistence, resume, integrity verification, and -import. Download persistence uses schema 5 with validated schema-4 upgrade; -older readers reject the new version. `PersistedDownload` gains a -`revision: Option` field, so Rust callers constructing that lower-level -record must initialize it. Pinned ticket recovery is unavailable; pinned +import. The download store is schema 7; supported v4/v5/schema-6 stores need the +explicit offline upgrade (`DownloadPersistence::migrate_library_offline`, or +`pumas-rpc --migrate-download-store-offline --confirm-old-writers-stopped`), which +normal open never runs. See [Opening an older library](../../../docs/library-upgrade.md). +`PersistedDownload` has a `revision: Option` field, so Rust callers +constructing that lower-level record must initialize it. Pinned ticket recovery is unavailable; pinned execution resumes through its persisted download record. `ensure_model(&EnsureModelRequest)` durably records a consumer's requirement @@ -466,10 +476,9 @@ which requires the Tokio runtime to poll the abort. Disposal does not prove that server-side work stopped, and it does not drain a hung exchange to completion. Operational lookup/download methods remain available. UniFFI and the desktop -bridge continue to expose their existing operational contracts; adopting the -intent methods through those bindings is separate work. Nodes, fleet management, -remote discovery and additional network features are deferred until after the -next Pumas release. +bridge expose their existing operational contracts, not the intent methods. +Nodes, fleet management, remote discovery and additional discovery networks are +later scope. ## Model and Storage Rules @@ -479,6 +488,25 @@ name alone is insufficient because a repository can contain several files or quantizations. Equivalent content published in a different repository remains a separate source model. +### Model categories + +`ModelType` records what a model is used for: `llm`, `vlm`, `reranker`, +`decision`, `diffusion`, `video`, `embedding`, `audio`, `vision` or `unknown` +(`ModelType::ALL` is the single list metadata validation and RPC admission use). +It is library metadata: it groups models for display and never decides a +model's folder or ID. Re-detection (`reclassify_model`, `reclassify_all_models`) +moves a model only when its family changes. Inputs and outputs beyond the +primary use are recorded as `input_modalities`/`output_modalities`. + +Detection uses the library's SQLite rule tables, which opening a library +updates in place. File facts and architectures outrank task tags (for example +a GGUF decision head makes a `decision` model), and a disagreeing task tag +requests review rather than overruling them. `set_model_category(model_id, +Some(category))` records a person's choice, which every later re-detection +keeps; `None` clears it and re-detects; `unknown` is refused as a choice. + +### Files, index and downloads + Import, resumable download, finalization, repair, migration, and deletion must coordinate filesystem state, metadata, index rows, and update events. A recoverable partial file, an automatically finalized download, and a complete @@ -678,10 +706,11 @@ failed outcomes instead of collapsing them into defaults. ## Features -The default `full` feature enables `hf-client`, `process-manager`, `gpu-monitor`, -and `onnx-runtime`. The first three retain their existing marker behavior. -`onnx-runtime` gates the ONNX execution module and its native/runtime dependencies; -`uniffi` gates the optional UniFFI dependency. +The default `full` feature enables `hf-client`, `process-manager`, `gpu-monitor` +and `onnx-runtime`. `onnx-runtime` gates the ONNX execution module and its +native dependencies; `s3`, `contract-schema` and `uniffi` gate their optional +dependencies. The other three remove no dependency or module; the +[Rust guide](../../README.md#features-and-variants) owns the exact facts. ## Verification diff --git a/rust/crates/pumas-rpc/README.md b/rust/crates/pumas-rpc/README.md index 4249c9891..c0c0b9040 100644 --- a/rust/crates/pumas-rpc/README.md +++ b/rust/crates/pumas-rpc/README.md @@ -1,4 +1,49 @@ -# Backend setup RPC +# pumas-rpc + +## Purpose + +`pumas-rpc` is the standalone process that serves one Pumas library over local +HTTP: the desktop sidecar, and the backend for headless and HTTP consumers. The +core library is compiled in, so one binary is the whole backend. + +## Responsibility + +It owns HTTP transport and admission, JSON-RPC decoding and dispatch, the +server-sent update streams, the `/v1` gateway and typed model operations, local +owner discovery/retention endpoints, and orderly process shutdown. It does not +own durable model state, downloads, imports or runtime installation; those stay +in `pumas-library` and `pumas-app-manager`, and handlers only decode, call and +project their outcomes. + +## Invariants + +- It binds a loopback address only and rejects non-loopback Host/Origin values + before dispatch; there is no LAN mode (see [Security](../../../docs/SECURITY.md)). +- Request bodies and in-flight requests are bounded. +- Every error leaves through the redacted public projection in + `src/public_text.rs`; transports never serialize core errors directly. +- Rust owns the desktop wire contract: `src/contract.rs` declares it and the + `export-contract` feature exports the schemas that Electron and the frontend + generate decoders from (see [Electron](../../../electron/README.md)). +- Shutdown is one shared, observable receipt for signals and the `shutdown` + method; see [shutdown ownership](SHUTDOWN.md). +- Each dispatched call runs in an INFO `rpc_call` span with a process-local + `rpc_call_id`, the method and the request ID. `get_model_download_status` + failures log their stage (`state_lookup` or `outcome_validation`) and a + category, never download identifiers or paths. + +## Entry Points + +- `pumas-rpc --launcher-root PATH [--port N]` serves a library (port 0 picks a + free port). `--help` lists the other modes, including `--build-info`, + `--discover-local`, `--describe-local-http`, `--attach-or-start-local-http`, + `--retain-local-http-owner` and the offline download-store upgrade + (`--migrate-download-store-offline --confirm-old-writers-stopped`). +- Routes: `/rpc` (JSON-RPC), `/health`, `/events/*` update streams, and with + `inference-plugins` the `/v1` gateway listed under + [Typed model operations](#typed-model-operations). +- Features: `inference-plugins` (default), `s3`, `export-contract`, + `test-support`; see the [Rust guide](../../README.md#features-and-variants). ## Explicit S3 model import @@ -24,8 +69,10 @@ known size and strong quoted HTTP ETag; `W/` validators fail. Every GET uses exact If-Match; nonempty reads use the selected range. Returned metadata/bytes must match. ETag and size remain Weak source revision evidence, never a content digest or immutable pin. -Bundles and prefix discovery explicitly reject conditional mode as unsupported. -The existing dialog still submits VersionId selections; no new UI mode is added. +The bundle starts also accept `read_mode: "conditional"` for an authored set of +non-versioned objects; each file is then `{key, logical_path, sha256, +expected_etag, expected_size}` (decimal string) instead of carrying a +`version_id`. Prefix discovery remains VersionId-only. The desktop dialog submits VersionId selections only. `start_authenticated_s3_model_import` is a distinct additive command. Its closed params are `{source: , credentials: {access_key_id, @@ -143,6 +190,23 @@ and can reopen a retained result without another start. Controlled Linux HTTPS, RPC and DOM/preload fixtures provide local support; real-browser, packaged, default-inference, cross-platform and live-provider acceptance remain separate. +Conditional RPC qualification uses the actual production process and owned HTTPS +fixtures (`scripts/tests/qualify-s3-conditional-rpc.py`). It checks exact verified +receipts, copied bytes, Confirmed publication and Ready metadata. Catalog lookup +visibility remains an independently reproduced baseline issue, excluded from +this qualification. Retried partial transfers retain the same acquisition, but a +re-reserved RPC workspace restarts at byte zero unless the core has matching live +prefix custody. Changed conditional ETag or size fails before appending or publishing. +Authenticated retry requires fresh credentials; saved work never stores them. + +Prefix discovery (`start_s3_prefix_discovery`, +`start_authenticated_s3_prefix_discovery`, `get_s3_prefix_discovery`, +`cancel_s3_prefix_discovery`), same-process retained-transfer retry +(`get_s3_transfer_retry`, `retry_s3_model_transfer`) and the read-only +`inspect_persisted_s3_imports` are specified in the +[artifact acquisition contract](../../../docs/contracts/artifact-acquisition.md#6-s3-and-other-source-readers). +Discovery pins objects but never imports them. + ## Backend setup The RPC adapter exposes the standalone library's existing setup owners. It does @@ -155,7 +219,7 @@ not own another installer lifecycle. record exists. Only the current terminal operation's canonical UUID authorizes a retry; stale IDs return the selected owner's current record. -Backend values are exactly `python_conversion`, `llama_cpp`, `nvfp4`, and +Backend values are exactly `python_conversion`, `llama_cpp`, `nvfp4`, `fp8` and `sherry`. These new methods reject legacy aliases and extra fields. Malformed IDs and retry tokens without a selected owner-local record are invalid parameters (`-32602`). Closed setup admission returns the existing cancellation code (`-32004`). @@ -297,12 +361,3 @@ Every error has `code`, `outcome` (`not_admitted` or `unknown`) and a human-readable `message`, and echoes the caller's `request_id` when the body was readable. Responses can gain fields, capabilities and enum values within contract version 1; consumers must ignore what they do not use. - -Conditional RPC qualification uses the actual production process and owned HTTPS -fixtures (`scripts/tests/qualify-s3-conditional-rpc.py`). It checks exact verified -receipts, copied bytes, Confirmed publication and Ready metadata. Catalog lookup -visibility remains an independently reproduced baseline issue, excluded from -this qualification. Retried partial transfers retain the same acquisition, but a -re-reserved RPC workspace restarts at byte zero unless the core has matching live -prefix custody. Changed conditional ETag or size fails before appending or publishing. -Authenticated retry requires fresh credentials; saved work never stores them. diff --git a/rust/crates/pumas-rpc/SHUTDOWN.md b/rust/crates/pumas-rpc/SHUTDOWN.md index 47f670472..e0cbd4590 100644 --- a/rust/crates/pumas-rpc/SHUTDOWN.md +++ b/rust/crates/pumas-rpc/SHUTDOWN.md @@ -17,9 +17,8 @@ the RPC path rather than treating process termination as a graceful signal. `--http-shutdown-grace-ms` controls the common deadline for accepted HTTP/1 connections after shutdown starts (default 10,000 ms; accepted range 1 through -3,600,000 ms). This is not a normal request or generation timeout. Axum's enabled -protocol was already HTTP/1 only; Hyper now supplies explicit connection -ownership without enabling or claiming HTTP/2. +3,600,000 ms). This is not a normal request or generation timeout. The server +owns each connection through Hyper's HTTP/1 server; HTTP/2 is not enabled. The listener stops accepting connections. Health, SSE and gateway routes refuse new work at headers; RPC also checks after body decoding and only allows the @@ -65,19 +64,16 @@ failures in active serving and drainage, including a shutdown-observation race. failures are injected around a real loopback listener without changing process resource limits or operating-system settings. -Hyper and hyper-util were already locked and included in shipped attribution. -The RPC crate now directly owns their HTTP/1 server and Tokio adapter features; -no package version or license selection changed. Tests cover partial request -bodies, blocked response writers, held handler ownership beyond socket closure, -benign keep-alive completion, and closed request admission. +Tests also cover partial request bodies, blocked response writers, held handler +ownership beyond socket closure, benign keep-alive completion, and closed +request admission. The cross-platform real-process regression observes complete acknowledgement, all applicable SSE end-of-body results, and successful process exit without any -OS signal. It runs explicitly on native Linux, macOS and Windows CI. The owned-transport unit regressions also execute explicitly on all three native -hosts. These deterministic local-process tests do not qualify a distributed +OS signal. It and the owned-transport unit regressions run on native Linux, +macOS and Windows CI (`torch-quality` job). These deterministic local-process tests do not qualify a distributed cluster, packaged Electron, or real model execution. - ## Shared acquisition integration The RPC supervisor drains local intent/copied imports and HF downloads, accepted diff --git a/scripts/README.md b/scripts/README.md index ef61bdb6f..270b91623 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -45,6 +45,15 @@ Erlang-hosted Rustler crate. Individual subcommands are listed by `--help`. Generation and packaging can require external host toolchains. See [Native bindings](../docs/native-bindings.md) before publishing output. +## Release, Qualification and Consumers + +| Directory | Purpose | +| --- | --- | +| `release/` | Artifact plan and inventory checker, runtime staging and probes, package smoke checks, notices and release metadata; [Releasing](../RELEASING.md) owns their use | +| `tests/` | Qualification runners and contract tests for S3 RPC paths and Hugging Face cached search | +| `acceptance/` | Real-process acceptance helpers (download-location reconciliation, FLUX.2 RPC); point them only at temporary libraries | +| `consumers/` | Reference consumers of the local HTTP owner contract, not supported SDKs; see the [local HTTP consumer contract](../docs/contracts/local-http-consumer.md) | + ## Governance and Development Helpers | Script | Purpose | diff --git a/scripts/compare-backends.sh b/scripts/compare-backends.sh deleted file mode 100755 index e620c2352..000000000 --- a/scripts/compare-backends.sh +++ /dev/null @@ -1,277 +0,0 @@ -#!/bin/bash -# -# compare-backends.sh -# -# Compares JSON-RPC responses between Python and Rust backends. -# This script helps verify that the Rust backend is a drop-in replacement -# for the Python backend by checking response compatibility. -# -# Usage: -# ./scripts/compare-backends.sh [method] [params_json] -# -# Examples: -# ./scripts/compare-backends.sh # Run all comparison tests -# ./scripts/compare-backends.sh get_status # Test a specific method -# ./scripts/compare-backends.sh get_version_shortcuts '{"tag":"v0.4.0"}' -# - -set -e - -# Configuration -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" - -PYTHON_PORT=9876 -RUST_PORT=9877 -PYTHON_PID="" -RUST_PID="" - -# Colors for output -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -NC='\033[0m' # No Color - -# Cleanup function -cleanup() { - echo -e "\n${BLUE}Cleaning up...${NC}" - if [ -n "$PYTHON_PID" ] && kill -0 "$PYTHON_PID" 2>/dev/null; then - kill "$PYTHON_PID" 2>/dev/null || true - fi - if [ -n "$RUST_PID" ] && kill -0 "$RUST_PID" 2>/dev/null; then - kill "$RUST_PID" 2>/dev/null || true - fi -} -trap cleanup EXIT - -# Start Python backend -start_python_backend() { - echo -e "${BLUE}Starting Python backend on port $PYTHON_PORT...${NC}" - - cd "$PROJECT_ROOT/backend" - - # Activate venv if it exists - if [ -f "$PROJECT_ROOT/venv/bin/activate" ]; then - source "$PROJECT_ROOT/venv/bin/activate" - fi - - python rpc_server.py --port $PYTHON_PORT & - PYTHON_PID=$! - - # Wait for Python backend to be ready - for i in {1..30}; do - if curl -s "http://127.0.0.1:$PYTHON_PORT/health" > /dev/null 2>&1; then - echo -e "${GREEN}Python backend started${NC}" - return 0 - fi - sleep 0.5 - done - - echo -e "${RED}Failed to start Python backend${NC}" - return 1 -} - -# Start Rust backend -start_rust_backend() { - echo -e "${BLUE}Starting Rust backend on port $RUST_PORT...${NC}" - - local rust_binary="$PROJECT_ROOT/rust/target/release/pumas-rpc" - - if [ ! -f "$rust_binary" ]; then - echo -e "${YELLOW}Rust binary not found. Building...${NC}" - cd "$PROJECT_ROOT/rust" - cargo build --release - fi - - "$rust_binary" --port $RUST_PORT --launcher_root "$PROJECT_ROOT" & - RUST_PID=$! - - # Wait for Rust backend to be ready - for i in {1..30}; do - if curl -s "http://127.0.0.1:$RUST_PORT/health" > /dev/null 2>&1; then - echo -e "${GREEN}Rust backend started${NC}" - return 0 - fi - sleep 0.5 - done - - echo -e "${RED}Failed to start Rust backend${NC}" - return 1 -} - -# Make RPC call -rpc_call() { - local port=$1 - local method=$2 - local params=${3:-"{}"} - - curl -s -X POST "http://127.0.0.1:$port/rpc" \ - -H "Content-Type: application/json" \ - -d "{\"jsonrpc\":\"2.0\",\"method\":\"$method\",\"params\":$params,\"id\":1}" -} - -# Compare responses -compare_responses() { - local method=$1 - local params=${2:-"{}"} - - echo -e "\n${BLUE}Testing: $method${NC}" - echo "Params: $params" - - # Get responses - local python_response=$(rpc_call $PYTHON_PORT "$method" "$params") - local rust_response=$(rpc_call $RUST_PORT "$method" "$params") - - # Save to temp files for comparison - local python_file=$(mktemp) - local rust_file=$(mktemp) - - echo "$python_response" | jq -S '.result' > "$python_file" 2>/dev/null || echo "$python_response" > "$python_file" - echo "$rust_response" | jq -S '.result' > "$rust_file" 2>/dev/null || echo "$rust_response" > "$rust_file" - - # Compare - if diff -q "$python_file" "$rust_file" > /dev/null 2>&1; then - echo -e "${GREEN}✓ Responses match${NC}" - rm "$python_file" "$rust_file" - return 0 - else - echo -e "${RED}✗ Responses differ${NC}" - echo -e "\n${YELLOW}Python response:${NC}" - cat "$python_file" | head -20 - echo -e "\n${YELLOW}Rust response:${NC}" - cat "$rust_file" | head -20 - - echo -e "\n${YELLOW}Diff:${NC}" - diff "$python_file" "$rust_file" || true - - rm "$python_file" "$rust_file" - return 1 - fi -} - -# Compare structure only (ignore dynamic values) -compare_structure() { - local method=$1 - local params=${2:-"{}"} - - echo -e "\n${BLUE}Testing structure: $method${NC}" - - local python_response=$(rpc_call $PYTHON_PORT "$method" "$params") - local rust_response=$(rpc_call $RUST_PORT "$method" "$params") - - # Extract keys only for structure comparison - local python_keys=$(echo "$python_response" | jq -S 'paths | map(tostring) | join(".")' 2>/dev/null | sort | uniq) - local rust_keys=$(echo "$rust_response" | jq -S 'paths | map(tostring) | join(".")' 2>/dev/null | sort | uniq) - - if [ "$python_keys" = "$rust_keys" ]; then - echo -e "${GREEN}✓ Response structures match${NC}" - return 0 - else - echo -e "${YELLOW}⚠ Response structures differ (may be expected for dynamic data)${NC}" - echo -e "\n${YELLOW}Python keys:${NC}" - echo "$python_keys" | head -10 - echo -e "\n${YELLOW}Rust keys:${NC}" - echo "$rust_keys" | head -10 - return 0 # Don't fail on structure differences for dynamic data - fi -} - -# Run all tests -run_all_tests() { - local failed=0 - local passed=0 - local total=0 - - echo -e "\n${BLUE}========================================${NC}" - echo -e "${BLUE}Running Backend Comparison Tests${NC}" - echo -e "${BLUE}========================================${NC}\n" - - # Test methods that should return identical results - local exact_methods=( - "health_check:{}" - "get_sandbox_info:{}" - ) - - # Test methods that should have matching structure - local structure_methods=( - "get_status:{}" - "get_disk_space:{}" - "get_system_resources:{}" - "get_launcher_version:{}" - "get_available_versions:{\"app_id\":\"ollama\"}" - "get_installed_versions:{\"app_id\":\"ollama\"}" - "get_active_version:{\"app_id\":\"ollama\"}" - "get_default_version:{\"app_id\":\"ollama\"}" - "is_ollama_running:{}" - "has_background_fetch_completed:{}" - "get_github_cache_status:{\"app_id\":\"ollama\"}" - "get_library_status:{}" - "get_network_status:{}" - ) - - echo -e "${BLUE}=== Exact Match Tests ===${NC}" - for test in "${exact_methods[@]}"; do - IFS=':' read -r method params <<< "$test" - total=$((total + 1)) - if compare_responses "$method" "$params"; then - passed=$((passed + 1)) - else - failed=$((failed + 1)) - fi - done - - echo -e "\n${BLUE}=== Structure Match Tests ===${NC}" - for test in "${structure_methods[@]}"; do - IFS=':' read -r method params <<< "$test" - total=$((total + 1)) - if compare_structure "$method" "$params"; then - passed=$((passed + 1)) - else - failed=$((failed + 1)) - fi - done - - # Summary - echo -e "\n${BLUE}========================================${NC}" - echo -e "${BLUE}Test Summary${NC}" - echo -e "${BLUE}========================================${NC}" - echo -e "Total: $total" - echo -e "${GREEN}Passed: $passed${NC}" - if [ $failed -gt 0 ]; then - echo -e "${RED}Failed: $failed${NC}" - else - echo -e "Failed: $failed" - fi - - return $failed -} - -# Main -main() { - echo -e "${BLUE}Backend Comparison Tool${NC}" - echo -e "${BLUE}=======================${NC}\n" - - # Check for jq - if ! command -v jq &> /dev/null; then - echo -e "${RED}Error: jq is required. Install with: apt install jq${NC}" - exit 1 - fi - - # Start both backends - start_python_backend - start_rust_backend - - # Run tests - if [ $# -eq 0 ]; then - # Run all tests - run_all_tests - else - # Run specific test - local method=$1 - local params=${2:-"{}"} - compare_responses "$method" "$params" - fi -} - -main "$@" diff --git a/scripts/contract-tests.ts b/scripts/contract-tests.ts deleted file mode 100644 index 61200ea0c..000000000 --- a/scripts/contract-tests.ts +++ /dev/null @@ -1,425 +0,0 @@ -#!/usr/bin/env npx ts-node -/** - * Contract Tests for Backend API - * - * This script validates that backend responses match the TypeScript type definitions - * in frontend/src/types/api.d.ts. It can test both Python and Rust backends. - * - * Usage: - * npx ts-node scripts/contract-tests.ts [port] - * - * Default port is 9999 (matches integration tests). - */ - -import * as http from 'http'; - -// Import types from the frontend (relative path from scripts/) -// Note: In production, you'd compile this or use ts-node with proper config -type BaseResponse = { success: boolean; error?: string }; - -interface StatusResponse extends BaseResponse { - version: string; - message: string; - ollama_running: boolean; - torch_running: boolean; - last_launch_error: string | null; - last_launch_log: string | null; - app_resources?: unknown; -} - -interface DiskSpaceResponse extends BaseResponse { - total: number; - used: number; - free: number; - percent: number; -} - -interface SystemResourcesResponse extends BaseResponse { - resources: { - cpu: { usage: number; temp?: number }; - gpu: { usage: number; memory: number; memory_total: number; temp?: number }; - ram: { usage: number; total: number }; - disk: { usage: number; total: number; free: number }; - }; -} - -interface LauncherVersionResponse extends BaseResponse { - version: string; - branch: string; - isGitRepo: boolean; -} - -interface SandboxInfoResponse extends BaseResponse { - is_sandboxed: boolean; - sandbox_type: string; - limitations: string[]; -} - -interface NetworkStatusResponse extends BaseResponse { - total_requests: number; - successful_requests: number; - failed_requests: number; - circuit_breaker_rejections: number; - retries: number; - success_rate: number; - circuit_states: Record; - is_offline: boolean; -} - -interface LibraryStatusResponse extends BaseResponse { - indexing: boolean; - deep_scan_in_progress: boolean; - model_count: number; - pending_lookups?: number; - deep_scan_progress?: { - current: number; - total: number; - stage: string; - }; -} - -interface LinkHealthResponse extends BaseResponse { - status: string; - total_links: number; - healthy_links: number; - broken_links: unknown[]; - orphaned_links: string[]; - warnings: string[]; - errors: string[]; -} - -interface FTSSearchResponse extends BaseResponse { - models: unknown[]; - total_count: number; - query_time_ms: number; - query: string; -} - -// ============================================================================= -// RPC Client -// ============================================================================= - -async function rpcCall(port: number, method: string, params: Record = {}): Promise { - return new Promise((resolve, reject) => { - const body = JSON.stringify({ - jsonrpc: '2.0', - method, - params, - id: Date.now(), - }); - - const options: http.RequestOptions = { - hostname: '127.0.0.1', - port, - path: '/rpc', - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Content-Length': Buffer.byteLength(body), - }, - timeout: 10000, - }; - - const req = http.request(options, (res) => { - let data = ''; - res.on('data', (chunk) => { data += chunk; }); - res.on('end', () => { - try { - const json = JSON.parse(data); - if (json.error) { - reject(new Error(json.error.message || JSON.stringify(json.error))); - } else { - resolve(json.result as T); - } - } catch (e) { - reject(new Error(`Invalid JSON: ${data}`)); - } - }); - }); - - req.on('error', reject); - req.on('timeout', () => { - req.destroy(); - reject(new Error('Timeout')); - }); - - req.write(body); - req.end(); - }); -} - -// ============================================================================= -// Validators -// ============================================================================= - -type ValidationResult = { field: string; error: string }; - -function validate(response: T, validators: Record boolean>): ValidationResult[] { - const errors: ValidationResult[] = []; - for (const [field, validator] of Object.entries(validators)) { - const value = (response as Record)[field]; - if (!validator(value)) { - errors.push({ field, error: `Invalid value: ${JSON.stringify(value)}` }); - } - } - return errors; -} - -const isBoolean = (v: unknown): boolean => typeof v === 'boolean'; -const isNumber = (v: unknown): boolean => typeof v === 'number'; -const isString = (v: unknown): boolean => typeof v === 'string'; -const isStringOrNull = (v: unknown): boolean => typeof v === 'string' || v === null; -const isArray = (v: unknown): boolean => Array.isArray(v); -const isObject = (v: unknown): boolean => typeof v === 'object' && v !== null && !Array.isArray(v); -const isOptional = (check: (v: unknown) => boolean) => (v: unknown): boolean => v === undefined || check(v); - -// ============================================================================= -// Contract Tests -// ============================================================================= - -interface TestResult { - method: string; - passed: boolean; - errors: ValidationResult[]; - response?: unknown; -} - -async function testGetStatus(port: number): Promise { - const method = 'get_status'; - try { - const response = await rpcCall(port, method); - const errors = validate(response, { - success: isBoolean, - version: isString, - message: isString, - ollama_running: isBoolean, - torch_running: isBoolean, - last_launch_error: isStringOrNull, - last_launch_log: isStringOrNull, - }); - return { method, passed: errors.length === 0, errors, response }; - } catch (e) { - return { method, passed: false, errors: [{ field: 'request', error: String(e) }] }; - } -} - -async function testGetDiskSpace(port: number): Promise { - const method = 'get_disk_space'; - try { - const response = await rpcCall(port, method); - const errors = validate(response, { - success: isBoolean, - total: isNumber, - used: isNumber, - free: isNumber, - percent: isNumber, - }); - return { method, passed: errors.length === 0, errors, response }; - } catch (e) { - return { method, passed: false, errors: [{ field: 'request', error: String(e) }] }; - } -} - -async function testGetSystemResources(port: number): Promise { - const method = 'get_system_resources'; - try { - const response = await rpcCall(port, method); - const errors: ValidationResult[] = []; - - if (!isBoolean(response.success)) { - errors.push({ field: 'success', error: 'must be boolean' }); - } - if (!isObject(response.resources)) { - errors.push({ field: 'resources', error: 'must be object' }); - } else { - if (!isObject(response.resources.cpu) || !isNumber(response.resources.cpu.usage)) { - errors.push({ field: 'resources.cpu.usage', error: 'must be number' }); - } - if (!isObject(response.resources.gpu) || !isNumber(response.resources.gpu.usage)) { - errors.push({ field: 'resources.gpu.usage', error: 'must be number' }); - } - if (!isObject(response.resources.ram) || !isNumber(response.resources.ram.usage)) { - errors.push({ field: 'resources.ram.usage', error: 'must be number' }); - } - if (!isObject(response.resources.disk) || !isNumber(response.resources.disk.usage)) { - errors.push({ field: 'resources.disk.usage', error: 'must be number' }); - } - } - - return { method, passed: errors.length === 0, errors, response }; - } catch (e) { - return { method, passed: false, errors: [{ field: 'request', error: String(e) }] }; - } -} - -async function testGetLauncherVersion(port: number): Promise { - const method = 'get_launcher_version'; - try { - const response = await rpcCall(port, method); - const errors = validate(response, { - success: isBoolean, - version: isString, - branch: isString, - isGitRepo: isBoolean, - }); - return { method, passed: errors.length === 0, errors, response }; - } catch (e) { - return { method, passed: false, errors: [{ field: 'request', error: String(e) }] }; - } -} - -async function testGetSandboxInfo(port: number): Promise { - const method = 'get_sandbox_info'; - try { - const response = await rpcCall(port, method); - const errors = validate(response, { - success: isBoolean, - is_sandboxed: isBoolean, - sandbox_type: isString, - limitations: isArray, - }); - return { method, passed: errors.length === 0, errors, response }; - } catch (e) { - return { method, passed: false, errors: [{ field: 'request', error: String(e) }] }; - } -} - -async function testGetNetworkStatus(port: number): Promise { - const method = 'get_network_status'; - try { - const response = await rpcCall(port, method); - const errors = validate(response, { - success: isBoolean, - total_requests: isNumber, - successful_requests: isNumber, - failed_requests: isNumber, - circuit_breaker_rejections: isNumber, - retries: isNumber, - success_rate: isNumber, - circuit_states: isObject, - is_offline: isBoolean, - }); - return { method, passed: errors.length === 0, errors, response }; - } catch (e) { - return { method, passed: false, errors: [{ field: 'request', error: String(e) }] }; - } -} - -async function testGetLibraryStatus(port: number): Promise { - const method = 'get_library_status'; - try { - const response = await rpcCall(port, method); - const errors = validate(response, { - success: isBoolean, - indexing: isBoolean, - deep_scan_in_progress: isBoolean, - model_count: isNumber, - }); - return { method, passed: errors.length === 0, errors, response }; - } catch (e) { - return { method, passed: false, errors: [{ field: 'request', error: String(e) }] }; - } -} - -async function testGetLinkHealth(port: number): Promise { - const method = 'get_link_health'; - try { - const response = await rpcCall(port, method); - const errors = validate(response, { - success: isBoolean, - status: isString, - total_links: isNumber, - healthy_links: isNumber, - broken_links: isArray, - orphaned_links: isArray, - warnings: isArray, - errors: isArray, - }); - return { method, passed: errors.length === 0, errors, response }; - } catch (e) { - return { method, passed: false, errors: [{ field: 'request', error: String(e) }] }; - } -} - -async function testSearchModelsFts(port: number): Promise { - const method = 'search_models_fts'; - try { - const response = await rpcCall(port, method, { query: 'llama', limit: 10 }); - const errors = validate(response, { - success: isBoolean, - models: isArray, - total_count: isNumber, - query_time_ms: isNumber, - query: isString, - }); - return { method, passed: errors.length === 0, errors, response }; - } catch (e) { - return { method, passed: false, errors: [{ field: 'request', error: String(e) }] }; - } -} - -// ============================================================================= -// Main -// ============================================================================= - -async function main() { - const port = parseInt(process.argv[2] || '9999', 10); - - console.log('╔════════════════════════════════════════════════════════════════╗'); - console.log('║ TypeScript Contract Tests for Backend API ║'); - console.log('╚════════════════════════════════════════════════════════════════╝\n'); - console.log(`Testing backend on port ${port}\n`); - - // Check if server is available - try { - await rpcCall(port, 'health_check'); - console.log('✓ Server is available\n'); - } catch (e) { - console.error(`✗ Server not available on port ${port}`); - console.error(` Run the backend first: cargo run --release -- --port ${port} --launcher_root /path/to/project\n`); - process.exit(1); - } - - // Run all tests - const tests = [ - testGetStatus, - testGetDiskSpace, - testGetSystemResources, - testGetLauncherVersion, - testGetSandboxInfo, - testGetNetworkStatus, - testGetLibraryStatus, - testGetLinkHealth, - testSearchModelsFts, - ]; - - const results: TestResult[] = []; - - for (const test of tests) { - const result = await test(port); - results.push(result); - - if (result.passed) { - console.log(`✓ ${result.method}`); - } else { - console.log(`✗ ${result.method}`); - for (const error of result.errors) { - console.log(` - ${error.field}: ${error.error}`); - } - } - } - - // Summary - const passed = results.filter(r => r.passed).length; - const failed = results.filter(r => !r.passed).length; - - console.log('\n════════════════════════════════════════════════════════════════'); - console.log(`Summary: ${passed} passed, ${failed} failed`); - console.log('════════════════════════════════════════════════════════════════'); - - if (failed > 0) { - process.exit(1); - } -} - -main().catch(console.error); diff --git a/torch-server/README.md b/torch-server/README.md index fb7b76aad..d2dd5546a 100644 --- a/torch-server/README.md +++ b/torch-server/README.md @@ -5,10 +5,11 @@ endpoint. External clients must use the Pumas `/v1` gateway ([public image contract](../docs/contracts/image-generation.md)); the sidecar's own routes are private and defined by the [Torch provider protocol](../docs/contracts/torch-provider-protocol.md). -A managed runtime bundle is being qualified; it is not yet a published -or accepted Pumas runtime. -Promotion requires a resolved production dependency set and real ASGI, -model-loader, generation, device, responsiveness, and shutdown evidence. +Pumas installs Torch into a managed Python environment from official pinned +wheels; no Pumas-hosted runtime bundle is published (see +[Install and Run](#install-and-run)). Accepting a runtime for a platform +requires a resolved production dependency set and real ASGI, model-loader, +generation, device, responsiveness, and shutdown evidence. ## HTTP Surface @@ -105,9 +106,26 @@ tests; the shared manager no longer downloads that archive. Managed installation downloads the official pinned wheels and other hash-locked dependencies only after the user selects a supported upstream release. Model weights remain library-owned. Candidate `torch-runtime-0.1.6` remains unpublished and is not the -default runtime. See the [active plan](../docs/plans/torch-diffusion-serving/plan.md). -Existing installed `0.1.x` entries remain available. Stop a running Torch -process before changing its runtime. +default runtime. Existing installed `0.1.x` entries remain available. + +Version rules: + +- Release discovery lists stable `vMAJOR.MINOR.PATCH` tags from + `pytorch/pytorch`; prereleases and nightlies are excluded. A failed page, or + running past 20 pages or 120 seconds, is an error, never a partial list. + Installed versions stay inspectable offline. +- Installing a version does not activate it. Selecting, setting the default, + starting and stopping are separate explicit operations. +- One Torch version serves at a time. Unload its models and stop the Torch + process before changing its runtime. +- The bundled `v2.9.1` preset (CUDA 13.0, CPython 3.12, Linux x86_64, with an + embedded hash-pinned lock) is a separately qualified exception; other + `v2.9.1` tuples do not inherit it. Nunchaku is pinned to `1.2.0+torch2.9` and + runs only on that tuple. +- XPU builds are not offered, and Torch is never built from source. + +Not yet supported: native NVFP4 encoder serving, LLaDA, image adapters outside +Linux, and upgrading in place between two upstream Torch tags. ## Network Safety @@ -136,7 +154,8 @@ Those tests prove focused request and control logic only. They do not prove ASGI middleware, production dependency resolution, device discovery, model loading, inference, control responsiveness during inference, disconnect or cancellation behavior, or bounded shutdown. The Linux sm_120 Nunchaku and Klein/FP8 workflows -have separate real release/GPU/browser evidence in the active plan. +have separate real release/GPU/browser evidence, recorded in the completed +diffusion serving plan (`git show 78c52fcf:docs/plans/torch-diffusion-serving/`). The managed runtime lock is the production dependency candidate; the root `requirements.txt` remains a direct-development input. Keep qualification, @@ -152,7 +171,8 @@ torch-versions/torch-runtime-0.1.2/venv/bin/python -I -m unittest discover -s to The Z-Image adapter includes a narrow Nunchaku 1.2/Diffusers 0.37 forward-call compatibility boundary. It keeps packed rotary hooks and passes patch dimensions by name. Native dependency imports alone do not establish this compatibility; -checkpoint kernel and full pipeline qualification are recorded in the plan. +checkpoint kernel and full pipeline qualification were recorded in the completed +diffusion serving plan. ## Model-supplied Python code