ULC v0.9.0
ulc CLI v0.9.0
Download a single-file binary for your platform below. See CHANGELOG.md
at the tag for what landed in this release.
Data completeness becomes fully explicit and complete. The optional depth taxonomies that were previously surfaced only as passive --verbose observations are now an actionable enrichment roadmap, emitted under a new conformance/enrichment finding code alongside the existing tier roadmap. Five additional optional fields are wired, and the grading package gains a structured Compute() entry point. Every change is additive and non-gating: a v0.8.x record validates and grades identically, and no grade or index.conformance_level moves.
Behavior change (important for consumers)
This release is a finding-code migration, not a pure addition. JSON and --verbose consumers of conformance/observation must update:
- Code migration. 20 findings previously emitted under
conformance/observationnow emit under the newconformance/enrichmentcode, with byte-identical message text (power factor, warranty term, luminous opening shape, emission face, Duv, chromaticity x and y, ambient operating range, compatible accessories, thermal derating, flicker, alpha-opic metrics, chromaticity-shift projection, field angle, cutoff angle, spacing criterion, UGR, LCS zonal lumens, IK rating, EPA).conformance/observationnow carries only four residual sources: the sustainability-declaration nudge, the deprecated legacy-cutoff nudge, the non-measured-headline note, and the attestation-coverage summary. A consumer that suppressed or keyed onconformance/observationmust addconformance/enrichmentto its lists. - JSON finding order. Findings sort by code, and
conformance/enrichmentsorts alphabetically before every other conformance code (gap,grade-gated,grade-satisfied,level,observation), so the enrichment block now precedes the tier roadmap and the level summary in JSON and--verboseoutput. - Default-text hint and info counts. The hidden-findings hint line is reworded to a single merged counter covering both optional codes (
N optional findings hidden (enrichment and observations); use --verbose or --json), and the per-record INFO count at core and above increases, because the enrichment roadmap now surfaces the optional taxonomies as their own findings. - From-sheet console counts.
ulc from-sheetprints per-record finding counts that rise for the same reason, and newly converted records stampulc_version0.9.0(the from-sheet default; records supplying theulc_versioncolumn are unaffected). - Grades do not move. Grades and
index.conformance_levelare unchanged,BuilderVersionis unchanged, and anincompleterecord still emits neither observation nor enrichment findings (both are gated behind reaching core).
Schema (additive, optional)
- Five optional fields, each backed by a taxonomy enum previously defined but unwired:
product_family.orientation(Orientation),photometry.optical_radiation_band(OpticalRadiationBand),electrical.adaptive_lighting_modes(an array ofAdaptiveLightingMode),source_files[].photometry_format(PhotometryFormat, per source file, valid only on a photometricies/ldt/tm33source file), andcolorimetry.tm_30.reference_illuminant_type(ReferenceIlluminantType). All are absent unless declared; no existing record becomes invalid, and none affects the grade. reference_illuminant_typeis wired for explicitness and TM-33 interop but deliberately kept off the enrichment roadmap: it is derivable by definition from the test-source CCT, so nudging authors to hand-enter it would create an inconsistency surface.
Grading and enrichment
- A new non-gating
conformance/enrichmentfinding code and aLevelEnrichmentrubric sentinel carry the enrichment roadmap. 57 enrichment rows ship (the 20 reclassified rows plus 37 new), each naming its source document and governing standard. Sub-field suggestions fire only when the parent block is genuinely present, so an absent block draws a single block-level nudge rather than sub-field spam. - The four new schema fields get enrichment rows, and a
conformance/enrichmentrow oncolorimetry.tm_30.pvf_codesurfaces the TM-30 design-intent ground for white-light fixtures that carry a TM-30 block. - The deprecated legacy-cutoff classification stays a quiet
conformance/observationnote (unchanged from prior releases) rather than being promoted to the enrichment roadmap; it is superseded by the BUG rating and LCS zonal lumens and is a drop candidate for a future major version. Its taxonomy description is corrected: it previously claimed the validator emits a diagnostic when the field is populated, which it does not.
Tooling and internals
- The
internal/gradepackage is renamedinternal/completenesswith a structuredCompute()entry point returning the achieved level plus the tier roadmap, the enrichment roadmap, and the observation notes.AchievedLevelis unchanged as the index builder's level ladder, and the rename produces no output change. - The from-sheet default
ulc_versionbecomes0.9.0.
Examples and docs
- The five reference records are unchanged at
ulc_version0.8.0: an unchanged 0.8.x record validating and grading identically under 0.9.0 is the live proof of the compatibility claim. None populates the new optional fields (no source cutsheet carries one yet). methodology.mddocuments the gating test (what earns a tier versus the enrichment roadmap), the two-part roadmap, and the four residual observation sources;how-it-works.mdand the README note the enrichment roadmap;ROADMAP.mdrecords the taxonomy wiring policy and the remaining staged vocabulary.