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, at least 60000 (60 seconds).
startDelayMsOptionalCannot place the job start more than 86400000 ms (24 hours) in the future; if maxStartDelayMs exists, cannot exceed it.
maxStartDelayMsOptionalUnsigned integer, at most 3600000 (one hour).

These bounds come from the current compiled Acurast runtime. proof liskov reports the exact field pointer and refuses an invalid local manifest before sending an import request.

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

For new manifests, use only:

FieldDefault / notes
enabledfalse; true asks Liskov to provision managed logging automatically.

Published Manifest V4 also accepts profileId, sinkName, and context as deprecated compatibility fields. Existing immutable effective policies keep their authored values. Validation returns a non-blocking deprecated_manifest_field diagnostic for each one. Do not add them to new manifests; a future schema will derive sink identity and context entirely in Liskov.

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.