How a release's facts, change record and fingerprints are worked out
This is the detail behind What a release shows,
The changelog, Search and
The verifier: what jadpo package check prints above its
bar, and what jadpo package verify --json writes.
The facts cover what the code can do. An operation of a resource the package keeps to itself reaches the host and can change something there as much as a public one does, so
hostsandchanging_callslist every operation, and a hostile release can't hide a call behind a public action.hostsare the provider'shosts:and eachaskshost, or "the service Jadpo runs" and "the address its connection gives" where it names none. Each marked field is listed for each host it reaches, with its operation and categories, anddecided_onlywhen the value only decides what is sent.storable_typesare every public type of a library package, and of a provider's only the plain values, never an object or an enum.standard_candidatesarepackage.standard_candidate's findings on the package's types, which a package that compiles has declined.last_contract_runand the Jadpo releases it works with are the registry's to add, soverifywritesnullfor the first and leaves out the second.The change record. It compares the surface with the last release's: a new entry is
added, one goneremoved, a newfailslinenew_failure, a new hostnew_hostonprovider, and any other change to an entry's facts oneretyped, whosedetailsays what it says now and what it said (max_length: 30, was max_length: 20). Descriptions, files, sources and recordings alone aren't changes. Comparing the two releases' facts givespersonal_data_sent, once per field and host. A last release this Jadpo can't compile has no facts, so everything now sent counts as new.jadpo package checkwritesCHANGELOG.md's list from these entries, a line each, and a first release's list is "first release".The previous release's examples and tests run in a scratch app of their own: the new package's files without its own tests, and the last release's
.test.jadpofiles and description examples placed beside them. A release at a tag is read from git;verifyis given its folder. Each one that fails is abehaviour_changedentry, whosedetailis its name and whose declaration is the public call it makes, on the line that failed if it can tell. One that no longer compiles has failed too, so a release can't hide a change by removing a helper an old test leans on. Recordings aren't run again: the new package's own are, by the bar.A fix is a line beneath the new version's list in
CHANGELOG.md,Fix `uk.parse`: why it had to change, naming the entry's declaration. It says why as well, so it needs no other text, and its reason is the entry'swhy. A mark with no reason is no mark. Without one, the bar'sbehaviourrow fails withpublish.behaviour_changed. While the version row itself is refused the behaviour row waits, since a breaking change usually fails those examples too.A new major version is compared with the newest release of any label of the package's name in code, so
Postcodes.v3's first release shows what changed sincePostcodes.v2's last. Its version is still the one its label names, nothing in the change record refuses it, and its behaviour row says "a new major".
jadpo package verify <folder> [--previous <folder>]is this bar on a commit as it stands: it writes nothing, and reads no git tags. Asurfacerow checks the committedsurface.jadpo_recordagainst the code, and thechangelogrow checks the list under the version's heading against the change record, eachpublish.stale_fileswhen it differs. The previous folder's version is the one its committed surface says, and it has to be a release of the same name in code. With no--previousit is a first release. Its JSON holdspackage,version,passed,bar,surface(the record's text),facts,change_record,fingerprints,previous(since,ran, eachfailed) andjadpo, the release it was checked with. Its screen ischeck's, without theWroteline or the hint, and its footer counts the fingerprints.Fingerprints. Each public declaration has
source, the SHA-256 of its tokens as the formatter writes them, leaving out its description, comments, visibility,declinelines and its own name. A function's or action's parameters and variables are named by their position, as the similar-helper check names them, so a renamed and reformatted copy has the samesource. A type's fields keep their names, since they are what it is. Each operation, action and function also hasshape:inputsandoutputreduced to standard types and their constraints (Text { max_length: 20, min_length: 5 },{ note: Text?, outward: Text },Enum { england, wales }, with…where a type comes round to itself),failuresreduced to their kinds,effects(calls,changes), and adigestof those for an exact match. A recipe has none: it isn't part of the compiled package.What
checkprints, for a provider package with a release behind it:$ jadpo package checkFacts kind provider hosts https://api.acme-pay.example https://sandbox.acme-pay.example changes customers.create erasure not declared storable CustomerId failures none contract 1 of 2 operations confirmedPersonal data sent to https://api.acme-pay.example to https://sandbox.acme-pay.example customers.create CustomerRequest.notes health, sensitiveChanges since 1.0.0 + new host provider https://sandbox.acme-pay.example + personal data customers.create CustomerRequest.notes to https://sandbox.acme-pay.examplePublishing bar...A row is left out only where the package's kind can't have it, so a library's block is its kind, what an app may store and what can fail, and
standardshows only when there is one.jadpo package showprints the same block, and--jsonholds every fact whole, with each host's operations.
Markdown for agents: /docs/how-a-releases-facts-change-record-and-fingerprints-are-worked-out.md.Built from Jadpo main at e00e61f.