Skip to content

Architecture Decision Records

An Architecture Decision Record (ADR) captures a single significant decision — the context that forced it, the choice made, and the consequences accepted — so the reasoning survives the commit that implements it.

These records are intentionally append-only. A decision that no longer holds is not edited away; a later ADR supersedes it and the old one stays as history, its status updated to point forward.

Status vocabulary

Status Meaning
Proposed Written up for discussion; not yet agreed or built.
Accepted Agreed and in force (built, or committed to build).
Superseded Replaced by a later ADR (linked from the header).
Rejected Considered and deliberately not taken (kept for the reasoning).

Index

ADR Title Status
0001 Allow bundled dependencies in plugins Accepted
0002 Host-mediated plugin network access (net:fetch) Accepted
0003 Marketplace trust tiers Accepted
0004 Document & artifact association for transactions Proposed
0005 Plugin-originated transactions (source:provide) Proposed
0006 External market & reference data as a first-class source Proposed
0007 Soft-delete: reversible transaction hiding Proposed
0008 Inbound-webhook source (webhook archetype) Accepted
0009 Selective peer-to-peer ledger sharing Proposed
0010 Custody-free internet peer connectivity Proposed

ADRs 0001–0003 form one arc: they widen what a plugin may do without abandoning the sandbox that makes plugins safe to install. ADR 0004 is the use case that motivated the arc — associating a receipt with a transaction — and shows how the new seams (plus the existing ones) compose to serve it. ADR 0005 takes the last step the arc deliberately deferred — letting a plugin originate a transaction — and resolves it through the existing ingestion seam (a plugin produces a batch; the engine writes it) rather than a raw write. ADR 0006 opens a different front: world data (benchmarks, quotes, FX) as a first-class source with its own archetype and a market_* cache namespace — the backend half of a decision shared with the sillview dashboard, whose own ADR-0004 records the consumption half. ADR 0007 turns inward to the ledger's own integrity: it replaces destructive hard deletion with a reversible soft-delete (deleted_at), so transactions — manual or synced — can be hidden from views and analysis without erasing the record, with hard deletion narrowing to genuine teardown (source uninstall, account deletion). ADR 0008 adds the first push source: the webhook archetype, where an external system POSTs a signed batch to an ingest endpoint instead of kasas polling for it. It inverts the Puller direction through a new Receiver capability while reusing the engine's existing persist path verbatim, and reuses kasas's own outbound-webhook HMAC scheme for verification — so the security boundary is a shared secret, not the dashboard token. ADR 0009 turns ADR 0008's one-way ingest into a relationship: selective, subscription-style peer-to-peer sharing between two self-hosted ledgers, with no mandatory central server. It reframes a "share" as a saved search query and a "subscription" as adding a peer source, so the engine's persist/dedup/events/rules all apply for free; on the receiver each row keeps its original originator (in an extension) and gains a shared_by:<ledger> tag, while a structural origin-guard forbids re-exporting rows you did not author. ADR 0010 fills the one gap 0009 left — connecting two strangers on different networks who share no tailnet and no out-of-band channel — on the Syncthing model: direct-first, with a content-blind community-relay fallback. An earlier hosted, paid zero-knowledge directory + encrypted mailbox draft was rejected (a data processor with privacy/DPA/retention/deletion duties over stored content); a still-earlier direct-only draft rejected relays entirely but forced every receiving peer to bring its own front door — too much friction. The current revision is "0009 + a keypair + a doctrine + a live relay fallback": ed25519 identity (realizing 0009's deferred proven-attribution upgrade) + age encryption, BYO front door now optional (a latency optimization), and — for the both-online-but-double-NAT case — kasas seeds content-blind, stateless, overridable relay and discovery defaults so it works out of the box. The crucial distinction: a live relay is not the rejected mailbox — it bridges two simultaneously-online peers and holds no content at rest, so the heavy mailbox duties (retention/deletion/breach/DSAR over content) are eliminated structurally. kasas is never a custodian of financial data (E2E always); the honest residual is a thin, non-zero duty (a privacy policy + abuse contact + no-logs posture for transient IP/metadata) on the defaults it seeds. No mandatory central server still holds — direct-first works with every default disabled — so 0010 preserves 0009's no-mandatory-central principle, softening the absolutist "kasas operates nothing" to "operates only content-blind, overridable defaults." No async, pure OSS, donations only.