Skip to content

SOF-8051: schemas for sample and measurement - #436

Open
VsevolodX wants to merge 24 commits into
feature/SOF-8050from
feature/SOF-8051
Open

VsevolodX wants to merge 24 commits into
feature/SOF-8050from
feature/SOF-8051

Conversation

@VsevolodX

@VsevolodX VsevolodX commented Sep 8, 2026 •

Copy link
Copy Markdown
Member

Schemas for experimental data: the places measured on a physical piece, and the measurements.

  • sample — a place or portion of a physical thing that a measurement is about: label, position (the instrument's reading, 2–3 axes, as read), physicalId — the identifier written on the thing it is part of. That string is the join between everything measured on one piece.
  • measurement — one procedure on one sample: _sample, workflow, setup, status.
  • measurement/setup — the instrument and the session, as a job has compute: name, description, session, settings. Only what every instrument has; the rest of what a run reports is metadata.
  • property source may be external: origin (the measurement), subject (the sample), unitId.
  • hysteresis_loop — the SS-PFM loop as a non-scalar property, with its parameters.

Sets are plain folders, as material sets are. The frame a position was read in is metadata on the sample; relating positions across sets is an analysis, not a field. Rejected on the way, and recorded in the planning repo: a wafer schema, typed sample sets, frame/anchor/rotation fields, descriptions that state rules instead of what a thing is.

572 schemas, 940 edges, 214 examples; Python models and data modules regenerated from these schemas.

Jira: https://mat3ra.atlassian.net/browse/SOF-8051 (epic SOF-8050).

🤖 Generated with Claude Code

…l property source

A Sample is a physical specimen or a site on one: label, optional position, set membership. A
Measurement is one procedure applied to one sample by an instrument: _sample, workflow (the
technique is its application), status, and an instrument block — the experimental analogue of a
job's compute: name, description, session (typed: name, started, finished, operator, directory),
settings, environment, registration (permissive). measurement/set adds _sampleSet, the run's tie
to its specimen. A property holder's source may be external: measurementId, sampleId, unitId.
The entity graph learns the measurement domain.
A switching-spectroscopy PFM loop: the response as x/y series with a legend per branch, and its
parameters (imprint, coercive voltages, remanent response, on/off field) as value +
standardDeviation + count over the repeated loops. Reusable pieces: combined_value,
field_condition (on/off, rising/falling) and the parameter set; units for the loop quantities.
Example from run 20260901_171601_alscn_01448.
…elines

573 schemas, 941 edges, 215 examples; the property holder's source is a union now (internal or
external), so its variants hang off data or source.
@netlify

netlify Bot commented Sep 8, 2026 •

Copy link
Copy Markdown

✅ Deploy Preview for mat3ra-esse ready!

Name Link
🔨 Latest commit 9a67a34
🔍 Latest deploy log https://app.netlify.com/projects/mat3ra-esse/deploys/6ac55d910fe90100086b9c25
😎 Deploy Preview https://deploy-preview-436--mat3ra-esse.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
🤖 Make changes Run an agent on this branch

To edit notification comments on pull requests, go to your Netlify project configuration.

…nal schemas; descriptions

The generator emits the measurement models as a package once schema/measurement/ exists, so the
stale measurement.py module goes; the package model carries the required instrument block and no
_materials, and the sample's position is optional. The workflow's description no longer calls the
instrument its application (the technique is; the machine is the instrument). The sample's
description drops the fixed-position and material-matching claims. The external reference gets a
title so its class is named. Examples carry no personal machine paths. One stray manifest line.
@VsevolodX
VsevolodX marked this pull request as ready for review September 8, 2026 05:05
Renamed from instrument on the group's decision: setup = the machine and the sitting (name,
description, session, settings, environment, registration). Same shape, Python models regenerated.
-2.5685e-10,
-2.54596e-10,
-2.507e-10,
-2.45596e-10

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should be smaller

VsevolodX and others added 5 commits September 15, 2026 14:52
Review (VsevolodX): the example should be smaller. It illustrates the shape; the data is the real
measurement's, cut after the twelfth bias step.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ease]

Review (VsevolodX): a job set does not hold a typed back-reference, and a measurement set does not
need one either. The run's specimen is already reachable: a measurement names its sample, and the
sample belongs to the specimen's set. Nothing read _sampleSet, so measurement/set.json goes and a
measurement set is the plain system set.

Graph baselines follow: 572 nodes, 939 edges, 214 schemas with an example.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…eferences [release]

Review (VsevolodX): a result's origin should resolve the way every other link on the platform
resolves. core/reference/exabyte named the producer in the field itself (jobId), so every reader
had to compare field names to learn the kind. The external variant, which is new and unmerged and
written only by our uploader, now carries `origin` and `subject` as entity references whose `cls`
says what they are - so a reader resolves them through the class registry with no comparison.

core/reference/exabyte is untouched: jobs and materials keep their stored shape.

Graph baselines follow: 941 edges, 388 of them contains.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…chema [release]

sample: a place on a wafer where a measurement was taken — position is the
instrument's reading in its set's frame, 2-3 axes; the wafer block for the
wafer's own record. sample/set: the placement, its wafer and origin reading.
wafer: identity, synthesis record, layout. setup keeps what every instrument
has; environment, registration and the session directory move to metadata.

Python models regenerated from these schemas: the sample becomes a package,
wafer is new, measurement/set.py goes with the schema 0616c8f removed, and
the external reference catches up with 1bfe5c9's origin/subject.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Requiring the wafer made every set a placement, and the Samples explorer's New
Set button, move-to-set and update-set all send a name alone. The wafer is
typed when present, and identified properly when it is: physicalId stays
required inside the block.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@VsevolodX VsevolodX changed the title SOF-8051: sample, measurement (instrument, set), external property source, hysteresis_loop property SOF-8051: schemas for wafer, sample, sample set and measurement Sep 22, 2026
VsevolodX and others added 3 commits September 21, 2026 22:43
…every sample [release]

wafer.json and sample/set.json go. A sample carries the identifier written
on the physical thing it is part of; that string is the join between
everything measured on one piece. The frame a position was read in is
metadata on the sample, untyped until a second instrument shows its shape.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…-reference source

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@VsevolodX VsevolodX changed the title SOF-8051: schemas for wafer, sample, sample set and measurement SOF-8051: schemas for sample and measurement Sep 22, 2026
VsevolodX and others added 8 commits September 22, 2026 14:00
…er repo's does

esse shipped an EMPTY src/py/mat3ra/__init__.py. standata, utils, wode and the
rest all ship the one line that makes `mat3ra` a pkgutil namespace package:

    __path__ = __import__("pkgutil").extend_path(__path__, __name__)

Installing esse overwrites that file in site-packages with the empty one, so
`mat3ra` stops spanning locations and every mat3ra.* package outside
site-packages — any editable install — disappears. In this workspace that took
out mat3ra.notebooks_utils and broke the measurement notebook at its first
import; reproducible by reinstalling esse and importing anything editable.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…criptions in standard terms

Co-authored-by: Cursor <cursoragent@cursor.com>
Five property schemas, one per physical quantity, so any instrument that
measures it posts the same shape:

  structural/film_thickness        m          XRF via density, step, ellipsometry
  structural/areal_surface_texture ISO 25178  parameter ∈ Sq Sa Sz Ssk Sku Sal Sdq Sdr
  structural/grain_size            m          statistic ∈ median mean std iqr
  structural/grain_coverage        fraction
  non-scalar/current_voltage_curve V, A

elemental_ratio already existed; it and the five are now in property/holder's
data union, which is the gate the platform validates against - a schema outside
it validates alone and is still rejected as a holder. The union's discriminator
needs `name` required on every branch; the four that lacked it have it.

Graph baselines: 577 nodes, 952 edges, directory 162, examples 219, Properties 90.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@VsevolodX
VsevolodX changed the base branch from dev to feature/SOF-8050 October 8, 2026 03:33

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant