ULC v1.0.0
ulc CLI v1.0.0
Download a single-file binary for your platform below. See CHANGELOG.md
at the tag for what landed in this release.
ULC gains its second grading axis and makes its first formal backward-compatibility commitment. Product Achievements is a computed view alongside data completeness: per theme (embodied carbon, circularity, material health, energy, dark sky, emergency) it reports whether a record demonstrates a third-party program qualification and with what evidence (none, claimed, or documented), computed from the attestations a record already carries. The release is additive to the authored surface: no field, token, or finding code is removed, and no field type is narrowed; every conformance grade and completeness finding is byte-identical. The one compatibility-affecting change is confined to the generated index, which gains two new always-stamped members that are required in the built index; a stored record picks them up with a one-time ulc build-index re-stamp (see the behavior note below). From 1.0.0 forward the schema surface is additive-only across minors, and any breaking change requires v2.0.0.
Behavior change (important for consumers)
This release adds two generated index members and three finding codes; a stored record needs one re-stamp. What changes:
- Re-stamp required. The generated index gains
index.achievementsandindex.restricted_substances_declared, both now schema-required, andbuilder_versionbumps to0.6.0. A record stored under a previous version failsbuild-index --check(and the index-parity step invalidate) until re-stamped withulc build-index; the re-stamp adds only the two new members and the builder version and moves nothing else. - One new default-visible line.
ulc validateemits a singleachievements/summaryINFO per record (achievements: N documented, M claimed), always shown. Per-record INFO counts rise accordingly. - Two verbose-only codes.
achievements/state(one per non-none theme) andachievements/roadmap(attach the certificate to raise a claimed theme to documented) are hidden from text output unless--verboseand always present in JSON, exactly like the enrichment and observation codes. - Hidden-count hint reworded. The merged hidden-findings hint now reads
N optional findings hidden (enrichment, observations, and achievements); use --verbose or --json. - From-sheet default. Newly converted records stamp
ulc_version1.0.0(the from-sheet default; records supplying theulc_versioncolumn are unaffected). - Grades do not move. Every conformance grade,
index.conformance_level, and completeness finding is byte-identical; the only golden-output changes are the three new achievements codes and the reworded hint.
Schema (additive)
- Two new generated
indexmembers, both required in the built index and always stamped by the builder:achievements(athemesobject carrying all six fixed theme keys, each anAchievementTheme, plus adocumented_countrollup) andrestricted_substances_declared(a sorted array of restricted-substances program tokens declared in the ledger). Thethemescontainer is open, so future themes add without breaking. - New
AchievementTheme$def: per theme, astate, the qualifyingprograms, the contributingsource_attestation_ids, anevidence_presentflag, and an optionalbest_metric_ref. attestations[]gains two optional fields:sustainability_metric(a payload forceam_score,embodied_carbon_kgco2ewith its requiredembodied_carbon_scopeandembodied_carbon_functional_unit,c2c_overall_level, andmethod_variant) andissuing_authority.- Three new taxonomy enums:
EmbodiedCarbonScope,CircularityTier, andAchievementState.
Grading and achievements
- A new
internal/achievementspackage computes the Product Achievements axis as a pure function of one record, modeled on the completeness package's shapes by copying, not importing (a package-level import guard enforces the boundary in both directions). It reads three inputs only: the merged attestation ledger (attestations[]andproduct_family.shared_attestations[]),sustainability_declaration.declaration_type, andrecord_status_as_of(for the record-relative expiry comparison). The wall clock never enters, soindex.achievementsis reproducible andbuild-index --checkis stable across time. - A theme is
documentedwhen a qualifying, non-disqualified attestation carries an attachedsource_document_ref(a file reference the schema guarantees to have a filename and a SHA-256 hash);claimedwhen a qualifying contribution carries none;noneotherwise. Astatusofexpired,withdrawn, ornot_applicableremoves an attestation from every theme, and an attestation whosevalid_untilprecedes the record'srecord_status_as_ofcannot supportdocumented.documentedis a record fact, never a verification by ULC. - The emergency theme is ledger-only (
ul_924,ul_1994,icel), with no product-role or category gate, so a dedicated exit sign and a normal fixture with an emergency-power option earn it identically. - The program-to-theme map is published as a versioned appendix in the compliance-attestation glossary;
documented_countis the only rollup, and there is no weighted or overall achievement grade.restricted_substances_declaredis a sibling legal-floor flag, never a theme.
Tooling
BuilderVersion0.5.0to0.6.0: the builder now stampsindex.achievementsandindex.restricted_substances_declared, emitting them with JSON-normalized types so the stored index round-trips through the drift check without false positives.ulc validateandulc from-sheetadd the achievements findings to the report; emission is not gated on the conformance level, since the axes are orthogonal. Text and JSON output is sorted by finding code, so theachievements/*lines group by code rather than by emission order.ulc from-sheetstampsulc_version1.0.0by default.
Examples and docs
- All eight reference records re-stamped to
builder_version0.6.0with their newindex.achievementsandindex.restricted_substances_declaredmembers; each record's authoredulc_versionis unchanged (five at0.8.0, three at0.10.0), which is the live backward-compatibility proof. The Cooper AtLite AUX record is the corpus's onedocumentedcase (its UL 924 attestation carries an attached UL Certificate of Compliance), so its emergency theme isdocumented; the Sure-Lites ES and LPX signs areclaimedon emergency, the LPX alsoclaimedon energy (California Title 20), Selux Ayaclaimedon dark sky and material health, Vode Nexaclaimedon material health, and both Lumenpulse records declarerohs. methodology.mdgains a two-grading-axes section covering the Master Ledger, the reproducible-inputs invariant, and the expiry and status rules;compliance-attestation.mdgains the achievement-themes appendix and refines the ICEL classification to the emergency-lighting conformity scheme;how-it-works.mdandREADME.mdpresent both axes;ROADMAP.mdrecords v1.0.0 as the two-axis and compatibility-commitment milestone and foreclosing every deferred breaking change to v2.0.0.