Releases: countersign-labs/counter-sign
Release list
counter-sign 0.1.3
counter-sign 0.1.3 — security hardening
Supersedes v0.1.2, which contains an authorization-bypass BLOCKER. Upgrade.
Hardened through two adversarial reviews before going public: a five-front internal red-team, then an independent second-engine pass (OpenAI Codex, adversarial), re-reviewed until it returned approve — "no confirmed material authorization or timeout bypass remains." The cryptographic core held throughout; every fix ships with a regression test (120 total).
Fixed
- BLOCKER — authorization bypass.
verifyResolutiongated its quorum check on the attacker-suppliedresolution.policy; apolicy:"default"approve with a single authority-signed receipt authorized any quorum-N Intent (ran a 3-of-3 deploy with 0 human approvals). Now enforced for every approve; each receipt's decision must match. - Named
approversare enforced — an unlisted channel member's click is ignored (membership is not authority), at bothsettleandverifyResolution. - Timeout correctness — the deadline is enforced in
awaitWithDefault(andsettle), so a late decision after an event-loop stall can't beat the signed Default; the reaper no longer breaks the arbitration. - Webhooks fail closed —
WHATSAPP_APP_SECRETandTELEGRAM_WEBHOOK_SECRETrequired (constant-time); Telegram keys on the stable numeric id; oversized bodies are caught. - DoS —
readBodysize-capped;PendingDecisionsreaps at the deadline; Intent invariants re-validated;quorumOffails closed. - LocalAdapter refuses
quorum > 1(one terminal can't authenticate distinct humans) — like EmailAdapter.
Corrected claims (now accurate)
- ReceiptLog is tamper-evident only against an externally-anchored
head()(the keyless chain can be re-forged by a writer). - Quorum four-eyes is authority-enforced, not cryptographic separation of duty.
Per-approver keys and a keyed self-anchoring log are v0.2.
No wire-format change — v0.1.x receipts still verify. Full detail: docs/security-review.md (CS-01 … CS-19).
counter-sign 0.1.2
counter-sign 0.1.2
Makes the ReceiptLog approval history tamper-evident for completeness, not just per-receipt authenticity.
Added
- Hash-chained log — each entry commits to a SHA-256 of the entry before it, so an edit, reorder, insertion, or mid-stream deletion breaks the chain and is detectable offline.
verifyChain()names the first break;verifyAll()now folds the chain intook(true only when every receipt is genuine and the chain is intact). head()+expectedHead— checkpoint the chain head and anchor it externally to catch tail truncation, the one thing a forward chain can't detect on its own.- New types:
ChainEntry,ChainHead,ChainReport.
Changed
- On-disk log line is now a chained envelope
{ seq, prev, receipt }instead of a bare receipt. Pre-0.1.2 logs still read (flagged asunchained-entrybyverifyChain). No change to the protocol or the Countersignature wire format — receipts inside are byte-for-byte the same portable artifact.
98 tests pass. Full changelog: https://github.com/countersign-labs/counter-sign/blob/main/CHANGELOG.md
counter-sign 0.1.1
counter-sign 0.1.1
Adds an opt-in ReceiptLog — a persistent, append-only, tamper-evident approval history stored where the runtime is installed. counter-sign stays stateless by default; pass a log and every resolution is durably remembered.
Added
ReceiptLog— each line is the canonical JSON of oneCountersignature, so the file is a portable audit trail: replay and re-verify every decision offline withread(),history(), andverifyAll(). Pass one towrapAction({ receiptLog })and every resolution (approval, veto, or timeout Default) is recorded before the guarded action runs (fail-closed audit).ReceiptSinkinterface — back the history with a file (ReceiptLog), SQLite, Postgres, or a log pipeline without changing call sites.
Notes
- No change to the protocol or wire format — v0.1.0 receipts still verify unchanged.
- In-process writes are queued (concurrent records never interleave); corrupt lines fail loud on read.
- 89 tests pass (+15 for ReceiptLog).
Full changelog: https://github.com/countersign-labs/counter-sign/blob/main/CHANGELOG.md
counter-sign 0.1.0
First public draft of counter-sign — an open protocol for agent-to-human authorization.
- Spec v0.1 (four nouns: Intent, Route, Countersignature, Default) with M-of-N quorum
- TypeScript reference implementation: core + 5 adapters +
wrapActionshim, 74 tests (89 as of v0.1.1) - Security-hardened: authority binding, domain separation, quorum fail-safe (see docs/security-review.md)
- Compliance mapping (SOC 2 / ISO 27001 / NIST AI RMF / EU AI Act Art. 14)
See CHANGELOG.md for details. Code: Apache-2.0 · Spec text: CC BY 4.0.