Troubleshooting
Common operational issues and their fixes. If your issue isn’t here, check the FAQ or ask on GitHub Discussions.
Installation
gem install confium fails to build the native extension
The Ruby gem compiles a Rust native extension at install time. You need:
- Ruby ≥ 3.1
- Rust stable 1.85+ (
rustup default stable) - A C toolchain (
cc,make)
Verify:
ruby --version # >= 3.1
rustc --version # >= 1.85
cc --version
If you see error: linking with cc failed, install Xcode CLI
tools (macOS) or build-essential (Debian/Ubuntu).
cargo add confium-core pulls an old version
The workspace version is pinned in Cargo.toml. If you need the
latest, use the git dependency:
[dependencies]
confium-core = { git = "https://github.com/confium/confium.git", branch = "main" }
WASM package fails to load in the browser
The @confium/confium-wasm package targets wasm32-unknown-unknown
with wasm-bindgen. Make sure you:
- Initialize before use:
await init();. - Use the right import form for your bundler:
import init, { CompositeSignature } from "@confium/confium-wasm"; - Add the right Content-Type headers if self-hosting:
application/wasm.
Ruby
Confium::ParseError when loading a PEM
Most common causes:
- The PEM has Windows line endings (
\r\n) but is being read withFile.readin text mode (which can re-translate). Read in binary mode:File.open(path, "rb", &:read). - The PEM is missing begin/end markers. Verify:
-----BEGIN CERTIFICATE----- ... -----END CERTIFICATE----- - The PEM is concatenated incorrectly. Each PEM block needs its own begin/end markers.
Confium::VerificationError from path validation
result = Confium::PKI::PathValidator.validate(
leaf: cert, intermediates: [inter], root: root,
)
result.valid? # => false
result.errors # => [{ chain_index: 0, check: "signature", ... }]
Read result.errors — each error has chain_index, check,
and details. Common causes:
check: "signature"— wrong root, expired cert, or revoked cert. Check the chain order: leaf, intermediates, root.check: "validity"— cert is expired or not-yet-valid.check: "name_constraints"— cert violates name constraints defined in root.
Confium::ThresholdError: insufficient quorum
The coordinator couldn’t reach threshold T. Check:
- Are enough signers online?
confium list-signers. - Are signers’ shares valid? Run
confium signer self-teston each. - Is the policy correct? Read the deployment manifest’s
[quorum]section.
Confium::PolicyViolationError: disallowed algorithm
The policy allow-list doesn’t include the algorithm. Update
Confium::Policy.allowed_signature_algorithms or the deployment
manifest’s [policy] section.
Rust
error[E0599]: no method named X found on type Y
Confium’s public API is concentrated in trait definitions. If a method isn’t found, you may be missing a trait import:
use confium_composite::VerifierCallback; // bring the trait in
Compile errors with Scalar::from_repr
p256::Scalar::from_repr returns CtOption<Scalar>, not
Option<Scalar>. Convert explicitly:
let scalar = Option::<Scalar>::from(Scalar::from_repr(bytes))
.ok_or_else(|| MyError::InvalidScalar)?;
cargo test is slow
Some integration tests spawn coordinators and signers, which adds startup time. Run unit tests only:
cargo test --workspace --lib
WASM
RuntimeError: unreachable in browser console
The WASM module panics. Most common cause: missing
initialization. Make sure await init(); runs before any other
Confium call.
Bundle size is too large
The @confium/confium-wasm package has per-subsystem Cargo
features. Tree-shake to just what you need:
# Cargo.toml (if you're building yourself)
[features]
verify-composite = []
verify-transparency = []
verify-attributes = []
verify-pki = []
default = ["verify-composite", "verify-transparency", "verify-attributes", "verify-pki"]
In npm, use the pre-built subset packages
(@confium/confium-wasm-composite, etc.) when available.
Operations
Coordinator can’t reach signers
Check connectivity:
confium ping-signer --coordinator coord.internal:7443 --id director-1
Common causes:
- Firewall blocking the coordinator’s QUIC port (default 7443).
- Signer identity mismatch (the signer’s
--identitydoesn’t match the coordinator’s configured signer ID). - TLS certificate issues. The coordinator verifies signer certificates; if they’re expired or wrong-CA, signing fails.
Transparency log is growing unboundedly
That’s by design — the log is append-only. Add storage, or configure log rotation (which preserves the cryptographic chain by snapshotting roots periodically).
Signers joining late
The coordinator holds session state for in-flight sessions. If signers join after a session starts, they can still participate in subsequent rounds. Sessions time out after a configurable interval (default: 24 hours).
Witness detects divergence
This is the split-view attack detection firing. Investigate immediately:
- Compare tree heads between coordinators.
- Identify the divergent entries.
- Determine whether the divergence is malicious (operator compromise) or operational (split-brain, network partition).
- If malicious: switch to backup log; replay recent tree heads; initiate incident response.
Audit log shows unexpected signer identity
If signers in the audit record contains an identity you don’t
recognize, the deployment manifest’s [[signers]] section may
have a stale entry. Audit the manifest, remove the stale signer,
and re-share to invalidate any share that signer may hold.
Plugin authoring
cfmp_* symbols missing from built library
Ensure crate-type = ["cdylib"] in [lib]:
[lib]
crate-type = ["cdylib"]
Then verify exports:
nm -D target/release/libmy_plugin.so | grep cfmp
Plugin loads but InterfaceNotSupported
The interface name in cfmp_query_interfaces doesn’t match
what the host requested, or the version byte is higher than the
host supports. Check:
- Interface name spelling (case-sensitive).
- Version byte — start with 0 and bump only when the contract changes.
PluginDependencyUnmet on load
A declared dependency is missing or out of range. Run
confium list to see loaded plugins; check the version range in
your Dependency::provider(...) call.
Build / CI
Site build fails with MDX errors
If you’re using @astrojs/mdx, JSX-trigger characters in content
can break parsing. Specifically:
<word ...>in content is parsed as a JSX tag.cfmp_<interface>_*in inline code triggers tag parsing.
Fix: escape < and > in code-block-adjacent content, or
reword to avoid the pattern. See the MDX migration notes.
globLoader is not a function in Astro 7
The loader import changed in Astro 7. Use:
import { glob } from 'astro/loaders';
Not:
import { globLoader } from 'astro:content';
Could not resolve import for @layouts/*
The path alias must be declared in tsconfig.json:
{
"compilerOptions": {
"paths": {
"@layouts/*": ["src/layouts/*"]
}
}
}
Where to get more help
- GitHub Discussions — for questions.
- GitHub Issues — for bugs.
- /security/ — for security disclosures.
- Audience guides — role-specific deep dives.
See also
- FAQ
- Architecture
- Security model
- Conventions (Rust workspace)