# description
Row in `state_jobs`. Non-terminal state until it reaches `completed` or `failed`, at which point an `ExecutionRecord` is also written.

# properties.actionVersion.description
Semver of the action implementation at submit time. Frozen for this job.

# properties.nodeId.description
Target `node.path`. `--all` submissions fan out into one job per node.

# properties.contentHash.description
sha256(actionId + actionVersion + bodyHash + frontmatterHash + promptTemplateHash). Duplicate detection key.

# properties.nonce.description
Unique per-job token. `sm record` requires it to close the job — mismatch rejects with exit code 4.

# properties.status.description
Lifecycle state. See `dispatch-lifecycle.md` for allowed transitions.

# properties.ttlSeconds.description
Resolved TTL at submit time: max(expectedDurationSeconds × graceMultiplier, minimumTtlSeconds). Frozen.

# properties.filePath.description
Relative path to the rendered job file (usually `.skill-map/jobs/<id>.md`). Null before rendering.

# properties.expiresAt.description
Derived = claimedAt + ttlSeconds × 1000. Used by auto-reap. Null while queued.

# properties.submittedBy.description
Free-form: username, CI job id, or `skill:<skill-id>`. Optional provenance.