SIG labels auto-detected and applied: daml-tooling, dar-app-management
If this is incorrect, you can update the labels from the right sidebar.
Opened 27-08-2026 by pedrodneves, last activity 1mo ago
No description provided.
View on GitHub ↗Showing automated messages too. Hide bot messages
Showing 1 to 3 of 3, oldest first.
SIG labels auto-detected and applied: daml-tooling, dar-app-management
If this is incorrect, you can update the labels from the right sidebar.
@pedrodneves, thank you for your interest in the Canton Development Fund!
Your proposal does not include a Champion/Endorser field.
Per CIP-0100, all external proposals require a Champion.
Next steps:
If you need help finding a champion, reach out to SIGs (https://github.com/canton-foundation/canton-dev-fund/blob/main/sig-directory.md).
This PR is being closed automatically. You are welcome to reopen it once a champion is confirmed.
| Field | Value |
|---|---|
| Authors | John Ericson, Dylan Green, and Cale Gibbard |
| Org | Obsidian Systems |
| Status | Approved |
| Created | 2026-07-14 |
| Approved | 2026-08-05 |
| PR | #533 |
Daml lacks shared package distribution infrastructure. Today's developers exchange DARs as files, with no central place to publish, discover, audit, or version them. Transitive dependencies are tracked by hand, and integrators have no automated way to check whether a package has been audited or whether the binary they're loading matches the reviewed source. This proposal funds the infrastructure to change that.
This work also addresses supply-chain attack vectors to which the current ad-hoc distribution mechanisms are vulnerable. npm's 2025-2026 compromises (Shai-Hulud, Axios, credential-stealing campaigns; see Supply-chain attacks on package ecosystems) show that the architectural pattern most ecosystems have settled on does not defend against maintainer compromise, build-environment tampering, or social engineering. For the Canton Network, running in regulated financial infrastructure where every consumer is a validator node operating under compliance constraints, the stakes are higher than in general-purpose ecosystems. The proposal is structured in two phases. A registry baseline that provides package discovery, audit-aware metadata, and identity-verified attestations, so that audit status can become a first-class concept in Daml's tooling. A deeper-verification layer offers two paths: source-to-DAR verification via damlc, and hermetic Nix-derivation builds (binding source, compiler, SDK, and build environment into a single content-addressed hash) with independent-rebuilder attestations for auditors. The audit publication pipeline will be available to any audit partner who wishes to participate. Auditors active in the Canton ecosystem such as Halborn have already expressed their support. Sources reviewed by auditors will be made traceable through SHA-256 hashing and audit metadata so that information about specific reviewed revisions is publicly available. Artifact distribution will be multi-mirror (via both OCI and Nix substituters).
This proposal extends Canton's existing dpm toolchain via its OCI component model without requiring forking or protocol changes. The registry baseline requires no changes to upstream toolchains and plugs into dpm's existing component model. The damlc source-to-DAR verification path requires a small, additive extension to damlc that will be coordinated with the team that builds and maintains that tooling, as a parallel non-blocking work stream. Publication of existing core DARs from Canton open-source repositories (Splice, the Daml SDK) will help bootstrap the infrastructure and establish a contribution path for further organic growth and collaboration.
This project falls under both the Canton Development Fund's daml-tooling and dar-app-management categories.
The Canton Network Developer Experience and Tooling Survey (Q1 2026) characterizes the current package-sharing workflow in developers' own words as a "manual, file-based process" in which developers are "manually downloading files, moving them between folders, and struggling to resolve version mismatches." The survey places "Daml Dependency & Package Manager" among the top tooling opportunities and lists "Package Manager & Operational Dashboards (Cargo)" on its Magic Wand Wishlist. The survey also reports that 75% of respondents rated Security & Auditing Tools as either "Important" (51%) or "Critical" (24%), the second-highest priority category. Demographically, 83% of respondents work on TradFi or hybrid (TradFi + Crypto) projects, and 71% bring an Ethereum/EVM background, meaning they have first-hand experience with the supply-chain attacks that have compromised the npm ecosystem repeatedly through 2025-2026. The community is asking for this work, and they are asking for it in part because they recognize what happens to ecosystems that do not address it.
Concretely, Daml dependency management today consists of entries in daml.yaml/multi-package.yaml pointing either directly at .dar file paths or at remote OCI URIs (as of Daml SDK 3.5.2). Widely used utility DARs (canton-coin, splice-amulet, registry-app, credential-app, etc.) are distributed as direct downloads or OCI URLs with SHA-256 checksums. That's the best the ecosystem currently offers, and only a few participants are doing so. Outside DA and CF's own pipelines, distribution is ad-hoc: developers send or git-vendor DARs, transitive dependencies are tracked by hand, and there is no mechanism for an integrator to ask "has this been audited?" with a reliable, easily-verifiable answer.
The compounding effects of this ad-hoc model are:
.dar files differ even when their source matches. This creates a gap between "audited code" and "delivered binary".Mature language ecosystems (npm for JavaScript, crates.io for Rust, PyPI for Python, Maven Central for Java, Hackage for Haskell) solve the venue, discovery, and shared-composition problems by giving their communities a place to publish and find work. Each transformed its respective ecosystem accordingly. But those ecosystems' security and reproducibility models do not suit regulated financial infrastructure: they catch transport tampering but not build-environment tampering; they surface community-curated metadata but not first-class audit status; they help with discovery but not with the human-review and auditing that real-world Canton users actually need. Recent npm history demonstrates what happens when the registry pattern is deployed without these additional layers. Daml is in a position to learn from those ecosystems' successes while addressing, from day one, the gaps the financial-infrastructure context exposes.
Daml is used to encode financial infrastructure: trade lifecycle workflows, custody arrangements, regulatory reporting, payments, settlement, and so on. These applications need a reliable way to distribute the DARs they depend on, with provenance from source to binary, with audit status that can be checked at integration time, and with versioning that respects Canton's Smart Contract Upgrade semantics. None of those needs are met by the current ad-hoc distribution methods.
An audited, hash-verified Daml package registry makes a number of things possible:
dpm registry add with verifiable provenance, instead of git-vendoring DARs and tracking transitive dependencies by hand.Mature language ecosystems have package distribution infrastructure, and the infrastructure is rarely the most interesting part. What matters is the ecosystem that grows around it. Hackage made Haskell viable for industry by providing a venue where shared work could accumulate and be found. crates.io let Rust's ecosystem cohere by giving contributors a shared, standardized path to publication. Daml's properties and regulatory positioning give it a foothold in financial infrastructure that other languages cannot easily challenge. What it lacks today is the distribution venue, protocol, and mechanism. This proposal addresses that gap in a way that also provides a security model that matches the financial infrastructure context.
The traditional registry model (single hosted registry plus lockfile with source checksums) has been refined for 15+ years across npm, PyPI, Cargo, Maven Central. The same architectural pattern has, demonstrably, been the surface attackers have learned to exploit at scale. Recent incidents include:
The architectural lesson we've drawn from this is: transport-layer integrity (checksums, lockfiles) does not defend against compromised maintainers, compromised build environments, or social-engineering attacks. Mitigating those threats requires a different architecture.
Daml runs in regulated financial infrastructure. Validator Node Operators are often regulated entities. "A validator node operator loads a third-party Daml package" is a security-critical operation. The same threat model applied to a system where every package mediates financial transactions is a larger problem than in general-purpose ecosystems. This proposal helps ensure that only benign packages are used in production by Canton Network users, and streamlines the audit, code publication, and library adoption process.
Nix is the mature, existing infrastructure for producing reproducible, hash-verified builds. It is the best-in-class solution for software supply-chain security (see Reproducible Builds as a Security Primitive). This proposal builds on it instead of reinventing it. The hash covers the whole build (source, compiler, SDK, and environment) which proves a package was built from the exact source that was audited. Nix is already in production for Daml builds at financial institutions on Linux, macOS, and Windows, while the Phase 1 baseline serves consumers who do not adopt it.
Nix's has become more user-friendly and will not adversely impact dpm's ease of adoption. We are planning on using newer features in Nix that will circumvent needing any non-trivial installation at all. Top-notch supply chain security and also installer-free usage on Linux, macOS, and Windows is now possible.
For institutions whose IT policies limit installation of new tooling (including the dpm-registry plugin), the registry remains usable through standard OCI and HTTP tooling. Every published package will be reachable via a stable OCI link (for compatibility with the remote DAR features of dpm) or URL, with the SHA-256 DAR hash, the source hash (where source is distributed), the Nix derivation hash, and the audit reference all published as plain metadata. A user can fetch a DAR by URL, verify its SHA-256 against the published DAR hash, cross-check the audit reference against the same DAR hash, and place the file wherever their authorized build tooling expects to find it. The metadata that is used by dpm registry add is the same metadata a manual consumer would retrieve.
This access path is documentation and convention rather than a separate code path. The artifacts the registry serves are the artifacts a manual consumer downloads, and the hashes they verify against are the same hashes used by the audit pipeline. The automated tooling provides better ergonomics, but is not required for consuming the registry. This ensures the registry remains reachable from environments where tooling cannot be easily changed.
The proposal positions the Daml package ecosystem on a superior architectural footing from the start. The features fall into two groups: what makes the ecosystem productive, and what makes it secure. Section 1 lists the deliverables; this section frames what they add up to.
Productivity covers what makes the ecosystem work as a venue (all in the Phase 1 registry baseline): discovery and documentation surfaces with search, per-package pages, version history, and dependency graphs; SemVer-based version constraints on top of Canton's SCU semantics; and a dpm-native developer experience that extends the existing toolchain via its OCI component model without requiring changes to upstream tooling. Any author with a published DAR gets a publication path, a discovery surface, and an opt-in audit pipeline.
Security covers what makes the ecosystem safe to build on. The Phase 1 registry baseline provides audit-aware metadata traceable to specific reviewed revisions (per the Audit Metadata Schema); publisher- and auditor-signed attestations that a consumer verifies against the DAR they received; audit status as a first-class concept in the CLI, lockfile, and discovery surface, with tooling that refuses to auto-update across audit boundaries; and multi-mirror distribution via OCI with content-addressed hashes. The Phase 2 deeper-verification layer adds two paths: damlc source-to-DAR verification for consumers who need to check source-to-artifact correspondence without adopting Nix, and Nix derivation hashing (binding source, compiler, SDK, and build environment into a single content-addressed hash) with independent-rebuilder attestations, for auditors and organizations bootstrapping trust in the compiler itself.
These two groups compose. Distribution improvements without the security model would recreate the npm attack surface for a higher-stakes ecosystem. Security improvements without distribution changes would leave the current ad-hoc workflow in place. Financial infrastructure requires both, so this proposal addresses both.
This proposal primarily addresses pure code reuse: libraries, stdlib-style packages, utility modules, type classes and instances. Template-sharing across applications raises distinct architectural questions (vetting coordination, contract instance scoping, upgrade behavior) that require non-trivial Canton protocol work and careful coordination between users. Initially, we expect most distributed packages to avoid these issues by not including templates. However, in cases where the architectural details have been worked out, the package management and distribution of code and/or binaries for agreed-upon templates is possible and beneficial.
A complementary pattern enabled by this proposal is vendoring: consumers can vendor a published package's source (repackaging it under their own name and namespace) to retain SCU control while still pulling upstream fixes through the registry, subject to any applicable licensing restrictions.
Build a package management infrastructure for Daml, structured as a dpm component (per DPM's documented OCI extension model), that delivers:
dpm registry audit subcommand for standalone DAR verification.dpm-registry plugin) for browsing packages, audit results, version history, and dependency graphs..dar.Out of scope: on-chain registry contracts; modifications to dpm or the Canton protocol; funded library author seeding and funded library audits (to be proposed as separate work).
The system has four architectural layers that compose: a repository defining keys of publishers and auditors (a GitHub repository with a consortium of parties who decide which key submissions are valid, similar to ERC-7730 or cargo-vet), a metadata layer (consuming the Audit Metadata Schema where present), a source-and-build layer (OCI distribution in Phase 1; Nix derivations and substituters added in Phase 2), and an orchestration layer (the dpm-registry plugin, with a nix subcommand tree for Phase 2 operations).
The proposal delivers two phases with distinct roles; they compose architecturally (Phase 2 layers on top of Phase 1) but can be developed in parallel.
Phase 1: Registry baseline. The registry, discovery, audit metadata pipeline, publisher/auditor identity governance, dpm-integrated fetching (via hash-pinned OCI references), and the dpm-registry plugin with an audit subcommand for DAR-hash and audit-attestation verification (see Audit check). This is the groundwork exercised regardless of which deeper verification path a consumer chooses. The trust anchor is the auditor's signed attestation.
Phase 2: Deeper verification paths. For consumers who need to verify source-to-DAR correspondence themselves rather than trusting the auditor attestations alone, this proposal provides two paths that can be chosen based on threat model and available tooling:
Phase 1 stands independently. Phase 2 is opt-in and layers on top; a project's daml.yaml is the same regardless of which phase is used, so consumers pick the trust anchor at build time without changing the project configuration. The subsections below describe the constituent components, each of which contributes to one phase or spans both.
Publisher and auditor keys will be managed in a GitHub repository maintained by a consortium of trusted parties who decide which key submissions are valid. This follows the cargo-vet pattern: human review and publisher trust are represented as repository-managed metadata, importable and checkable by tooling. The Daml registry extends this pattern by adding Daml package IDs, DAR hashes, Nix derivation hashes, and auditor identities while using gittuf/TUF-style repository policy to protect the trust metadata itself.
dpm-registry plugin will be distributed via OCI through DPM's component model. Users will install it with dpm install dpm-registry (or by direct OCI reference per DPM's component configuration). Phase 2 Nix operations will be exposed as a subcommand tree (dpm registry nix ...) within the same plugin.A user adds a registry dependency:
$ dpm registry add interval-tree@^1.2
Resolving interval-tree@^1.2 -> 1.2.3 in registry...
✓ Adding oci://registry.example.com/interval-tree:1.2.3@sha256:def456...
✓ 3 transitive dependencies added
✓ Updated daml.yaml
The plugin wraps DPM's existing OCI-DAR mechanism (see remote DAR features of dpm) with registry-side version resolution. The resulting daml.yaml:
sdk-version: 3.4.0
name: my-app
version: 1.0.0
source: daml
dependencies:
- daml-prim
- daml-stdlib
- oci://registry.example.com/interval-tree:1.2.3@sha256:def456... # tool-managed
- oci://registry.example.com/canton-finance:1.0.0@sha256:abc789... # tool-managed
- oci://registry.example.com/interval-helpers:2.1.0@sha256:123abc... # tool-managed (transitive)
registry-dependencies: # user-edited; dpm-registry tracks the version constraint
- interval-tree@^1.2
components:
- damlc:3.5.2
- daml-script:3.5.2
Each tool-managed OCI reference includes both a tag (:1.2.3) and a digest (@sha256:...). The digest pins the exact DAR content, so daml.yaml itself records the specific hashes that will be fetched on subsequent builds; whatever DAR hash the consumer verified against the audit is what they will receive. DPM's existing OCI-DAR mechanism handles the fetch at build time.
The components: section pins damlc and daml-script versions. This is DPM's existing toolchain-pinning mechanism; the registry plugin ensures the pinned versions match what the registry's audit metadata assumes. The Phase 2 damlc source-to-DAR verifier uses this same entry to know which damlc to install and recompile against, giving Phase 2 verification a stable anchor to work from.
The same daml.yaml is used regardless of build tool. Phase 1 users run dpm build and DPM fetches the OCI references. Phase 2 users can run dpm registry nix build on the same file; the Nix path materializes the OCI references into the Nix store internally and produces a hermetic build, without requiring daml.yaml edits, separate add commands, or any symlink paths in the user-facing config. A project should be able to be built either way at any time.
registry-dependencies: is a field used to record version-range constraints. daml.yaml parsing in DPM is not strict (cf: pkg/damlpackage/damlproject.go) so unknown fields are silently ignored. No changes to DPM or the daml.yaml schema are required.
daml-nix.lock)The user-facing integrity record is the hash-pinned OCI references in daml.yaml; that record is sufficient for building either way. Phase 2's hermetic Nix build path produces daml-nix.lock as its own persistent record of the specific Nix closure used, pinning source hashes, Nix derivation hashes, and audit metadata. This file is a Phase 2 artifact (committed to version control for teams that want to record which Nix closure produced a release), but not required to build a project (dpm build and dpm registry nix build both work from daml.yaml alone). Note that the design of the lock file and other metadata schemas are subject to change during implementation; we plan to submit a CIP to formalize the format once the design is finalized. Example:
schema-version: 1
sdk-version: 3.4.0
packages:
interval-tree:
version: 1.2.3
main_package_id: 1234abdc...
source-hash: sha256:def456...
nix-derivation-hash: sha256:abc123...
audit:
auditor: halborn
status: passed
expires: 2027-04-15
report: https://github.com/halborn/audits/.../interval-tree-1.2.3.json
dependencies:
- daml-stdlib
From the lock file, a fully resolved nix hash is generated that locks down the full build closure (source, compiler version, SDK version, build environment, build flags, and transitive build inputs) into a single hash. Any third party with the same lockfile and Nix can reproduce the exact .dar and verify the hash for their platform. The fully resolved nix hash is stable across rebuilds per-platform. This is different from a source-checksum-only lockfile, which catches transport tampering but does not bind the build environment. The inclusion of the package ID in the lockfile clarifies the relationship between the vetting states on ledger and the packages referenced in the lockfile.
dpm build (existing DPM command, unchanged) reads daml.yaml's dependencies: and compiles, using DPM's existing OCI-DAR fetching (SDK 3.5.2+) to retrieve any hash-pinned OCI references.
dpm registry nix build (new) reads the same daml.yaml and hermetically builds the project as a Nix derivation. Internally, it materializes the referenced DARs into the Nix store (via a symlink farm at ./.dpm-nix/deps/, hidden from the user-facing config), then produces a content-addressed output at <hash>-<name>/<name>.dar in the Nix store. This is the path used for release artifacts, audit submissions, and CI verification. Any third party with the same daml.yaml and daml-nix.lock can reproduce the exact artifact and verify the hash matches. The full closure can be reproduced as long as the relevant sources are available in some form (repository, mirror, cache, and so on; cf. our work with Software Heritage Foundation for future long-term availability options).
When an author requests an audit the audit partner reviews the source, writes a signed audit report conforming to the Audit Metadata Schema, and publishes to the audit git repository. The audit report includes the source hash of the exact revision reviewed (per the schema's package_hash field), as well as the corresponding nix-derivation-hash where a Phase 2 build is available. The registry is scanned for new audits. Consumers see updated audit status on the next dpm registry update or dpm registry audit. Because the audit is a separately-published artifact indexed asynchronously, a package can be published before any audit exists. Audits can be attached later as they are produced. This lets publishing throughput exceed audit throughput, and lets time-critical patches reach consumers before the audit pipeline can run.
Auditor identities are managed through the keys repository described in Keys of Publishers and Auditors; the same repository indexes published audit results.
This establishes source-binary trust: the auditor reviews source, the audit report names a specific source hash, the lockfile records that source hash, and any consumer can verify the binary they're loading was built from exactly the source the audit partner signed off on.
The Phase 2 lockfile records the audit's source hash and nix-derivation-hash of the audited version. Tooling refuses to auto-update across audit boundaries: if a project's dependency pins an audited version (via daml.yaml hash-pinning in Phase 1 or daml-nix.lock in Phase 2) and a newer unaudited version is available, dpm registry update warns and requires an explicit override. This is the operational realization of "don't auto-update from an audited to an unaudited version."
The dpm-registry plugin provides an audit subcommand for Phase 1 verification. Given a DAR file or OCI reference, dpm registry audit <dar> fetches the corresponding audit report from the keys repository, verifies the publisher and auditor signatures against registered keys, and confirms the audit report attests to this exact DAR hash. The consumer gets a clear yes-or-no answer to "has this been audited by a trusted party?" using only hash and signature checks. No Nix or damlc recompilation involved.
Consumers who want only audit verification (without the rest of the registry workflow) still install just dpm-registry; the audit subcommand does not require any Phase 2 tooling.
The registry supports source-to-DAR correspondence verification without requiring Nix. Given a DAR, the tooling unpacks the source, drives damlc (installed via DPM at the version pinned in components:) to recompile, and confirms the main DALF's package ID matches. This lets damlc-only organizations verify source-to-artifact correspondence using tooling they already trust.
$ dpm registry damlc verify
Reading dependencies from daml.yaml...
Installing damlc 3.5.2 (from components:) via DPM...
Fetching sources from registry...
Verifying interval-tree 1.2.3...
✓ Main DALF matches (package ID 1234abdc...)
Verifying canton-finance 1.0.0...
✓ Main DALF matches (package ID 5678efab...)
Verifying interval-helpers 2.1.0...
✓ Main DALF matches (package ID 9012cdef...)
✓ All 3 dependencies verified against source
The verifier reads the components: entry from daml.yaml to determine which damlc version to install, then walks the dependency closure verifying each DAR's main DALF against a fresh recompilation. Because components: is pinned by the registry plugin at dpm registry add time (matching what the audit metadata assumes), the verifier has a stable damlc anchor to work from.
The mechanism requires small extensions to the DAR format (module prefixes, build options, damlc version) and a DAR-unpacking CLI. Where the full dependency closure is available through the registry, verification folds across every DAR in the tree, giving full-closure source-to-DALF coverage without leaving the SDK-provided toolchain.
Verification against the compiler binary itself, reproducing the compiler from source rather than trusting the SDK distribution channel, is provided by the Nix path within Phase 2.
For packages distributed as binary-only DARs (i.e., with no public source), the audit pipeline preserves source-binary trust without exposing the source. The author can keep the source private as long as the audit partner can review it under whatever access arrangement they negotiate, and the published audit report names both the source hash the auditor reviewed and the DAR hash being distributed. A consumer can see that the auditor reviewed source at hash X, attested that hash X produces the DAR at hash Y, the registry serves DAR Y without needing source access. Trust here rests on the auditor's attestation rather than on the consumer's ability to re-verify the source. License terms governing redistribution still apply.
The proposal aligns with established directions in Canton and Daml architecture:
dpm-registry component published to an OCI registry, registered via the documented manifest format (apiVersion: digitalasset.com/v1, kind: Component). User invocation goes through dpm registry <subcommand> with internal dispatch, the same pattern as kubectl plugins, git extensions, and cargo plugins.dpm-registry registry consumes the audit metadata schema defined by PixelPlex's draft CIP (PR #168; numbering caveats in References). References throughout this proposal to "the Audit Metadata Schema" mean this format.#<package-name>:<module>:<entity>) and Tri-State Vetting model are the substrate the registry's resolution semantics build on. dpm-registry uses dpm upgrade-check internally to gate SCU-compatible upgrades.dpm, the Canton protocol, or SCU/vetting workflows. The damlc source-to-DAR verifier requires small, additive extensions to damlc (DAR-format additions, unpacker and verifier commands) coordinated with the Daml language team; these are the only upstream toolchain changes required.Obsidian Systems has been building infrastructure for Nix, Haskell, and blockchain for over a decade.
Nix infrastructure for Daml (production):
.dar builds, an Obsidian-operated S3 binary cache, and nix-shell development environments. Used in production by Obsidian and by Daml development teams that have adopted it. This is the technical foundation the proposed work productizes and extends.Source preservation and decentralized distribution:
Core Nix and build systems expertise:
Enterprise blockchain and shipped tooling:
There is no impact on existing systems, integrations, or workflows.
dpm-registry continue to use unmodified dpm, unmodified daml.yaml semantics for documented fields, and the existing Canton participant package vetting workflow at runtime.daml.yaml parsing is permissive about unknown fields (verified in DPM source). The registry-dependencies: field is silently ignored by dpm build; the tool-managed dependencies: entries it generates are standard.daml.yaml and follows the symlinks transparently.multi-package.yaml) work via per-package configuration. Future shared-declaration at the multi-package root level would require schema collaboration with DA but is not required for V1.The system addresses four distinct attack vectors with distinct mechanisms:
| Attack vector | Examples | Mechanism |
|---|---|---|
| Build-time supply-chain compromise | Compromised build environments, malicious build-time dependencies, non-reproducible compilation hiding tampering | Nix derivation hashing binds source + compiler + SDK + build environment into a single hash. Independent verifiability. |
| Transport-layer tampering | Mirror compromise, MITM on download | SHA-256 source hashes in the lockfile (table stakes; also caught by Nix). |
| Maintainer compromise / merged-PR attacks | Account takeover, social engineering, malicious PR merged upstream (Axios pattern) | Human audits via audit partner; tooling refuses auto-update across audit boundaries. |
| Dependency confusion / typosquatting | Org-scope mirroring, name-similarity attacks | Single-registry with publisher identity verification (see Keys of Publishers and Auditors). |
Daml's runtime threat model is narrower than npm's: compiled Daml packages run in a Daml VM with no runtime dependencies on the rest of the ecosystem, so the attack surface for pure code run-time exploitation is limited. The template threat model (exploiting signatory authority) is mitigated by human audits. The build-time and audit-time attack vectors are where the risk is, and where this proposal focuses.
Eight milestones organized in three phases. Each milestone is independently deliverable and payable. Within each phase, milestones are ordered from least dependencies to most; progress can be marked and paid out as each milestone lands, without waiting for later work.
Deliverables:
Deliverables:
dpm-registry pluginDeliverables:
dpm-registry published as a DPM component to a public OCI registry (Apache 2.0).dpm registry: init, add, remove, update, info, search, tree, publish, audit.daml.yaml's dependencies: field. registry-dependencies: maintained by the plugin for version-constraint tracking. components: updated to pin damlc and daml-script per registry audit metadata.dpm registry audit <dar> verifies the DAR hash, publisher signature, and auditor signature against the keys repository at a specified revision.dpm upgrade-check to gate SCU-compatible upgrades.damlc source-to-DAR verificationdamlc recompile. Delivered by Obsidian under standard grant terms because the Daml language team has not prioritized this work in the near term.Deliverables:
damlc upstream PR: DAR-format extensions (module prefixes, build options, damlc version), unpacker CLI (damlc unpack-dar), and verifier command. Coordinated with the Daml language team and shepherded through review.dpm registry damlc: verify, unpack.dpm registry damlc verify walks the dependency closure, drives the upstreamed damlc at the version pinned in components: to recompile source, and confirms main-DALF package IDs match. Handles closure-fold across multiple DARs (see Source-to-DAR verification).Deliverables:
dpm registry nix: build, shell, verify, install, clean.dpm registry nix build reads the same daml.yaml as dpm build, materializes referenced DARs into the Nix store via an internal symlink farm at ./.dpm-nix/deps/ (not exposed in user config), and produces content-addressed output at <hash>-<name>/<name>.dar.daml-nix.lock internal Phase 2 build state, recording source hashes, Nix derivation hashes, and Audit Metadata Schema fields per dependency.Deliverables:
dpm registry and its subcommand trees (damlc and nix as they are available), conceptual guides covering the threat model, the Audit Metadata Schema, both build modes (dpm build and dpm registry nix build), publisher onboarding, and migration from vendored DARs.Deliverables:
dpm registry info within one sweep cycle.dpm registry publish workflow generating audit metadata as a side effect of publication; round-trip verified.dpm registry publish workflow).Deliverables:
daml-script DARs through this registry, so they can be consumed via the same mechanism as any other registry package and the SDK bundle no longer needs to ship them. Same shepherding commitment.The Tech & Ops Voting Committee will evaluate completion against the following. Each milestone can be evaluated and paid out independently.
Cross-cutting:
M1 (keys repository):
M2 (registry backend and base audit pipeline):
M3 (dpm-registry plugin):
init, add, remove, update, info, search, tree, publish, audit) functional against the running registry backend from M2.dpm registry add <package>@^1.2 produces hash-pinned OCI references in daml.yaml's dependencies:, updates registry-dependencies: for the version constraint, and pins damlc/daml-script in components:.dpm registry audit <dar> verifies the DAR hash, publisher signature, and auditor signature against the keys repository at a specified revision. Passes on audited packages; fails on tampered DARs or unrecognized signatures. Tooling refuses to auto-update across audit boundaries.dpm install dpm-registry, dpm registry init, dpm registry add <example-package>@^1.2, dpm registry audit <dar> (passes), dpm build (produces a valid .dar).M4 (damlc source-to-DAR verification):
damlc upstream PR: DAR-format extensions, unpacker CLI (damlc unpack-dar), and verifier command opened and shepherded through review. Merged, or on a documented path to merge, by milestone acceptance.dpm registry damlc verify walks the dependency closure, recompiles source under the damlc version pinned in components:, and confirms each main DALF's package ID matches. Passes on audit-matched sources; fails on tampered source.M5 (Nix hermetic-build path):
dpm registry nix build produces content-addressed output. An independent rebuilder with the same daml.yaml and daml-nix.lock produces the same nix-derivation-hash on the same platform.daml-nix.lock records source hash, Nix derivation hash, and audit reference for each dependency. Where an audit exists, the audit report's stated source hash matches the entry in the lock file.M6 (discovery and documentation):
dpm registry and its damlc and nix subcommand trees (or the subset available at delivery), conceptual guides covering the threat model and the Audit Metadata Schema, both build modes documented, publisher onboarding guide, and migration guide.M7 (mature identity governance and audit pipeline):
dpm registry info within one sweep cycle, verified across multiple parties.dpm registry publish workflow: publishing a package generates audit metadata as a side effect; round-trip verified.M8 (bootstrap migrations):
Committee base ask: 7,150,000 CC, covering M1-M4 and M6-M8. M5 is delivered by Obsidian at no cost to the committee (see Phase 2 co-funding).
Committee ceiling with acceleration bonuses and full adoption tranche: 8,528,000 CC.
| Milestone | Phase | Description | CC | Notes |
|---|---|---|---|---|
| M1 | Phase 1 | Keys repository | 520,000 | |
| M2 | Phase 1 | Registry backend and base audit metadata pipeline | 1,040,000 | |
| M3 | Phase 1 | dpm-registry plugin | 1,820,000 | |
| M4 | Phase 2 | damlc source-to-DAR verification | 1,300,000 | Includes upstream coordination |
| M5 | Phase 2 | Nix hermetic-build path | 0 | Obsidian-funded |
| M6 | Bootstrap and launch | Discovery and documentation | 1,105,000 | |
| M7 | Bootstrap and launch | Mature identity governance and audit pipeline | 715,000 | |
| M8 | Bootstrap and launch | Bootstrap migrations | 650,000 | Upstream PR work + adoption coordination |
| Committee base total | 7,150,000 |
Phase 2 has two paths: damlc source-to-DAR verification (M4) and Nix hermetic builds with independent-rebuilder attestations (M5).
The Nix path (M5) is co-funded by Obsidian and requested at 0 CC from the committee. Obsidian delivers M5 regardless of committee funding: roughly 5.25 person-months of engineering, valued at ~1,105,000 CC on the same basis as the other milestones, drawing on existing nix-daml-sdk infrastructure. This is Obsidian's skin-in-the-game contribution to the ecosystem, and it means the committee receives the full two-path Phase 2 verification story without paying for the Nix half.
The damlc path (M4) is delivered by Obsidian under standard grant terms. The Daml language team has not prioritized this work in the near term, and Obsidian is willing to do it. The estimate carries an explicit line item for upstream coordination with the Daml language team; landing the DAR-format extensions and verifier command through multiple review rounds is the load-bearing risk on this milestone.
Phase 1 (M1-M3) and the Bootstrap and launch phase (M6-M8) stand as complete work on their own; the committee can approve them in full without requiring the Phase 2 milestones (M4 and M5).
Two milestones carry acceleration bonuses tied to early delivery:
Both bonuses are all-or-nothing on the specified gates; partial delivery does not trigger a proportional bonus.
Beyond the base M8 award, adoption is rewarded per external mainnet integration demonstrated within twelve months of M8 acceptance:
The per-integration figure is higher than typical adoption tranches (comparable proposals use ~130K) because the target integrators here are validator node operators and protocol maintainers rather than small dev shops; each represents a materially larger ecosystem win. Specific integration definitions and verification criteria will be finalized with the committee before M8 delivery.
| Component | CC |
|---|---|
| Base (M1-M4, M6-M8; excluding M5) | 7,150,000 |
| M3 acceleration bonus (if met) | +273,000 |
| M8 acceleration bonus (if met) | +130,000 |
| M8 per-integration adoption (up to 5) | +975,000 |
| Committee ceiling | 8,528,000 CC |
| Committee floor (base only) | 7,150,000 CC |
If the project duration extends beyond six months, the grant is denominated in fixed CC and requires re-evaluation at the six-month mark. Should the timeline extend beyond six months due to committee-requested scope changes, remaining milestones may be renegotiated to account for USD/CC price volatility.
Hosted infrastructure for the initial public deployment (discovery site, generated documentation, metadata backend, S3-backed binary cache) should run in the low hundreds of dollars per month. The main scaling variable is binary-cache storage and download traffic. S3 Standard storage runs roughly $24/TB-month at the first tier, and CloudFront flat-rate plans keep CDN delivery predictable within their request and data-transfer allowances.
Obsidian operates and pays for this infrastructure during launch and early adoption. This commitment holds while operating costs stay in the range of a small hosted service. If adoption grows past that point, the architecture does not require a single operator. Nix substituters are natively multi-mirror (see Distribution), so additional substituters can be added without protocol changes: Foundation-hosted, partner-hosted, or community-hosted. Obsidian will publish operating-cost data as the project matures so that any move to shared operations can be based on real numbers.
Obsidian Systems will collaborate with the Foundation on coordinated announcements, technical write-ups,
Shown up to 60,000 characters. Read the full file on GitHub ↗
Rebuilt from the recorded board moves (complete history). get_dev_fund_lifecycle(number) gives the same in the MCP.