Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .well-known/mcp-manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"schema_version": "0.1-draft",
"_note": "Experimental site-level Model Context Protocol manifest. Schema is a community draft (see https://modelcontextprotocol.io). This site is a static, public, read-only documentation surface — listed resources are GET-only. Open3DCP is a schema definition project; it does not host mix-design data.",
"name": "Open3DCP",
"description": "Open data standard / flat schema for 3D-printable concrete (3DCP) mix design and test records. Current public schema version: v1.7. Defines column names, units, types, and engineering context covering binders, aggregates, fibers, admixtures, fresh-state rheology, hardened mechanical properties, durability, and 3DCP process parameters.",
"description": "Open data standard / flat schema for 3D-printable concrete (3DCP) mix design and test records. Current public schema version: v1.7 (Status: Draft — under working-group review). Defines column names, units, types, and engineering context covering binders, aggregates, fibers, admixtures, fresh-state rheology, hardened mechanical properties, durability, and 3DCP process parameters.",
"publisher": {
"name": "Sunnyday Technologies LLC",
"url": "https://sunn3d.com/"
Expand Down
2 changes: 1 addition & 1 deletion .zenodo.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"orcid": "0009-0002-1897-384X"
}
],
"description": "An open data standard for 3D concrete printing — a schema and column reference for recording mix designs, mechanical test results, and process parameters in a consistent, interoperable format. Cross-references ASTM, CEN, ACI, and RILEM standards.",
"description": "An open data standard for 3D concrete printing — a schema and column reference for recording mix designs, mechanical test results, and process parameters in a consistent, interoperable format. Cross-references ASTM, CEN, ACI, and RILEM standards. Status: Draft — under working-group review; the schema may change before ratification.",
"license": "Apache-2.0",
"keywords": [
"3DCP",
Expand Down
2 changes: 2 additions & 0 deletions Open3DCP_SCHEMA.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

**Open Data Standard for 3D Concrete Printing**

> **Status: Draft** — under working-group review; the schema may change before ratification.
>
> **v1.7 (2026-06-04):** **Aggregate-conditioning columns added** so effective (free) mix water is recoverable when aggregates are batched off SSD: `aggregate_moisture_state`, `aggregate_absorption_pct`, `aggregate_moisture_content_pct` (ASTM C127/C128, C566), plus a process flag `aggregate_prewetted` for the common practice of pre-wetting aggregate to a damp condition. Tooling/fidelity fixes: imperial-tonnage units (`lb_yd3`, US short ton, UK long ton) added and a bare "ton" rejected as ambiguous; ingestion fidelity refined so relational foreign keys no longer count against coverage; test-method crosswalk completed. Backward-compatible (additive); v1.6 datasets remain valid.
>
> **v1.6 (2026-06-03):** **kg/m³ adopted as the primary reporting basis** (industry/field standard); mass-% retained as a derived secondary representation. New columns: `original_basis`, `mix_density_kg_m3`, `total_binder_kg_m3` (lossless basis conversion); `compressive_strength_stddev_mpa`, `flexural_strength_stddev_mpa`, `tensile_strength_stddev_mpa`, `elastic_modulus_stddev_gpa`, `interlayer_bond_stddev_mpa` (per-measurement uncertainty); `raw_data_doi`, `stress_strain_file`, `rheology_curve_file`, `microstructure_image`, `raw_data_file` (raw-data references). Backward-compatible (additive). Improves interoperability and ingestion fidelity for relational concrete datasets.
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

<h1 align="center">Open3DCP</h1>
<p align="center"><strong>Open Data Standard for 3D Concrete Printing</strong></p>
<p align="center"><em>Status: Draft — under working-group review; the schema may change before ratification.</em></p>
<p align="center">
<a href="https://doi.org/10.5281/zenodo.19647471"><img src="https://zenodo.org/badge/DOI/10.5281/zenodo.19647471.svg" alt="DOI"></a>
</p>
Expand Down
6 changes: 3 additions & 3 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -635,7 +635,7 @@
"https://doi.org/10.5281/zenodo.19647471"
],
"identifier": "10.5281/zenodo.19647471",
"version": "1.7",
"version": "1.7", "creativeWorkStatus": "Draft",
"license": "https://www.apache.org/licenses/LICENSE-2.0",
"creator": {
"@id": "https://sunn3d.com/#organization"
Expand Down Expand Up @@ -851,7 +851,7 @@

<!-- HERO -->
<section class="hero">
<div class="hero-label">Open Schema // 3D Concrete Printing // v1.7</div>
<div class="hero-label">Open Schema // 3D Concrete Printing // v1.7 · Draft</div>
<h1>Data.<br/><span>Standard.</span><br/>Open.</h1>
<p class="hero-desc">
Open3DCP is an open schema for 3D-printable concrete mix design and test
Expand All @@ -875,7 +875,7 @@ <h1>Data.<br/><span>Standard.</span><br/>Open.</h1>
</div>
<div class="spec-item">
<div class="spec-label">Schema Version</div>
<div class="spec-value">v1.7<span class="spec-unit">current</span></div>
<div class="spec-value">v1.7<span class="spec-unit">draft</span></div>
</div>
<div class="spec-item">
<div class="spec-label">Material Coverage</div>
Expand Down
4 changes: 2 additions & 2 deletions llms.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ This file is a high-density, plain-text summary intended for LLM retrieval and R
- Maintainer: Sunnyday Technologies LLC (https://sunn3d.com)
- Author: Nicholas Sonnentag (nick@sunn3d.com)
- Contact: open3dcp@sunn3d.com
- Current public version: v1.7 (2026-06-04); canonical column list in Open3DCP_SCHEMA.md
- Current public version: v1.7 (2026-06-04); Status: Draft (under working-group review); canonical column list in Open3DCP_SCHEMA.md

## What it is, what it isn't

Expand Down Expand Up @@ -98,4 +98,4 @@ Open3DCP is the schema layer; CEMFORGE and M3-CRETE are companion projects rathe

## Status

Active. Public schema version v1.7 released 2026-06-04. New columns are added in minor versions as new test methods or material classes become relevant to 3DCP research.
Status: Draft — under working-group review. Public schema version v1.7 released 2026-06-04. New columns are added in minor versions as new test methods or material classes become relevant to 3DCP research.
4 changes: 2 additions & 2 deletions schema-reference/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -486,7 +486,7 @@
"https://doi.org/10.5281/zenodo.19647471"
],
"identifier": "10.5281/zenodo.19647471",
"version": "1.7",
"version": "1.7", "creativeWorkStatus": "Draft",
"license": "https://www.apache.org/licenses/LICENSE-2.0",
"creator": {
"@id": "https://sunn3d.com/#organization"
Expand Down Expand Up @@ -1074,7 +1074,7 @@ <h2 id="5-a-worked-example">5. A worked example</h2>
<p>Process columns capture nozzle, layer, speed, layer time gap, ambient conditions, and mix temperature. Test columns capture the spread, the static yield stress at the time of pumping, the orientation (Z, Y, or CAST), and the test method code.</p>
<p>The corresponding Open3DCP CSV row carries the key context needed to interpret the measurement. A consumer that has never seen this dataset can identify the print orientation, the test method, the lab, and every material composition entry from the row alone when those fields are populated. Where two compressive results come from the same mix but different orientations, they are recorded as separate rows that share a <code>mix_id</code> prefix and differ only in <code>test_orientation_code</code>; an ML pipeline can group or condition on orientation at training time. The <code>lab_name</code> and <code>measurement_confidence</code> fields enable downstream meta-analysis to weight or partition by lab and by data quality.</p>
<p>The same record is easier to extract for ML or statistical analysis because each feature is a column and each row is an observation. This is the central design property of the schema and the reason for the flat structure: no JSON traversal is required before a model or dataframe can consume the data.</p>
<p>The schema can be wrapped with dataset-level JSON-LD for deposit alongside Zenodo records. In the current public v1.7 release, the canonical machine-readable surfaces are the Markdown schema reference, the SQL DDL, and the Dataset JSON-LD embedded on this site. A full Open3DCP vocabulary namespace and example-deposit templates should be published only when they are complete enough for downstream users to rely on.</p>
<p>The schema can be wrapped with dataset-level JSON-LD for deposit alongside Zenodo records. In the current public v1.7 release (Draft — under working-group review), the canonical machine-readable surfaces are the Markdown schema reference, the SQL DDL, and the Dataset JSON-LD embedded on this site. A full Open3DCP vocabulary namespace and example-deposit templates should be published only when they are complete enough for downstream users to rely on.</p>
<hr />
<h2 id="6-adopting-open3dcp-in-your-lab">6. Adopting Open3DCP in your lab</h2>
<p>The schema is designed so that adoption does not require changing how your lab runs experiments. It requires only that the results are recorded in a uniform shape on the way out. The recommended workflow is three steps.</p>
Expand Down
37 changes: 31 additions & 6 deletions scripts/check_version.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,8 @@ def checks(vv, v):
"tools/ingest/open3dcp_ingest/__init__.py": [
f'TARGET_SCHEMA_VERSION = "{v}"', f'__version__ = "{vv}"'],
"tools/ingest/README.md": [f"schema v{v} → tool"],
"index.html": [f'"version": "{v}"', f"// v{v}</div>",
f'>v{v}<span class="spec-unit">current'],
"index.html": [f'"version": "{v}"', f"// v{v}",
f'>v{v}<span class="spec-unit">'],
"schema-reference/index.html": [f'"version": "{v}"', f"current public v{v} release"],
"llms.txt": [f"Current public version: v{v}", f"Public schema version v{v}"],
"README.md": [f"current schema v{v}", f"Open3DCP v{v} tracks"],
Expand All @@ -60,6 +60,20 @@ def checks(vv, v):
}


# Maturity status (decoupled from the SemVer number): the schema is a working-group draft
# until ratified. Flip these markers (and the lines they sit in) from "Draft" to "Stable" at
# ratification. Kept here so the status, like the version, can't silently drift across surfaces.
STATUS = {
"Open3DCP_SCHEMA.md": ["**Status: Draft**"],
"index.html": ['"creativeWorkStatus": "Draft"', 'spec-unit">draft<'],
"schema-reference/index.html": ['"creativeWorkStatus": "Draft"'],
"llms.txt": ["Status: Draft"],
".well-known/mcp-manifest.json": ["Status: Draft"],
".zenodo.json": ["Status: Draft"],
"README.md": ["Status: Draft"],
}


def main():
vv, v = canonical_version()
print(f"canonical version (from CHANGELOG.md): {vv} (minor v{v})")
Expand All @@ -72,14 +86,25 @@ def main():
text = open(path, encoding="utf-8").read()
for needle in needles:
if needle not in text:
missing.append(f"{rel}: missing {needle!r}")
missing.append(f"{rel}: missing version label {needle!r}")
for rel, needles in STATUS.items():
path = os.path.join(ROOT, rel)
if not os.path.exists(path):
missing.append(f"{rel}: file not found")
continue
text = open(path, encoding="utf-8").read()
for needle in needles:
if needle not in text:
missing.append(f"{rel}: missing status marker {needle!r}")
if missing:
print(f"\nFAIL — {len(missing)} version label(s) out of sync with v{vv}:")
print(f"\nFAIL — {len(missing)} version/status label(s) out of sync:")
for m in missing:
print(f" x {m}")
return 1
print(f"OK — all {sum(len(n) for n in checks(vv, v).values())} version labels "
f"across {len(checks(vv, v))} files are consistent at v{vv}.")
n_ver = sum(len(n) for n in checks(vv, v).values())
n_stat = sum(len(n) for n in STATUS.values())
print(f"OK — {n_ver} version labels across {len(checks(vv, v))} files consistent at v{vv}; "
f"{n_stat} Draft-status markers across {len(STATUS)} files consistent.")
return 0


Expand Down
Loading