The gods knew the wolf would one day break loose and devour the world. They did not wait. They named the risk, forged Gleipnir, and bound it — and Týr paid a hand for the binding. Fenrir does the same work: it names the catastrophic failure before it happens and binds it with analysis and mitigation. The hand given up is the design constraint accepted to keep the system safe.
Fenrir is a design FMEA (dFMEA) engine: function-level failure analysis. It is database-agnostic by construction — every source-system access goes through an adapter contract, and Bifrost is adapter v1. A future DOORS or Jama adapter changes nothing in Fenrir's core.
Fenrir is opinionated about methodology (function-anchored dFMEA, graph-first) and unopinionated about where the engineering data lives. These are independent axes.
END EFFECT FAILURE ELEMENT PROPAGATES →
This mirrors the Bifrost relationship philosophy — named elements connected by named, directional relations (Fulfils, Decompose, Bind).
The FMEA is the propagation graph. The traditional flat FMEA
table is a calculated view — each row one path,
End Effect ← Mode ← Cause, with risk columns denormalised
onto it — generated on demand for review and export (xlsx), never
edited directly.
/architecture/derived-locations and uses each SR's
effective_node_id — the LCA node for cross-branch SRs. The
stored architecture_node_id is legacy and ignored. True
multi-node rendering of a single SR remains a future target.
Select a Solution Architecture node. Its subtree defines the function set in scope.
Every Function yields a failure-mode candidate: "Fails to: …". Expandable — a function can fail in many ways.
Every fulfilling Solution Requirement yields a cause: "Violated: …" — a constraint that must hold, not holding.
Every mode carries a function reference, every cause a requirement ID. Coverage is answerable mechanically.
Generation is idempotent: re-running never duplicates and never overwrites user-authored work.
Industry practice runs FMEA sessions per subsystem. Fenrir supports this as a viewport, not a partition: there is one FMEA per project — one graph — and selecting a Solution node scopes the view to its functions, their failure elements, one Propagates hop above and below, and all End Effects, always. The graph stays whole; the scope is a lens.
A Mitigation can be proposed back to the source system as a draft
requirement. Governance is strict: it lands in the project,
never the Library; it is proposed into the Solution layer by
default — mitigations are typically controls or architectural
constraints, with layer selection by type a future extension;
promotion happens exclusively through Bifrost's Release Gate;
statements are prefixed [Fenrir mitigation] and tagged in
custom_attrs (origin: fenrir,
kind: mitigation, fenrir_fmea: <ref>) for
filtering and audit.
Each mitigation carries a persisted writeback lifecycle —
none → proposed → accepted → rejected — orthogonal to its
implementation status. On a successful proposal it records the draft's id in
writeback_ref and advances to proposed;
re-proposing an already-proposed mitigation is rejected with
HTTP 409, so a double click never creates a duplicate draft.
Severity is owned at the End Effect, inherited downward; the highest value wins on multiple inheritance.
Occurrence and Detection are owned by the Failure Element and are identical wherever the element appears.
Mode and Cause are roles, not types. Position in the graph relative to scope decides the role.
The graph is the single source of truth. The flat table is a derived, read-only export artefact.
Generation is idempotent. User-authored content is never overwritten.
Cycles in Propagates are invalid and rejected at creation.
Writeback proposes to the project; the Release Gate decides Library promotion. Fenrir never touches the Library.
One FMEA per source project. Scope is a viewport over a single graph, never a data partition.
| Component | Stack | Responsibility |
|---|---|---|
| FenrirBackend | FastAPI · PostgreSQL · Railway | Persisted tables: the FMEA container, the graph model (EndEffect, FailureElement, Propagates, Mitigation), the Adapter registry, and CachedUser. Adapter contract (Bifrost adapter v1), risk services, flat-view builder, xlsx export, writeback. Exposes / and /health for liveness and build identity. |
| FenrirWorkbench | Next.js 15 · TypeScript · React Flow · Vercel | Login → project → three-pane workspace: architecture tree, propagation canvas, attribute panel. Per-node scoping. |
| Identity | Bifrost | Single identity authority for the product family. Source-system calls run under the requesting user's token. |