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
22 changes: 22 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,28 @@ Dates reference the merged commit timestamp.

## [Unreleased]

## v0.47.0 — 2026-07-28 (declare x-FuSa spec v1.15.2 conformance)

### Changed
- **`SpecVersion` bumped from `1.15.0` to `1.15.2`.** Both intervening spec
releases are pure documentation clarifications with no wire-format or
required-behavior change (§14 Changelog): v1.15.1 blessed the
already-in-use `MAJOR.MINOR.PATCH` form as the correct `schemaVersion`/
`specVersion` value (a tool emits its `SpecVersion` constant verbatim;
compatibility is still judged on the `MAJOR.MINOR` prefix only), and
v1.15.2 added an explicit worked-example to §1.6.1 Rule A with no rule
change.

### Fixed
- **`SchemaVersion()` now emits the full `MAJOR.MINOR.PATCH` `SpecVersion`
verbatim instead of a truncated `MAJOR.MINOR` prefix** (x-FuSa spec §3.2
"schemaVersion semantics", MUST, clarified in v1.15.1). `fmea.json`,
`tara.json`, `.fusa-hara.json`, `safety-case.json`, `sas.json`, and
`sci.json` were emitting `"schemaVersion": "1.15"` while every other document
(`check`/`trace`/`qualify`/`report`/gap-reports/`sbom`/`provenance`/
audit-pack/`capabilities`) already emitted the full patch version — this
aligns all document kinds on the one correct, spec-blessed form.

## v0.46.0 — 2026-07-28 (deep-audit round 2: standard ids, SARIF, tara/qualify/audit-pack)

### Fixed
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -285,7 +285,7 @@ docker build -t go-fusa .
docker run --rm -v "$(pwd)":/project go-fusa check
```

Published tags: `latest`, `0.46`, `0.46.0` (and matching semver for every release).
Published tags: `latest`, `0.47`, `0.47.0` (and matching semver for every release).

## Standards coverage

Expand Down
2 changes: 1 addition & 1 deletion docs/tool-safety-manual.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# go-FuSa Tool Safety Manual

**Version:** 0.46.0
**Version:** 0.47.0
**Module:** `github.com/SoundMatt/go-FuSa`
**License:** Mozilla Public License 2.0
**Standards addressed:** ISO 26262, IEC 61508, ISO 21434, DO-178C
Expand Down
23 changes: 11 additions & 12 deletions fusa.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,21 +23,20 @@ import (
)

// Version is the current release of go-FuSa.
const Version = "0.46.0"
const Version = "0.47.0"

// SpecVersion is the x-FuSa spec version this release implements.
const SpecVersion = "1.15.0"

// SchemaVersion returns the MAJOR.MINOR prefix of SpecVersion, the value
// every report document's "schemaVersion" header field (§2.8/§3.1) MUST
// carry — the spec version a document *conforms to*, one level less precise
// than the tool's own SpecVersion (§9.1 `version --format json`).
const SpecVersion = "1.15.2"

// SchemaVersion returns the value every document's "schemaVersion" header
// field (§3.1/§3.2) MUST carry — the spec version a document *conforms to*,
// emitted as the tool's full MAJOR.MINOR.PATCH SpecVersion verbatim (§3.2
// "schemaVersion semantics", clarified in spec v1.15.1: a PATCH component is
// never itself a compatibility signal, so a consumer MUST compare only the
// MAJOR.MINOR prefix, but the emitted value carries all three components
// unmodified — no truncation).
func SchemaVersion() string {
parts := strings.SplitN(SpecVersion, ".", 3)
if len(parts) < 2 {
return SpecVersion
}
return parts[0] + "." + parts[1]
return SpecVersion
}

// Exit codes (§2.3).
Expand Down
10 changes: 3 additions & 7 deletions fusa_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -426,17 +426,13 @@ func TestAttestationValid(t *testing.T) {
}

//fusa:test REQ-ATT001
func TestSchemaVersion_IsMajorMinor(t *testing.T) {
func TestSchemaVersion_IsFullSpecVersionVerbatim(t *testing.T) {
got := fusa.SchemaVersion()
parts := strings.Split(got, ".")
if len(parts) != 2 {
t.Errorf("SchemaVersion() = %q, want MAJOR.MINOR (2 dot-separated parts)", got)
}
if strings.Count(fusa.SpecVersion, ".") < 2 {
t.Fatalf("SpecVersion %q is expected to be MAJOR.MINOR.PATCH for this test to be meaningful", fusa.SpecVersion)
}
if !strings.HasPrefix(fusa.SpecVersion, got+".") {
t.Errorf("SchemaVersion() = %q is not a prefix of SpecVersion %q", got, fusa.SpecVersion)
if got != fusa.SpecVersion {
t.Errorf("SchemaVersion() = %q, want SpecVersion %q emitted verbatim (§3.2 schemaVersion semantics, spec v1.15.1+)", got, fusa.SpecVersion)
}
}

Expand Down
Loading