If you discover a vulnerability in holotype — particularly one that could affect the forensic integrity of an archive cited from a published paper — please report it privately rather than opening a public issue.
Contact: [email protected] with the subject line [holotype security].
Please include:
- A description of the vulnerability and its impact
- Affected versions (run
python -c "import holotype; print(holotype.__version__)"if you can) - Reproduction steps or a proof-of-concept
- Your suggested fix, if you have one
You should receive an acknowledgement within 7 days. If you don't, please send a follow-up — email filters happen.
I'll work with you to confirm the issue, prepare a fix, and coordinate disclosure timing. For non-critical issues, a typical timeline is:
- Acknowledgement (within ~7 days)
- Reproduction + impact assessment (within ~14 days)
- Patch developed + reviewed (timing depends on severity)
- Patched version released with a public CHANGELOG entry crediting the reporter (unless they prefer otherwise)
- Public disclosure of the vulnerability details after the patched version has been out for a reasonable interval (typically 30 days, longer for severe issues that may affect already-published paper archives)
For severe issues — particularly anything that could let an attacker silently alter a deposited transcript while leaving the SHA-256 chain "verifying clean" — I'll prioritize a fix and may release a hotfix outside the normal release cadence.
holotype makes specific security claims and explicitly does not make others. Knowing the difference matters for what counts as a vulnerability.
- Per-session SHA-256 integrity. Modifying a deposited
transcript.jsonlafter the fact should causescripts/verify.pyto reportTAMPERfor that session. A way to silently alter a transcript while keeping verify clean is a vulnerability. - Hash chain verifiable with stock Unix tools. A reviewer with
shasum,jq,git, and optionallyzstdshould be able to verify any deposit without installingholotype. A change that breaks this verifier-independence is a vulnerability. - Append-only manifests in git history. Even when a manifest is "updated" (schema bump, session bytes grew), the prior manifest is preserved in git history. Loss of prior manifest state is a vulnerability.
- Sensitivity boundaries on Source roots. Each
Source.default_source_paths()returns the deepest dir that holds only transcripts —holotypemust not read outside those boundaries (e.g., Codex's~/.codex/auth.jsonsits next tosessions/; reading it would be a vulnerability). auto_pushonly fires after explicit init-time consent. A path whereholotypepushes to a remote that was not explicitly configured at init is a vulnerability.- Encryption locks at init time. If
config.deposit.encrypt_transcripts: true, transcripts must be filtered throughgit-cryptbefore reaching the git object store. A path where an encrypted-archive deposit lands on the remote in plaintext is a vulnerability.
- Encryption of metadata. With
--encrypt-transcriptson, only transcript file contents are encrypted. Manifests stay plaintext on the remote (session IDs, timestamps, models, project paths, token totals are visible). This is the documented tradeoff. Metadata visibility on the remote is not a vulnerability. - Protection against compromised host CLIs. If the host CLI (Claude Code, Codex, Antigravity) itself is malicious or compromised and writes false data to the source JSONL,
holotypewill faithfully deposit that false data. The chain is "what the host CLI wrote, byte-for-byte" — not "what actually happened in the LLM session." - Protection against the user's own machine. A keylogger or filesystem attacker with read access to the user's
~/.claude/projects/(or equivalent) sees the transcripts beforeholotypeever touches them. - Quantum-resistance. SHA-256 is the chain hash. If SHA-256 is broken in the future, the integrity claim weakens (but the archive's git history + git-crypt encryption layers provide defense in depth).
- Recovery from lost git-crypt keys. Losing the GPG key makes encrypted deposits unrecoverable. This is the documented data-loss tradeoff of opting into encryption. See
HOW_TO_BACK_UP_YOUR_KEY.md.
| Version | Supported |
|---|---|
| 2.0.x | ✅ active |
| 1.2.x | |
| 1.1.x | ❌ not supported |
| 1.0.x | ❌ not supported |
| < 1.0 | ❌ never released |
Security fixes are backported to the most recent v1.2.x patch line for archives that haven't migrated to v2.0 yet, but only for the threat-model-relevant claims listed above. Performance regressions, UX polish, and non-security bug fixes are not backported.
None to date.