Skip to content

Releases: countersign-labs/counter-sign

counter-sign 0.1.3

counter-sign 0.1.3 Pre-release
Pre-release

Choose a tag to compare

@haridarman-star haridarman-star released this 15 Jul 10:45

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. verifyResolution gated its quorum check on the attacker-supplied resolution.policy; a policy:"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 approvers are enforced — an unlisted channel member's click is ignored (membership is not authority), at both settle and verifyResolution.
  • Timeout correctness — the deadline is enforced in awaitWithDefault (and settle), so a late decision after an event-loop stall can't beat the signed Default; the reaper no longer breaks the arbitration.
  • Webhooks fail closedWHATSAPP_APP_SECRET and TELEGRAM_WEBHOOK_SECRET required (constant-time); Telegram keys on the stable numeric id; oversized bodies are caught.
  • DoSreadBody size-capped; PendingDecisions reaps at the deadline; Intent invariants re-validated; quorumOf fails 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 Pre-release
Pre-release

Choose a tag to compare

@haridarman-star haridarman-star released this 08 Jul 20:35

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 into ok (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 as unchained-entry by verifyChain). 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 Pre-release
Pre-release

Choose a tag to compare

@haridarman-star haridarman-star released this 08 Jul 19:55

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 one Countersignature, so the file is a portable audit trail: replay and re-verify every decision offline with read(), history(), and verifyAll(). Pass one to wrapAction({ receiptLog }) and every resolution (approval, veto, or timeout Default) is recorded before the guarded action runs (fail-closed audit).
  • ReceiptSink interface — 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

counter-sign 0.1.0 Pre-release
Pre-release

Choose a tag to compare

@haridarman-star haridarman-star released this 07 Jul 18:37

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 + wrapAction shim, 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.