ISO 26262 Part 8 and IEC 61508 Part 6 require that software tools used in safety-related development processes be qualified. Tool qualification establishes confidence that a tool performs its intended function correctly — it does not certify the tool, but provides documented evidence to support a safety assessor's judgement.
go-FuSa provides a built-in qualification suite (gofusa qualify) that generates
machine-readable evidence conforming to these requirements.
gofusa qualifyThis command:
- Runs 44 built-in test cases (one positive, one negative per rule).
- Verifies that each rule detects the pattern it claims to detect.
- Verifies that each rule does not produce false positives on clean code.
- Writes
qualify-report.jsonwith a SHA-256 integrity hash.
Exit codes:
| Code | Meaning |
|---|---|
| 0 | All cases passed |
| 1 | One or more cases failed, or report could not be written |
qualify-report.json contains:
{
"generatedAt": "2026-01-01T12:00:00Z",
"goVersion": "go1.22.0",
"module": "github.com/SoundMatt/go-FuSa",
"total": 44,
"passed": 44,
"failed": 0,
"results": [
{
"case": {
"name": "FUSA001-pos: missing .fusa.json",
"ruleId": "FUSA001",
"description": "Project without .fusa.json must produce a FUSA001 finding.",
"expectFinding": true
},
"passed": true
}
],
"hash": "a3f2...e8b1"
}The hash field is a SHA-256 of the report contents (excluding the hash field itself),
providing tamper evidence.
# Recompute and compare manually:
jq 'del(.hash)' qualify-report.json | sha256sumThe output should match the hash field in the report.
The suite covers the core engine rules spanning all packages:
| Rule | Package | What is tested |
|---|---|---|
| FUSA001 | engine | .fusa.json present / absent |
| FUSA002 | engine | go.mod present / absent |
| FUSA003 | engine | LICENSE present / absent |
| FUSA004 | engine | README present / absent |
| FUSA005 | engine | CI config present / absent |
| LINT001 | lint | Discarded error return detected / not detected |
| LINT002 | lint | panic() call detected / not detected |
| LINT003 | lint | recover() call detected / not detected |
| LINT004 | lint | unsafe import detected / not detected |
| LINT005 | lint | reflect import detected / not detected |
| LINT006 | lint | Global mutable var detected / not detected |
| ANA001 | analyze | Goroutine without termination signal |
| ANA002 | analyze | Goroutine spawned in loop |
| ANA003 | analyze | time.Sleep in goroutine |
| ANA004 | analyze | defer inside loop |
| ANA005 | analyze | context.Background() inside function with context param |
| ANA006 | analyze | fmt.Errorf without %w — error chain lost |
| ANA007 | analyze | Two-result function used without nil check |
| ANA008 | analyze | Goroutine accessing package-level var without sync |
| ANA009 | analyze | Dead code after unconditional transfer |
| TRACE001 | trace | .fusa-reqs.json present / absent |
| TRACE002 | trace | Untraced requirement detected |
| TRACE003 | trace | Requirement with no //fusa:test annotation |
| TRACE004 | trace | Requirement missing text field |
| TRACE005 | trace | Verification independence (same file has req + test) |
| TRACE006 | trace | Aggregate req-to-source traceability below threshold |
| TRACE007 | trace | Exported-function annotation density below threshold |
| VERIFY001 | verify | Test evidence bundle present / absent |
| VERIFY002 | verify | Failed tests in bundle detected |
| RELEASE001 | release | sbom.json present / absent |
| RELEASE002 | release | provenance.json present / absent |
| QUALIFY001 | qualify | qualify-report.json present / absent |
| SAFETYCASE001 | safetycase | safety-case.json present / absent |
| FMEA001 | fmea | fmea.json present / absent |
| BOUNDARY001 | boundary | boundary.mermaid present / absent |
| AUDITPACK001 | auditpack | audit-pack.zip present / absent |
| VULN001 | vuln | vuln.json present / absent |
| TARA001 | tara | tara.json present / absent |
| PR001 | pr | Problem report log present / open critical PRs |
| COMP001 | comp | Cyclomatic complexity exceeds threshold |
| COUP001 | coupling | Exported mutable package-level variable |
| COUP002 | coupling | Exported function with func/interface parameter |
| SLSA001–003 | slsa | SLSA L2/L3 provenance and CODEOWNERS checks |
| IEC62443-001–004 | iec62443 | IEC 62443 Security Level configuration checks |
| CYBER001–020 | cyber | CWE-mapped cybersecurity static analysis rules |
| DISP001 | disposition | Undispositioned ERROR findings in check-report.json |
| ISO26262-001 | iso26262 | ISO 26262 Part 6 ASIL compliance gap assessment |
| IEC61508-001 | iec61508 | IEC 61508 SIL compliance gap assessment |
| HARA001 | hara | .fusa-hara.json absent (WARNING for ISO 26262 / IEC 61508 projects) |
| HARA002 | hara | Hazard has incomplete risk rating (S/E/C not all set) |
| HARA003 | hara | Hazard has no linked safety goal |
| HARA004 | hara | Safety goal has no ASIL assigned |
| HARA005 | hara | Highest hazard ASIL exceeds project ASIL in .fusa.json |
| COUP003 | coupling | DO-178C project lacks coupling-report.json |
| ISO26262002 | iso26262 | ISO 26262 project has requirements without asil tag in .fusa-reqs.json |
| ISO26262003 | iso26262 | qualify-report.json contains failures (tool qualification depth insufficient) |
| ISO21434001 | iso21434 | ISO 21434 project lacks tara.json (TARA evidence absent) |
| UNECE001 | unece | ISO 21434 / UN R.155 project lacks tara.json |
Under IEC 61508-3, tools are assigned a Tool Confidence Level (TCL) based on:
- TC1 — No tool confidence measures needed (tool output does not influence safety).
- TC2 — Tool has been validated by other means (version control, known inputs, review).
- TC3 — Full tool qualification documentation required.
go-FuSa is primarily a TC2 tool: its output (findings and reports) influences the safety process but does not directly generate executable safety-critical code. The qualification suite supports TC2 validation by providing documented evidence that the tool's analysis rules behave as specified.
For organisations that require TC3, the qualification suite provides:
- Version-stamped, hashed reports (tamper evidence).
- Complete test case specifications (inputs and expected outputs).
- Machine-readable results for audit trail integration.
Include the qualification report in your project's safety case package alongside:
sbom.json— Software Bill of Materials.provenance.json— Build provenance..fusa-evidence.json— Test evidence bundle.- Traceability matrix (
gofusa trace --format json).
The complete artefact set provides evidence for:
- §8.4.4 of ISO 26262-8 (tool use qualification).
- §7.4.4.10 of IEC 61508-3 (software tool qualification).
The qualification report should be regenerated:
- On every release of go-FuSa used in the project.
- When the Go toolchain version changes.
- As part of the CI pipeline (add
gofusa qualifyas a CI step).
Example GitHub Actions step:
- name: go-FuSa qualify
run: gofusa qualify --output qualify-report.json
- name: Upload qualification report
uses: actions/upload-artifact@v4
with:
name: qualify-report
path: qualify-report.json