Skip to content

Releases: helpfulengineering/supply-graph-ai

Open Hardware Manager 0.9.0

Choose a tag to compare

@github-actions github-actions released this 12 Jul 18:27

Added

  • OKH Materials quality pipeline: stronger Materials extraction and post-processing (materials_filter, confidence scoring, optional LLM triage, review helpers) so generated manifests drop prose/table noise and near-duplicate line items more reliably.
  • Materials quality harness + Azure regen tooling: baseline metrics, fixture set, and batch canary hardening (progress heartbeats, per-repo timeouts, incremental reports); okh_generation_materials_regen_compare.py for before/after scoring; okh_generation_azure_regen_batches.py for resumable production-container re-generation with BOM sidecars and a JSONL process log.
  • OKH-LOSH v2.4 TOML import: OkhLoshConverter converts OKH-LOSH v2.4 TOML manifests (github.com/iop-alliance/OpenKnowHow) to OHM's canonical OKH manifest, with kebab→snake field mapping and unmapped fields preserved under metadata.*; ohm convert from-okh-losh; POST /v1/api/convert/from-okh-losh; docs at docs/conversion/okh-losh-toml.md; bulk-import driver at scripts/import_okh_losh_batch.py.
  • Designs catalog browse UX: catalog/list view toggle, alphabetical/category sort, group-by (category / process / license / none), friendlier display titles, richer cards (category, processes, author, version, license), and consolidated license facets (e.g. CERN-OHL / AGPL variants collapsed).
  • Match workflow UX: searchable DesignPicker with filters; facility filters expanded with city / state-region / country; network (incl. Maps of Making) facilities available as match candidates; multi-select match solutions with per-solution supply-tree links and RFQ handoff; facility detail hands off to Match with the facility preselected.
  • Frontend query cache: React Query persists low-volatility catalog/network data to localStorage (1-hour TTL), shares the ["network","baseline"] key across Home / Network / Match, and exposes a NavBar Refresh data control.

Changed

  • spaCy model: NLP matcher / loader defaults to the medium (md) model instead of small (sm) for better matching quality.
  • Version: Application release 0.9.0. Published Docker tags will include 0.9.0, floating 0.9, and latest.

Fixed

  • Test isolation from live Azure: root and integration conftests force STORAGE_PROVIDER=local before app import (winning the race against import-time load_dotenv()), clear service singletons in the integration client fixture, and extend the outbound-network guard to the integration lane so .env azure_blob settings can no longer hang make ready.
  • Match a11y + e2e: DesignPicker listbox markup satisfies ARIA required-children/parent rules; facility-detail e2e updated for the Match handoff CTA.

Docker

docker pull touchthesun/openhardwaremanager:0.9.0

Multi-arch: linux/amd64,linux/arm64

Open Hardware Manager 0.8.11

Choose a tag to compare

@github-actions github-actions released this 10 Jul 19:37

Added

  • File type taxonomy: canonical YAML taxonomy (src/config/taxonomy/file_types.yaml) with technical type, OKH role, and render tier (native_inline, text_viewer, wasm_3d, download_only); GET /v1/api/file-types and ohm file-types list|validate; ADR at docs/architecture/file-type-taxonomy-adr.md.
  • OKH file browsing UX: path-normalized display_path / directory grouping in a nested tree (root-first); inline preview panel for images, PDF, and markdown/text; full-page preview at /okh/:id/files/*; download for CAD/mesh and other non-previewable types. Detail responses enrich file refs with display_path, directory, file_type, render_tier, and mime_type.
  • Local Build Package: OKH detail (and RFQ) Build Package writes a package folder on the user's machine via the directory picker (Chrome/Edge), with write-access probe and per-file graceful failures; Firefox/Safari fall back to a browser-built .zip.

Changed

  • OKH detail layout: Intended Use section moved above Files & Documentation.

Docker

docker pull touchthesun/openhardwaremanager:0.8.11

Multi-arch: linux/amd64,linux/arm64

Open Hardware Manager 0.8.10

Choose a tag to compare

@github-actions github-actions released this 09 Jul 07:46
487d0e6

Added

  • OKH manifest file proxy (#272): GET /v1/api/okh/{id}/files/{path} streams design and manufacturing files from blob storage or the manifest repo URL; OKH detail enriches file refs with url; frontend uses proxied links; ohm okh download-file; probe_okh_files prefers url / download_url.

Fixed

  • ACA production stability: Gunicorn defaults to 1 worker and 300s timeout in production.toml (prevents OOM crash loop on 1 vCPU with eager NLP init).
  • Frontend ACA deploy: fractional CPU values (e.g. 0.5) accepted for the nginx sidecar.
  • Release workflow: deploy verify retries with clearer logging against /health/liveness.

Docker

docker pull touchthesun/openhardwaremanager:0.8.10

Multi-arch: linux/amd64,linux/arm64

Open Hardware Manager 0.8.9

Choose a tag to compare

@github-actions github-actions released this 09 Jul 03:30

Added

  • Unified distributed cache (#271): pluggable CacheBackend with memory (default) and redis backends; shared by @cache_response and cached(); cache stats on GET /v1/api/utility/metrics. Optional Redis service in docker compose --profile redis.
  • ACA triage harness and production probes: make harness / make harness-probes with probe_match, probe_cache, probe_okh_files, and probe_latency; proposal workflow under docs/testing/probe-workflow.md.

Fixed

  • Match 503 cold start on ACA (#270): MATCHING_EAGER_INIT pre-loads MatchingService during app lifespan; /health/readiness reports matching_service; frontend surfaces API request_id on match errors.
  • Release workflow: backend deploy verify tolerates ACA cold-start; frontend publish waits on backend tests; changelog gate for tagged releases.

Docker

docker pull touchthesun/openhardwaremanager:0.8.9

Multi-arch: linux/amd64,linux/arm64

Open Hardware Manager 0.8.8

Choose a tag to compare

@github-actions github-actions released this 07 Jul 08:37
a4d7c4c

Changed

  • OKW_SOURCE unset now defaults to union (storage ∪ Maps of Making), not storage. A match with no configured source is no longer silently limited to blob storage — it draws candidates from both the configured storage backend and the MoM network. OKW_SOURCE=storage restricts to blob only and OKW_SOURCE=mom to MoM only; MATCHING_LOCAL_OKW_JSON_DIR still yields a storage-only local pool (never unioned). Precedence: the environment sets the candidate universe and a per-request override may narrow within it but never broaden it. okw_source_resolved now distinguishes unset (→ union) from an explicit storage.
  • One shared facility-pool resolver for API and CLI. POST /v1/api/match and the ohm match CLI now resolve the candidate pool through a single OKWService.resolve_match_facilities (structural parity, not copy-paste), which routes every source through the network surface (get_network_match_facilities). MoM candidate loading degrades gracefully — when MoM is unavailable, union still returns the storage pool. Facilities without map coordinates are retained for matching (they are only dropped from the map/browse surface).

Docker

docker pull touchthesun/openhardwaremanager:0.8.8

Multi-arch: linux/amd64,linux/arm64

Open Hardware Manager 0.8.7

Choose a tag to compare

@github-actions github-actions released this 06 Jul 21:40
f47c744

Added

  • Typed configuration schema + per-environment files (config Slice 1): a pydantic-settings schema (src/config/schema.py) is now the single source of truth for the storage target (provider / account / container), the runtime environment, OKW_SOURCE, and CORS. Non-secret values are checked in per environment at config/environments/{development,test,production}.toml and layered under process env vars (env wins); secrets (AZURE_STORAGE_KEY, API_KEYS, LLM_*) stay env/secretRef-only. settings.py and storage_config.py consumers read the schema; the old inline env-read paths were removed. Behaviour-preserving — the docker --env-file quote-stripping quirk is consolidated into one normalizing env source, and characterization tests pin per-setting equivalence.
  • Generated env.template + staleness gate: scripts/generate_env_template.py emits the schema-owned settings into a marked block of env.template (name, default, secret-vs-not). make env-template regenerates it (part of make format), and a CI step + unit test fail if the committed block drifts from the schema — the lockfile pattern already used for the repository map.
  • Config drift guards (startup posture + /health fingerprint + deploy gate): the app now validates its config at startup — hard-failing in production on invalid/missing storage config, warning and degrading elsewhere. Public /health gains a best-effort, time-boxed storage fingerprint (resolved provider / account / container + okh//okw/ object counts) so config/data drift is visible. The release workflow's post-deploy step asserts the live container matches config/environments/production.toml and that counts are non-zero — an empty or mis-pointed prod container fails the deploy (this is exactly the drift that caused the live zero-match).

Changed

  • Deploy pipeline now applies the non-secret storage target from the repo. deploy/scripts/deploy_azure.py previously only set ENVIRONMENT + CORS_ORIGINS and left STORAGE_* configured directly on the container app (invisible to the repo — the drift that caused live zero-match). It now authoritatively applies every non-secret value from config/environments/<environment>.toml (incl. AZURE_STORAGE_CONTAINER) via additive --set-env-vars. Secrets are refused by deploy_env_vars() and existing secretRefs (e.g. AZURE_STORAGE_KEY) are left untouched.

Docker

docker pull touchthesun/openhardwaremanager:0.8.7

Multi-arch: linux/amd64,linux/arm64

Open Hardware Manager 0.8.6

Choose a tag to compare

@github-actions github-actions released this 30 Jun 23:31

Fixed

  • MoM OKW_SOURCE=mom silently overridden by MATCHING_LOCAL_OKW_JSON_DIR: POST /v1/api/match checked the local-dev JSON directory override before OKW_SOURCE, so an explicit request to use the Maps of Making SPARQL bridge as the facility source was silently ignored whenever that dev-convenience env var was set — a divergence from the CLI's --okw-source mom, which always reached MoM. OKW_SOURCE is now checked first in _get_filtered_facilities.
  • CORS preflight 400 on deployed containers: CORS_ORIGINS defaults to an empty list (deny all) in production when unset, which makes Starlette's CORSMiddleware reject every browser CORS preflight with 400 before the request reaches a route handler. None of the GCP/AWS/Azure deployment config paths (deployment.yaml via from_dict(), or the deploy_gcp.py CLI script via with_defaults()) ever set it. All deployment config construction paths now default CORS_ORIGINS to "*" (supply-graph-ai is a public API) unless explicitly overridden.

Added

  • MoM integration documentation and test coverage: docs/runbooks/mom-integration-e2e-validation.md — CLI/API demo runbook verified against the live MoM SPARQL endpoint, plus unit tests for mom_bridge.py, taxonomy wikidata_qid lookups, and OKW_SOURCE routing (none existed since the integration shipped in #181).

Docker

docker pull touchthesun/openhardwaremanager:0.8.6

Multi-arch: linux/amd64,linux/arm64

Open Hardware Manager 0.8.5

Choose a tag to compare

@github-actions github-actions released this 29 Jun 23:17

Fixed

  • GET /v1/api/okh timeout: SmartFileDiscovery.discover_files() cascaded to full-bucket strategies (metadata scan, content-validation) when the okh/ prefix listing returned an empty list, causing it to download every blob in the Azure container. The cascade now only advances when a strategy raises an exception (storage unavailable); an empty result is treated as authoritative and stops the search immediately. _discover_by_directory_structure re-raises storage exceptions so the caller can make the cascade decision correctly.

Docker

docker pull touchthesun/openhardwaremanager:0.8.5

Multi-arch: linux/amd64,linux/arm64

Open Hardware Manager 0.8.4

Choose a tag to compare

@github-actions github-actions released this 25 Jun 03:26

Added

  • Repair workflow epic (GAPs 1–8): End-to-end API and CLI surface for field-device repair workflows — AssetRecord physical-state domain object, AssetStatus lifecycle field, repair document extraction pipeline, parts harvesting (POST /v1/api/asset/harvest-parts), triage checklist (POST /v1/api/asset/triage-checklist), triage report with per-component action recommendations, salvage matching (fleet query for harvestable components), sourcing resolution (POST /v1/api/asset/resolve-sourcing), repair-doc import with conservative merge semantics (GAP-4), cross-manifest compatibility via compatible_manifest_ids (GAP-8), and claim/reservation mechanism for harvestable components (GAP-7).
  • make ready gate: Single command (make ready) that enforces format, lint, unit tests, service↔API↔CLI parity, docs validation, and live E2E as a pre-merge gate. Individual targets: make parity, make validate-docs, make e2e.

Fixed

  • Azure Container Apps redirect scheme: Gunicorn was not configured to trust X-Forwarded-Proto from ACA's TLS-terminating ingress, causing all trailing-slash redirects to generate http:// URLs instead of https://. Added forwarded_allow_ips = os.getenv("FORWARDED_ALLOW_IPS", "*") to gunicorn.conf.py.
  • make ready / parity gate: Wired validate-docs, parity, and e2e targets into the project Makefile; make parity runs tests/parity to catch service↔route↔CLI drift early.

Docker

docker pull touchthesun/openhardwaremanager:0.8.4

Multi-arch: linux/amd64,linux/arm64

Open Hardware Manager 0.8.2

Choose a tag to compare

@github-actions github-actions released this 04 Jun 23:34

Fixed

  • Docker --env-file breaks remote storage (quoted env values): docker run --env-file passes values verbatim including surrounding quotes, while docker-compose / python-dotenv strips them. The _env() helper in storage_config.py now defensively strips " and ' from all credential and bucket-name variables, preventing DNS failures such as Cannot connect to host '"myaccount"'.blob.core.windows.net.
  • Azure Key Vault init noise on every command: The secrets manager incorrectly detected an Azure Key Vault environment whenever AZURE_STORAGE_ACCOUNT was present in .env, triggering a noisy warning about missing optional packages on every CLI invocation. Detection now requires AZURE_KEY_VAULT_URL or WEBSITE_INSTANCE_ID to be set.
  • Blank "Unexpected error: " message: APIClient.request()'s catch-all exception handler now always includes the exception type in the message (Unexpected error (ExcType): detail), so errors can never silently produce an empty description.

Documentation

  • README.md and docs/development/container-guide.md updated with explicit docker run --env-file guidance, per-provider env-var tables, and a troubleshooting section on the quoted-value DNS failure.

Docker

docker pull touchthesun/openhardwaremanager:0.8.2

Multi-arch: linux/amd64,linux/arm64