ULC v0.8.0
ulc CLI v0.8.0
Download a single-file binary for your platform below. See CHANGELOG.md
at the tag for what landed in this release.
incomplete becomes the true floor of the conformance model. The tooling never fails a record on data completeness: a record with identity but zero source documents is valid, grades incomplete, and carries a roadmap to core. The roadmap now decomposes per grade all the way to full, showing the grades a record already satisfies and, for each grade it has not yet reached, only that grade's own remaining fields. The model is now framed as three grades (core, standard, full) above an incomplete floor.
Behavior change (important for consumers)
- Records that previously failed
ulc validate,ulc build-index, orulc from-sheetbecause they were anchorless or missing required index keys now SUCCEED (exit 0) and gradeincompletewith a roadmap. Any external tooling or CI that treated a nonzero exit as "this record is unacceptable" must now treatincompleteas a valid, expected, below-core state. The subcommands still exit nonzero on malformed input, missing record identity, source-file integrity failures (hash mismatch, unreadable files), or a stored-vs-recomputed conformance drift;ulc validateandulc from-sheetadditionally exit nonzero on JSON Schema invalidity, whileulc build-indexruns no schema validation and instead gates on the builder's required index keys. No data-completeness condition produces a nonzero exit. index.conformance_levelis now always present, includingincomplete. The internal below-floor sentinel (none) is removed: the grader never returns it and nothing renders it.
Schema (additive, pre-1.0)
- Three
requiredsites are loosened so an identity-only record is representable: the index drops the three photometric projections (primary_category,nominal_total_lumens,nominal_input_power_w) from its required keys,product_familydropscutsheet, andsource_filesmay be empty (minItems1 to 0). All three are loosenings, so no existing record becomes invalid. - The
ConformanceLeveldescription is reframed:incompleteis the floor (a record that has not yet met core), never a published grade, always traveling with a roadmap. The enum values are unchanged.
Grading
- The cutsheet moves from a schema requirement to a graded core item, so an unattached cutsheet now grades
incompletewith a roadmap entry naming/product_family/cutsheetinstead of failing schema validation. This is the only rubric membership change; which fields gate which grade is otherwise unchanged. Example grades do not change. AchievedLevelfloors atincomplete(the zero value) and never returns a below-floor sentinel.- The roadmap is emitted per grade through full. Each grade reports one of three states: satisfied (a new
conformance/grade-satisfiedinfo finding), an outstanding delta (the existingconformance/gaproadmap), or gated (a newconformance/grade-gatedinfo finding when a grade's own requirements are met but a lower grade is not, naming the grade to reach to unlock it). The structuredFindingfields are unchanged, so existing JSON consumers keep parsing; they see two new info codes. A consumer keying onconformance/grade-gatedmust treat it as NOT achieved; the achieved grade isindex.conformance_level.
Builder and CLI
- The builder always stamps
conformance_level. The index may be sparse for anincompleterecord (photometric projections are omitted when their data is absent).BuilderVersionis0.5.0, so every stored index re-stamps on the nextulc build-index. ulc from-sheetaccepts a workbook record with an emptycutsheet_file: it converts the record (omittingproduct_family.cutsheetand the synthesized datasheet source-file entry) instead of failing, so a cutsheet-less record gradesincompletewith a roadmap. It writes anincompleteconverted record to its output directory with a console notice that it is below core; it no longer skips such a record.
Examples and docs
- The five reference records re-stamp to
ulc_version0.8.0andbuilder_version0.5.0. Grades are unchanged (erco, selux, and both Lumenpulse records atstandard; Vode atcore); their roadmaps now render the full per-grade decomposition. methodology.md,how-it-works.md,authoring-patterns.md, the README, and the examples README are reframed from "four levels" to "three grades above an incomplete floor."