Jadpo is experimental and not ready for production. These docs follow the compiler's main branch as of 5 Nov 2026. What's built · Install 0.3.0
jadpo
ReferenceErrors

ErrorsTools · rule

install.surface_mismatch

On this page

The package you are installing has code that offers something different from its committed surface.jadpo_record.

Area 14, Tools; not declinable; the next step is usually the human's.

Why Jadpo refuses it

A package's surface, surface.jadpo_record, lists everything it offers an app: its public types, failures, functions and operations. It is what reviewers read when the package is installed or upgraded, as a diff in the pull request. jadpo package check writes it from the code.

A surface that doesn't match the code would let the code offer, or change, something no reviewer saw. So jadpo package add and update compile the package, compare the surface its code gives with the committed one byte for byte, and install nothing when they differ.

Jadpo won't rewrite the package's surface for you, because the surface belongs to the package's own repository and its release.

What it looks like

A Postcodes package gained a public type, InwardCode, after its surface was written. An app installs it from its folder:

shell
jadpo package add ../postcodes
jadpo package

error Postcodes.v2's surface.jadpo_record doesn't match its code

reason
Its code has type InwardCode, which its committed surface doesn't. A package is installed only when its surface, what reviewers read, is what its code offers.
next
Run jadpo package check in the package's repository, commit its surface.jadpo_record, and release it again (human)
rule
install.surface_mismatch
help
https://jadpo.dev/docs/errors/install.surface_mismatch

(human) at the end of the next: line tells your coding agent to stop and ask you which fix you want, because the choice is yours to make: it decides what the package offers the apps that install it.

How to fix it

If the new code belongs in the package, write its surface again in the package's own repository:

shell
jadpo package check
output
Facts  kind: library, pure  storable: InwardCode, UkPostcode, WrittenPostcode  failures: uk.parse: InvalidPostcodePublishing bar  compiles      passed                        no errors  described     passed                        every public declaration  examples      passed                        1 example, every failure shown  tests         passed                        no tests  version       passed                        2.0.0, the first release  changelog     passed                        2.0.0 says why  licence       passed                        mit, from Jadpo 1.0Wrote surface.jadpo_recordpackage check passed: Postcodes.v2 2.0.0, 7 passed

Commit the surface with the code, and release it again if the app installs it from git. Then the install goes through:

shell
jadpo package add ../postcodes
output
Added Postcodes.v2 2.0.0    folder   packages/postcodes/v2    source   path ../postcodes    surface  matches its codepackage added: Postcodes.v2 2.0.0, 1 function, 3 types, 1 failurenext: jadpo package show postcodes  shows what it offers

When a package from git is the one refused, the surface has to match at the tag you install, so the fix is a new release with the surface committed.

Markdown for agents: /docs/errors/install.surface_mismatch.md.Built from Jadpo main at aee2e8f.