diff --git a/CHANGELOG.md b/CHANGELOG.md index a2a00aa..ac1cc00 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,16 @@ and the project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0. ## [Unreleased] +## [1.146.0] — 2026-07-29 + +### docs: x-FuSa spec v1.15.2 — §1.6.1 Rule A false-positive tradeoff made explicit (SoundMatt/FuSaOps#101) + +A same-day ada-FuSa self-review flagged Rule A's deny-list as occasionally +false-positiving on legitimate prose (`buffer[i]`, `"STBD"`) and asked if +that was intended. It is — confirmed and made explicit in the spec text with +both examples, so future audits hit the documented answer instead of +re-deriving it. Pure documentation addition, no behavior change. + ## [1.145.0] — 2026-07-29 ### docs: x-FuSa spec v1.15.1 — schemaVersion/specVersion clarified as MAJOR.MINOR.PATCH (SoundMatt/FuSaOps#99) diff --git a/docs/x-fusa-spec.md b/docs/x-fusa-spec.md index 4294767..ffd9ce8 100644 --- a/docs/x-fusa-spec.md +++ b/docs/x-fusa-spec.md @@ -1,6 +1,6 @@ # x-FuSa Tool Specification -**Spec version:** 1.15.1 · **Status:** Normative · **Owner:** FuSaOps +**Spec version:** 1.15.2 · **Status:** Normative · **Owner:** FuSaOps This is the **master contract** every x-FuSa tool (go-FuSa, c-FuSa, cpp-FuSa, and future tools) implements. It defines the CLI surface, the machine-readable output @@ -502,6 +502,15 @@ itself still belongs to the artifact's own command. placeholder text real; a legitimate hazard/failure-mode description that happens to contain a deny-listed string is rare enough to warrant an explicit, individually-justified waiver rather than a blanket pass. + **This tradeoff is deliberate, not a bug to fix per-tool** — e.g. ordinary + engineering prose like `"buffer[i] causes memory corruption"` or the + abbreviation `"STBD"` (containing the `"TBD"` substring) will occasionally + false-positive against this canonical, byte-for-byte-identical-across-tools + deny-list; the fix for that specific finding is a disposition waiver + (`disposition add --reason "..."`), never a tool narrowing its own + detector's pattern to be "smarter" than the canonical one — two tools + disagreeing on what counts as a Rule A match undermines the "canonical" + guarantee this section exists to provide (filed as SoundMatt/FuSaOps#101). - **Rule B — blanket qualitative fallback (SHOULD, a WARNING by default).** For an artifact with **≥10 entries**, a tool SHOULD compute each qualitative field's **distinct-value ratio** (count of distinct values ÷ @@ -1815,6 +1824,24 @@ tool-defined row. ## 14. Changelog +### 1.15.2 — 2026-07-29 (§1.6.1 Rule A: explicit false-positive example, filed as SoundMatt/FuSaOps#101) + +A same-day ada-FuSa self-review flagged Rule A's bracket/`"TBD"`-substring +deny-list as producing occasional false positives on legitimate engineering +prose (`"buffer[i] causes memory corruption"`, the abbreviation `"STBD"`) and +asked whether this was an intended tradeoff or a spec gap. Re-reading the +existing text confirmed it's intended — the deny-list is deliberately simple +and canonical (byte-for-byte identical across tools) rather than +word-boundary-aware, with occasional false positives meant to be resolved via +an individual disposition waiver, not per-tool detector narrowing. The +reviewer correctly did not narrow ada-FuSa's own detector on exactly that +reasoning. Since the tradeoff was "evidently non-obvious enough that outside +audit tooling flags it as a bug on first read" (the reviewer's own words), +Rule A's definition now states the tradeoff explicitly with the same two +examples, so a future implementer hits the documented answer instead of +re-deriving it. Pure documentation addition, no behavior change — hence a +PATCH bump. + ### 1.15.1 — 2026-07-29 (schemaVersion/specVersion format clarified to MAJOR.MINOR.PATCH, filed as SoundMatt/FuSaOps#99) §3.2/§12's normative text said `schemaVersion` (and, by extension, `specVersion`) diff --git a/fmea.json b/fmea.json index f7b9ea7..0654d60 100644 --- a/fmea.json +++ b/fmea.json @@ -1,11 +1,11 @@ { - "schemaVersion": "1.15.1", + "schemaVersion": "1.15.2", "kind": "fmea-report", "language": "go", - "generatedAt": "2026-07-29T02:45:59.121719Z", + "generatedAt": "2026-07-29T02:58:10.51284Z", "projectRoot": ".", "tool": "fusaops", - "toolVersion": "1.145.0", + "toolVersion": "1.146.0", "standard": "iso26262", "ratingScale": "custom-1-10", "entries": [ @@ -210,5 +210,5 @@ "coveragePct": 19.5, "componentInventoryMethod": "count of all packages in CLAUDE.md's core orchestration-pipeline table (11) and layered compliance/evidence/workflow table (30), 41 total; componentsAnalyzed counts distinct FMEA entries, not distinct packages named (some entries span multiple packages, e.g. \"auditpack / sign packages\")" }, - "hash": "sha256:ad57ee1c0abac5b9244b27d3df0301bd9a64f2a0089764fe526bb027a7fb9f31" + "hash": "sha256:fe07227fc6654ce31da551365e1fefc10dabd6cba5008e2f072ea5e90cb079f9" } diff --git a/fusaops.go b/fusaops.go index 1c730b5..d4325ed 100644 --- a/fusaops.go +++ b/fusaops.go @@ -20,12 +20,12 @@ import ( ) // Version is the current release of FuSaOps. -const Version = "1.145.0" +const Version = "1.146.0" // SpecVersion is the x-FuSa specification version this release targets. // //fusa:req REQ-FO-CORE007 -const SpecVersion = "1.15.1" +const SpecVersion = "1.15.2" // Sentinel errors. Callers should use errors.Is for comparison. //