Skip to main content

Application Manifest V4

Repositories author proof.liskov.application-manifest version 4. Liskov resolves release and server-owned facts into proof.liskov.application-policy version 4. Objects are strict: unknown fields are errors.

All durations are milliseconds unless the field says otherwise. Optional means the field may be omitted; it does not mean every typed value is enabled. Check Capabilities and limits.

Authored top level

{
"schema": "proof.liskov.application-manifest",
"schemaVersion": 4,
"applicationId": "status-worker",
"applicationUid": "optional-server-issued-pin",
"metadata": {},
"release": {},
"runtime": {},
"deployment": {},
"ingress": {},
"observability": {},
"configuration": {}
}
FieldPresenceContract
schemaRequiredExactly proof.liskov.application-manifest.
schemaVersionRequiredUnsigned integer 4.
applicationIdRequired1–64 lowercase letters, numbers, ., _, or -; begins with a letter or number.
applicationUidOptionalNon-empty server-issued immutable identity; if present, must match target.
metadataOptionalDefaults to {}; author-facing description/classification.
releaseRequiredExactly one build or pinned arm.
runtimeOptionalRuntime requirements plus secure bootstrap defaults.
deploymentRequiredSchedule and lifecycle are required.
ingressOptionalDefaults to {}; public v1 has no general ingress.
observabilityOptionalLogs off; signed diagnostics on.
configurationOptionalVariables and secret declarations; defaults to empty.

Display name, organization/owner, mutable status, publication timestamps, signatures, provenance results, quotes, processor identities, and other launch facts are server-owned and invalid in a manifest.

metadata

FieldTypeDefault / rule
appTypestringOptional workload classification, such as background-worker.
labelsstring[][]; order is digest-significant.
descriptionstringOptional human description.

Metadata affects authoredDigest but is absent from the effective policy and its policyDigest.

release

release is a strict tagged union selected by mode. Do not mix arms or put a CID in a build release.

Build release — release-gated v1

{
"mode": "build",
"artifact": {
"kind": "ipfs_bundle",
"encryption": { "mode": "none" }
},
"builder": {
"kind": "github",
"repository": "owner/repository",
"allowedRefs": ["refs/heads/main"],
"workflowRef": "owner/repository/.github/workflows/liskov.yml@refs/heads/main",
"manifestPath": ".liskov/application-manifest.json"
}
}

All GitHub builder fields are required. repository is owner/repository; allowedRefs is non-empty with no duplicates; workflowRef is exact; and manifestPath is a safe repository-relative path.

Artifact kindContractAvailability
ipfs_bundleExplicit encryption.mode: none or aes256_gcm. The reviewed reusable action supports only none; aes256_gcm has no complete supported build-and-runtime path. CID/digest are resolved from an accepted artifact version.Release-gated v1
runtime_imageTyped immutable image/bootstrap release authority.Internal; no public authoring recipe

Pinned release — v1 for curated first-party versions

{
"mode": "pinned",
"artifact": {
"kind": "ipfs_bundle",
"cid": "ipfs://Qm...",
"digest": "sha256:...",
"encryption": { "mode": "none" }
}
}
Artifact kindRequired fieldsAvailability
ipfs_bundleCanonical ipfs:// CID, sha256: digest, encryption none or aes256_gcm.v1 for curated versions
runtime_imageImmutable imageDigest, canonical bootstrapCid, bootstrapDigest.Internal

Pinned releases contain no builder authority or source provenance. Catalog ingestion owns the provenance of a curated version.

runtime

FieldTypeDefault / notes
engineenumOptional: nodejs, deno, or bun; public workload guide uses Node.js.
commandstringOptional command run by the selected runtime.
rolestringOptional author-defined role label.
resourcesobject{}.
requiredModulesstring[][]; names such as network, subject to capability checks.
bootstrapobjectSecure non-weakenable defaults.

runtime.resources

FieldType/unitRule
memoryMiBunsigned integer MiBOptional; explicit zero is preserved.
storageMiBunsigned integer MiBOptional; explicit zero is preserved.
networkRequestQuotaunsigned integer requestsOptional; explicit zero is preserved.

Platform and plan bounds apply during publication/launch.

runtime.bootstrap

FieldDefaultRule
trustProfileproof.liskov.attested-runtime.v1No other value.
signedDiagnosticsRequiredtruefalse is invalid.
identityBoundSecretsRequiredtruefalse is invalid.

deployment

FieldPresenceDefault / rule
parallelismOptionalDefault 1; schema range 1–64; public v1 enables only 1.
scheduleRequiredPaid schedule boundary.
placementOptionalAttested requirements plus open-market default.
lifecycleRequiredRenewal, update, and recovery authority.
spendOptional{}; explicit caps.

Parallelism is Liskov logical job slots with monotonic generations, not provider-native replicas.

deployment.schedule

FieldPresenceRule
durationMsRequiredUnsigned integer greater than zero.
startDelayMsOptionalIf maxStartDelayMs exists, cannot exceed it.
maxStartDelayMsOptionalUnsigned maximum accepted start delay.

deployment.spend

FieldType/unitRule
maxRewardPlanckPerJobdecimal string, planckUnsigned base-10 integer string.
maxNativeFeePlanckPerJobdecimal string, planckUnsigned base-10 integer string.
maxServiceCreditMicrosPerGenerationunsigned integer, USD micros1,000,000 is USD 1.00 in Service Credits.

These are maximum authority, not quote or final price.

deployment.placement

FieldDefaultAvailability
requirementsMandatory attested trust profilev1
groups[]Internal
topologyConstraints[]Internal
processorSelectionOpen market, fail-closed unknown managerOpen market v1; other arms internal

Requirements

FieldContract
trustProfileDefaults to and can only be proof.liskov.attested-runtime.v1.
machineOptional immutable class/profile/minimums request. Capability-gated.
evidenceArray of versioned evidence thresholds. Capability-gated.

machine can contain class, profileVersion, and minimums: {metric: unsignedInteger}. Do not author current processor availability, performance observations, or resolved catalog data.

Every evidence[] item requires profile, metric, unsigned minimum, unsigned maxAgeMs, unsigned minimumSamples, minimumConfidenceBps from 0–10,000, and strength of required or preferred.

Processor selection

Supported v1:

{ "mode": "open_market" }

Shared optional filters are excludeManagers: string[], allowUnknownManager: boolean (default false), requireScheduleClear: boolean (default false), requireConsumerAccess: boolean (default false), maxHeartbeatAgeSeconds, candidateLimit, and scanLimit. Capability and account checks still apply.

Typed internal arms:

{ "mode": "manager", "managerId": "partner-manager" }
{
"mode": "static",
"processorIds": ["5ProcessorAddressA"],
"managerId": "optional-manager-binding"
}

Do not use these internal arms in public recipes.

Groups and topology — internal

Each group requires unique non-empty name, positive count, and a geography union. Group counts must sum exactly to parallelism.

Country selector:

{
"kind": "country",
"standard": "ISO-3166-1-alpha-2",
"values": ["GB", "US"]
}

Values are non-empty uppercase two-character codes. Region selector uses kind: "region", non-empty versioned catalog, and non-empty values.

Every topology constraint requires:

  • kind: affinity or anti_affinity;
  • scope: this_deployment;
  • topologyKey: processor, operator, manager, country, or region; and
  • strength: required or preferred.

deployment.lifecycle

renewal, update, and recovery are all required.

Renewal

Supported after end:

{ "mode": "after_scheduled_end" }

Supported fixed lead:

{
"mode": "before_scheduled_end",
"leadTime": {
"mode": "fixed",
"durationMs": 600000
}
}

Fixed lead is 60,000 through the lesser of 1,800,000 and half of schedule.durationMs.

Typed internal automatic lead:

{
"mode": "before_scheduled_end",
"leadTime": {
"mode": "automatic",
"profile": "proof.liskov.renewal-lead.v1"
}
}

Only that profile value is structurally valid; the capability is not enabled.

Update

FieldValues / availability
timingnext_scheduled_renewal or immediate — v1
existingJobsrun_until_scheduled_end — v1; cooperative_cease — release-gated v1
{ "mode": "run_until_scheduled_end" }

Cooperative cease is typed as:

{
"mode": "cooperative_cease",
"trigger": "successor_runtime_ready"
}

Trigger values are rollout_started, successor_processor_claimed, and successor_runtime_ready. Do not use until the capability gate is removed.

Recovery

FieldPresenceDefault / availability
launchOptional{ "maxRetries": 5 }; 0–10, v1.
runtimeFailureRequiredwait_until_scheduled_end is v1.
{ "mode": "wait_until_scheduled_end" }

replace_after_failure is typed but internal:

FieldDefaultBounds
contactLossAfterMs300,000120,000–1,800,000
restartGraceMs600,0000–86,400,000
maxSameJobRestarts30–50
maxFreshRegistrationReplacements20–10

ingress — internal for general v1 workloads

http and ssh are typed requests. Mode values are disabled, optional, and required; optional and dual ingress are also capability-gated.

HTTP requires mode and unsigned 16-bit port; healthPath is optional. SSH requires mode; port defaults to 22. A usable port is 1–65,535.

Do not interpret this schema as Liskov-hosted ingress. A curated offering can document its own Acurast boundary.

observability

FieldDefault / rule
logs{ "enabled": false }
runtimeDiagnostics{ "signed": true }; false is invalid

logs supports:

FieldDefault / notes
enabledfalse
profileIdOptional versioned logging profile.
sinkNameOptional configured sink name.
context{} map of non-secret strings.

configuration

FieldDefault
variables[]
secrets[]

Variables

FieldPresenceDefault / notes
nameRequiredRuntime variable name.
requiredOptionalfalse
defaultOptionalNon-secret string.
managedOptionalfalse; true selects Application-managed value.

Never put secret plaintext in default.

Secrets

FieldPresenceDefault / notes
secretIdRequiredStable ID, not secret material.
requiredOptionaltrue
destinationRequiredenv or file tagged union.
bundleIdOptionalGroups related secret material.
{ "kind": "env", "name": "DATABASE_URL" }
{ "kind": "file", "path": "/run/secrets/config.json" }

Effective policy

The materialized policy has schema proof.liskov.application-policy V4. It contains required applicationId, server-resolved applicationUid, resolved immutable artifact, and normalized runtime, deployment, ingress, observability, and configuration.

It contains no metadata, builder authority, mutable source provenance, upload session, or publication-envelope fields. Runtime-image policies bind both immutable image and bootstrap identity.

Contract constants

ConstantValue
Authored schemaproof.liskov.application-manifest
Effective schemaproof.liskov.application-policy
Schema version4
Read-contract version3
Mandatory trust profileproof.liskov.attested-runtime.v1
Automatic lead profileproof.liskov.renewal-lead.v1
Schema maximum parallelism64; public v1 enables 1

Validation layers

  1. JSON parse and strict schema.
  2. Semantic/cross-field Manifest V4 validation.
  3. Import identity and source binding.
  4. Artifact/builder provenance resolution.
  5. Capability and organization entitlement.
  6. Publication race fence and immutable effective-policy creation.
  7. Deployment-time funding, market, configuration, and external facts.

Use proof liskov application manifest validate --file PATH for layers 1–2 and publication --dry-run for contextual publication checks.