Skip to content

Scientific assets and reusable results

Reviewed 24 September 2026. The bounded M2 pilot exposes source-backed curves, retained captures and managed derivatives through one scientific read contract. Published results become private catalogue assets; an explicitly authorized colleague can use one in another local Python calculation. Review remains optional.

Download the public reader and login helper into the same folder. Use Python 3.11+; only the standard library is needed. Authorize your own account using the browser login steps.

Terminal window
python3 scientific_chain.py --credentials ./application.json --url https://YOUR-WORKSPACE --project YOUR-PROJECT
python3 scientific_chain.py --credentials ./application.json --url https://YOUR-WORKSPACE --project YOUR-PROJECT \
--asset ASSET-ID --revision EXACT-REVISION --curve GR --output exact-read

Discovery prints only permitted assets. The second command checks both representation hashes and writes a descriptor, curve JSON and exact LAS to a new directory. No run is created. Choose a different output directory when repeating the read. Download the complete client/example bundle.

Machine routeMeaning
GET /api/v1/projects/{project}/scientific-assetsSummaries; limit1–100, default25, next_cursor pagination
GET .../{asset}/revisions/{revision}?curve=GRExact per-curve descriptor; curve is required
GET .../representations/curve:GR?curve=GRNormalized JSON with exact byte hash/length
GET .../representations/artifactCurve-independent original or derived LAS bytes

URI-encode path/query components. Use a scoped bearer and, for browser-approved application access, its grant header. Bearer requests reject cookies/Origin. On gateways with the one-API update, Workspace uses these GET resources with its session cookie and CSRF header. Older deployments use CSRF-protected POST aliases; check the deployed OpenAPI for supported credentials. A descriptor does not grant rights; each read rechecks authorization. Missing/inaccessible revisions return 404; incompatible context422, integrity conflict409 and bounded capacity413. Errors use flat {"error":"message","code":"code"} objects. Artifact responses are capped at32MiB; normalized curves at100,000 samples. No range-read or streaming guarantee.

A LAS may contain several curves. Discovery lists observed curve names without parsing every payload. Descriptors describe current normalization and its reader; they do not fabricate historic parsing choices. An exact artifact can be exported independently. Restricted private parents are explicitly labelled and omitted.

The Workspace inspector reads the same exact descriptor and curve representation routes. It admits at most two scientific reads at once, deduplicates matching pending reads and aborts them when the selected asset or revision changes. A bounded busy response is retried once; other failures remain visible without clearing a successfully loaded primary curve. Restricted parents are not fetched.

A track preserves the response axis and values. JSON nulls become drawing gaps; zero remains zero. No sorting, interpolation, unit conversion or decimation occurs. An unordered depth axis supports row stepping, but not depth-based pointer picking. Native curve data retains its declared value unit and native measured-depth contract; shared-version previews retain their supplied rows and truncation label. A preview is not a claim to have loaded the entire source.

An original/result comparison requires the exact declared parent revision, known matching value and depth units, matching depth reference and reader, mapping and parsing policy. Equal axes pair by row. Otherwise only exactly equal, unique depths pair; repeated depths refuse that alignment. Signed differences are result - original; newly missing/present samples are counted separately. The two curves share a value range, including both extrema; the original is dashed. Comparison never creates a revision or certifies the declared calculation.

A tested synthetic example has depths [100, 101, 102, 103, 104], original values [2, 12, null, 32, 40], and result values [3, 13, null, 33, 40], all in gAPI. The overlay spans 2–40, retains the missing sample at102, and reports five compared samples, three changed, and both signed change bounds +1gAPI. Keyboard picking at101 reports the exact result13gAPI. The live restricted-parent check also covers copied technical JSON; identifiers hidden by access policy stay absent there. See inspection and recovery steps.

Gateways with the vocabulary update add an optional display object to asset summaries and descriptors. Profile names come from the versioned contracts registry. The UI uses them in its default layer and keeps exact identifiers in Technical details, where they can be copied. Display text is descriptive; clients must continue to use exact IDs/revisions and server permission checks.

Technical valuePlain words
las2/1LAS 2.0 well log file
geotiff/1GeoTIFF raster (single band)
sql-wells/1Well locations from a SQL table
osdu-record/1OSDU record
osdu-welllog-parquet/1OSDU well log (Parquet)
source-referenceHeld as: Linked
retained-captureHeld as: Copy kept in the project (the API’s display.held_as says Saved copy)
managed-derivedHeld as: Result
follow / pin / subscription reviewMoves to newer versions by itself / Keeps this version until you change it / Waits for you. A browser session cannot ask for follow or automatic apply (403, Versions are not applied for you automatically. Choose Get when you want a newer one.); access keys and delegates still may
ophiolite:uploadedUploaded by you, a named person, or a project member
ophiolite:derivedResult of a calculation

The block can also include source, status, version, last_checked, method, settings, evidence, checked, built_on and available_as. Missing fields use neutral labels in the current Workspace. Version uses an actual publication/upload date, an explicit source version or ordered history; polling time stays separate as Last checked. Unknown method parameters remain technical data. Available representations depend on kind, format and availability: a normalized surface is not described as a curve table.

This is an additive 1.x update. New schemas still accept old fixtures without display; the frozen pilot CLI 0.2 reader continues to read and verify named fields. A client validating a new response against a pinned older schema with additionalProperties: false must update that schema first. This compatibility exception does not change scientific identity, units, nulls, CRS or immutable payloads. Release display metadata sits beside the manifest, never inside its hashed scientific identity. Restricted parents remain redacted from the whole response, including Technical details and copied JSON.

Audience responses may include display.member_names, keyed by the exact IDs already authorized in that response. Upload-member listing, uploader-only original sharing and author-only result sharing use existing account names where available. This is not a directory or an access grant. Workspace distinguishes missing or duplicate names and puts the exact label-to-ID mapping in Technical details. Permission requests still send IDs, never display names or list positions.

  1. The author publishes a bounded correction through a Workspace-configured input.
  2. In Data → Results, grant the colleague Can view and download and Can build on it.
  3. The colleague opens the result in Data and selects Build on it in Python.
  4. They save their own exact input configuration and run the existing curve client locally with that binding. No intermediate upload is required.
  5. Their result is another private asset; share it explicitly when needed.

The colleague also needs project membership and compute access. Read alone does not permit execution, and administration does not reveal private results. Each new calculation creates a separate asset; an identical retry returns the same publication. Revoking reuse blocks unresolved runs; already published descendants keep their own grants. Root distribution restrictions and withdrawal still apply throughout the chain. See the complete workflow.

A retained result can gain new versions from its author (E8). Each version is an exact revision of the same asset id; earlier versions keep their bytes, values, parents and calculation details, and runs, links and shares that named them keep reading them. The descriptor (contract 1.4.0, registry 1.7.0) carries an optional history block for managed results: number and parent_revision of this revision never change; count and head_revision describe the result as it is now. applications/result-history lists every version the caller may read, oldest first, with number, parent, time, person, calculation and review stage; parents follow the restricted-parent rule for each version and run ids are shown only to their author.

A new version is published with append_to (the result) and expected_parent (the revision you reviewed). Only the author can add versions, and only from the same original; a project can also name members who add versions to each other’s results (publications/version-contributors): then a named member who can read the result adds one too, the author stays the author (only they change who reads it) and is told. A newer head, or content that already was a version, is refused with HTTP 409 revision-conflict; repeating the same request returns the same receipt. Result summaries carry revision_number, revision_count and, when you can read the input, input_update.newer_revision_available — a derived signal that the input has a newer version. It is not a recommendation and nothing is recalculated. Newer versions of connected (source-backed) inputs are reported by the update workflow, not by this field.

You need Python 3.11 or later. No packages, server, credentials or account required.

  1. Download the synthetic demo ZIP.
  2. Extract it and open a terminal in scientific-assets-demo.
  3. Run:
Terminal window
python3 -I scientific_asset_example.py \
--descriptor fixtures/source.json \
--curve fixtures/curve.json \
--artifact fixtures/original.las \
--start 100 --stop 103 --offset 2 --output correction.json

Open correction.json. Expected values: [2, 12, null, 32, 40]. The real zero at depth 100 becomes 2. Depth 102 remains missing; depth 104 is unchanged. The file contains proposed {index,value} changes and verified input digests, not a publication receipt. All data in this download are synthetic, not observed wells.

Try --offset -999.25 with a new output filename: the example must reject a result that collides with the LAS missing-value marker. It never overwrites an existing file.

FieldMeaning
Asset ID and revisionStable data-product identity and exact immutable content/context version
Authority and custodianWho is authoritative versus who retains bytes
Scientific profileThe qualified interpretation; not inferred compatibility with every application
RepresentationOriginal artifact or normalized curve, exact length/digest and declared losses
Source/parents and reader policyExact provenance plus parsing and mapping choices
RetentionWhether history depends on the upstream or retained authorized bytes
AuthorizationOffline fixtures are not evaluated; capabilities grant no access

Try capture.json with the same curve and original artifact: the values and source authority agree; managed custody differs. derived.json instead uses derived-curve.json and derived.las, with managed authority and an exact parent. These are illustrative descriptors, not proof of live publication or sharing.

The offline example publishes nothing. The separately qualified live workflow creates a managed asset and receipt; the fixtures do not grant access.

The existing normalized shape is ophiolite.application-curve/1, backed by las2/1. Depth coordinates and units remain as supplied. Finite decreasing or duplicate depth coordinates are preserved in source row order. Empty units remain unknown. No MD/TVD, datum, well identity, unit conversion or resampling is inferred.

JSON null is missing; 0 is a valid value. Original LAS retains its declared NULL marker. Parameters use source coordinate/value units. At most 100,000 samples and 1,000 changes are supported. The example rejects nonfinite numbers and marker collisions. Stronger application requirements, including native-host import, need separate checks. Exact inputs and a declared method provide traceability, not proof of a scientifically correct or computationally reproducible calculation.

The standalone script verifies consumed fields and hashes; the Platform conformance suite additionally validates origin/custody, permissions, paired samples, observed axis facts and descriptor/representation consistency. This is a versioned pilot contract, not a stable general SDK. Breaking meaning or authorization changes require a new version and a documented transition release; cached permissions never authorize future reads.

A digest error means the descriptor and bytes do not match: restore the matching fixture set. An existing-output error means choose a new filename. An unsupported schema or incompatible context requires a qualified representation, not editing values or checksums to bypass the error. There are no upstream credentials in this example, and no network access occurs.

The online pilot distinguishes temporary pressure (503, code busy, Retry-After: 1) from an oversized request or configured storage limit (413). Wait before retrying a busy request. For curve_application.py, repeat the same command with the same output directory: its saved command identifies the existing publication. Do not delete run.json to recover a failed request. A new directory creates a new calculation. The offline correction example instead refuses to replace an existing output file; that file is not a published result.

After an operator restores a deployment, accounts remain locked until current permissions are reviewed. Sign in and authorize Python again once your account is admitted; restored old credentials and approvals are invalid. A backup does not include permission changes made after capture, so restored permissions require review. If access remains denied, ask the project administrator rather than changing asset IDs.

An exact retained input stays at its recorded revision. Missing bytes, withdrawn inputs or revoked access fail explicitly; the service never silently substitutes a newer curve. Original LAS null markers remain in original artifacts, normalized missing values remain null, and genuine zero values remain numbers.

The M3 isolated qualification used PostgreSQL-backed identity and control stores, Keycloak, one gateway and a synthetic three-asset chain. Process interruption, coordinated restore, fresh login and bounded concurrent reads were exercised; NLOG scientific preservation also passed regression tests. This is a bounded pilot, not a multi-server availability or 100-user capacity promise. External-user product validation remains outstanding. Workspace displays a retryable busy alert.

The common asset contract describes identity, authority, revision, representation, provenance, availability and access. A scientific profile describes supported meaning and structure. An operation states what it needs to perform its particular calculation. A source mapping records how a source format becomes a supported representation. These are separate responsibilities, not four competing schema systems.

For the current LAS path, las2/1 identifies the source/artifact profile; ophiolite.application-curve/1 is the normalized curve schema; application-curve/1 is its reader mapping; portable-las2/1 names the output slot. The native protobuf ophiolite/well-curve/1 is different: it requires strictly increasing MD in metres. The LAS reader preserves finite decreasing or duplicate depths and unknown units. The interval-offset operation uses source-native coordinates/units and preserves row order and missingness. An operation requiring ordered measured depth in metres must check those stronger requirements; successful structural validation does not establish scientific suitability. No silent datum inference, conversion, reordering or gap fill makes an incompatible input suitable. Profiles need not subset an OSDU record schema; OSDU mappings pin the actual source schema version where applicable.

The current separate-asset-per-calculation policy is a qualified publication choice, not a universal rule for every future edit. Identical retry recovers the same result. A representation can omit context or have documented loss; a matching checksum proves byte identity, not scientific equivalence. A receipt records committed publication; external methods/code/environment remain declarations. Exact references establish traceability, not proof of execution, deterministic reproduction or scientific validity.

An authorized user-uploaded LAS is a retained capture with ophiolite:uploaded authority and an exact original representation. Its optional acquisition descriptor contains declared attribution/well notes/rights and server-recorded uploader/time. Use the updated downloadable v1 schema when validating this additive field; older strict schema snapshots will reject it. Existing descriptors and historical bytes remain unchanged. Public reads and own managed-input bindings work as for supported retained assets; an upload is not a live upstream or OSDU connection. See the self-service guide for upload/grant bounds.

The browser upload contract is POST /api/las-upload with session cookie, trusted Origin, X-CSRF-Token, application/octet-stream and an exact Content-Length (1 byte to the deployment’s upload_bytes, 8 MiB by default; chunked transfer is refused). A larger file is sent in parts through las-uploads/begin, part, state, finish and publish (Large files). X-Ophiolite-Upload is base64 UTF-8 JSON, limited to 8,192 encoded bytes, containing:

FieldMeaning / bound
project_idAuthorized project, 1–160 characters
command_idRetry identity, 1–64 characters
filename, nameDeclared filename and catalogue name, each 1–160 characters
attributionRequired source declaration, 1–500 characters
well_notesOptional context, at most 1,000 characters
audienceAt most 100 distinct existing project account IDs
rights_confirmedMust be true; user attests retention, derivation and sharing rights

This is a browser administration endpoint, not a new machine-credential upload scope. Identical command/content/metadata retries return the same asset; changed content with that command returns409. Upload is private. /api/las-uploads/info and /share take project_id/asset_id as JSON; share also takes audience and reuse_audience (reuse is a subset of read). Only the uploader may change grants within the original ceiling. /members lists eligible account IDs for an administrator. Normalized scientific reads and application publication retain their existing public machine interfaces.

Malformed/unsupported LAS returns400, unauthorized access401/403, capacity413 and busy admission503. Two uploads are admitted before consuming bytes. Unknown retained kinds fail closed. First upload advances a local schema guard; stop the old gateway before upgrade. Rollback requires a coherent pre-upload backup rather than forcing old binaries to read new upload records. No original is rewritten during upgrade.