Releases: helpfulengineering/supply-graph-ai
Releases · helpfulengineering/supply-graph-ai
Release list
Open Hardware Manager 0.9.0
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.pyfor before/after scoring;okh_generation_azure_regen_batches.pyfor resumable production-container re-generation with BOM sidecars and a JSONL process log. - OKH-LOSH v2.4 TOML import:
OkhLoshConverterconverts 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 undermetadata.*;ohm convert from-okh-losh;POST /v1/api/convert/from-okh-losh; docs atdocs/conversion/okh-losh-toml.md; bulk-import driver atscripts/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
DesignPickerwith 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 include0.9.0, floating0.9, andlatest.
Fixed
- Test isolation from live Azure: root and integration conftests force
STORAGE_PROVIDER=localbefore app import (winning the race against import-timeload_dotenv()), clear service singletons in the integration client fixture, and extend the outbound-network guard to the integration lane so.envazure_blob settings can no longer hangmake ready. - Match a11y + e2e:
DesignPickerlistbox markup satisfies ARIA required-children/parent rules; facility-detail e2e updated for the Match handoff CTA.
Docker
docker pull touchthesun/openhardwaremanager:0.9.0Multi-arch: linux/amd64,linux/arm64
Open Hardware Manager 0.8.11
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-typesandohm file-types list|validate; ADR atdocs/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 withdisplay_path,directory,file_type,render_tier, andmime_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.11Multi-arch: linux/amd64,linux/arm64
Open Hardware Manager 0.8.10
Added
- OKH manifest file proxy (#272):
GET /v1/api/okh/{id}/files/{path}streams design and manufacturing files from blob storage or the manifestrepoURL; OKH detail enriches file refs withurl; frontend uses proxied links;ohm okh download-file;probe_okh_filesprefersurl/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.10Multi-arch: linux/amd64,linux/arm64
Open Hardware Manager 0.8.9
Added
- Unified distributed cache (#271): pluggable
CacheBackendwithmemory(default) andredisbackends; shared by@cache_responseandcached(); cache stats onGET /v1/api/utility/metrics. Optional Redis service indocker compose --profile redis. - ACA triage harness and production probes:
make harness/make harness-probeswithprobe_match,probe_cache,probe_okh_files, andprobe_latency; proposal workflow underdocs/testing/probe-workflow.md.
Fixed
- Match 503 cold start on ACA (#270):
MATCHING_EAGER_INITpre-loadsMatchingServiceduring app lifespan;/health/readinessreportsmatching_service; frontend surfaces APIrequest_idon 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.9Multi-arch: linux/amd64,linux/arm64
Open Hardware Manager 0.8.8
Changed
OKW_SOURCEunset now defaults tounion(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=storagerestricts to blob only andOKW_SOURCE=momto MoM only;MATCHING_LOCAL_OKW_JSON_DIRstill 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_resolvednow distinguishes unset (→ union) from an explicitstorage.- One shared facility-pool resolver for API and CLI.
POST /v1/api/matchand theohm matchCLI now resolve the candidate pool through a singleOKWService.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,unionstill 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.8Multi-arch: linux/amd64,linux/arm64
Open Hardware Manager 0.8.7
Added
- Typed configuration schema + per-environment files (config Slice 1): a
pydantic-settingsschema (src/config/schema.py) is now the single source of truth for the storage target (provider / account / container), the runtimeenvironment,OKW_SOURCE, and CORS. Non-secret values are checked in per environment atconfig/environments/{development,test,production}.tomland layered under process env vars (env wins); secrets (AZURE_STORAGE_KEY,API_KEYS,LLM_*) stay env/secretRef-only.settings.pyandstorage_config.pyconsumers read the schema; the old inline env-read paths were removed. Behaviour-preserving — thedocker --env-filequote-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.pyemits the schema-owned settings into a marked block ofenv.template(name, default, secret-vs-not).make env-templateregenerates it (part ofmake 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 +
/healthfingerprint + deploy gate): the app now validates its config at startup — hard-failing inproductionon invalid/missing storage config, warning and degrading elsewhere. Public/healthgains a best-effort, time-boxedstoragefingerprint (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 matchesconfig/environments/production.tomland 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.pypreviously only setENVIRONMENT+CORS_ORIGINSand leftSTORAGE_*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 fromconfig/environments/<environment>.toml(incl.AZURE_STORAGE_CONTAINER) via additive--set-env-vars. Secrets are refused bydeploy_env_vars()and existingsecretRefs (e.g.AZURE_STORAGE_KEY) are left untouched.
Docker
docker pull touchthesun/openhardwaremanager:0.8.7Multi-arch: linux/amd64,linux/arm64
Open Hardware Manager 0.8.6
Fixed
- MoM
OKW_SOURCE=momsilently overridden byMATCHING_LOCAL_OKW_JSON_DIR:POST /v1/api/matchchecked the local-dev JSON directory override beforeOKW_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_SOURCEis now checked first in_get_filtered_facilities. - CORS preflight 400 on deployed containers:
CORS_ORIGINSdefaults to an empty list (deny all) in production when unset, which makes Starlette'sCORSMiddlewarereject every browser CORS preflight with 400 before the request reaches a route handler. None of the GCP/AWS/Azure deployment config paths (deployment.yamlviafrom_dict(), or thedeploy_gcp.pyCLI script viawith_defaults()) ever set it. All deployment config construction paths now defaultCORS_ORIGINSto"*"(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 formom_bridge.py, taxonomywikidata_qidlookups, andOKW_SOURCErouting (none existed since the integration shipped in#181).
Docker
docker pull touchthesun/openhardwaremanager:0.8.6Multi-arch: linux/amd64,linux/arm64
Open Hardware Manager 0.8.5
Fixed
GET /v1/api/okhtimeout:SmartFileDiscovery.discover_files()cascaded to full-bucket strategies (metadata scan, content-validation) when theokh/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_structurere-raises storage exceptions so the caller can make the cascade decision correctly.
Docker
docker pull touchthesun/openhardwaremanager:0.8.5Multi-arch: linux/amd64,linux/arm64
Open Hardware Manager 0.8.4
Added
- Repair workflow epic (GAPs 1–8): End-to-end API and CLI surface for field-device repair workflows —
AssetRecordphysical-state domain object,AssetStatuslifecycle 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 viacompatible_manifest_ids(GAP-8), and claim/reservation mechanism for harvestable components (GAP-7). make readygate: 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-Protofrom ACA's TLS-terminating ingress, causing all trailing-slash redirects to generatehttp://URLs instead ofhttps://. Addedforwarded_allow_ips = os.getenv("FORWARDED_ALLOW_IPS", "*")togunicorn.conf.py. make ready/ parity gate: Wiredvalidate-docs,parity, ande2etargets into the project Makefile;make parityrunstests/parityto catch service↔route↔CLI drift early.
Docker
docker pull touchthesun/openhardwaremanager:0.8.4Multi-arch: linux/amd64,linux/arm64
Open Hardware Manager 0.8.2
Fixed
- Docker
--env-filebreaks remote storage (quoted env values):docker run --env-filepasses values verbatim including surrounding quotes, whiledocker-compose/python-dotenvstrips them. The_env()helper instorage_config.pynow defensively strips"and'from all credential and bucket-name variables, preventing DNS failures such asCannot 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_ACCOUNTwas present in.env, triggering a noisy warning about missing optional packages on every CLI invocation. Detection now requiresAZURE_KEY_VAULT_URLorWEBSITE_INSTANCE_IDto 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.mdanddocs/development/container-guide.mdupdated with explicitdocker run --env-fileguidance, per-provider env-var tables, and a troubleshooting section on the quoted-value DNS failure.
Docker
docker pull touchthesun/openhardwaremanager:0.8.2Multi-arch: linux/amd64,linux/arm64