Change-Trace JSON Schema Contract
Version: 1.0.0
Status: Draft
Last Updated: 2026-01-12
Overview
This document defines the JSON schema for Change-Trace artifacts (trace.cdxchange.json). All implementations must conform to this schema for interoperability.
Schema Identifier
Root Object
Properties
| Property |
Type |
Required |
Description |
schema |
string |
Yes |
Schema version identifier. Must be stella.change-trace/1.0 |
subject |
object |
Yes |
Subject of the comparison |
deltas |
array |
Yes |
Array of package deltas (may be empty) |
summary |
object |
Yes |
Aggregated summary metrics |
analyzedAt |
string |
Yes |
ISO 8601 timestamp (UTC) |
algorithmVersion |
string |
No |
Algorithm version used (default: "1.0") |
Subject Object
Properties
| Property |
Type |
Required |
Description |
imageRef |
string |
Yes |
Container image reference |
fromDigest |
string |
Yes |
SHA-256 digest of source image |
toDigest |
string |
Yes |
SHA-256 digest of target image |
fromScanId |
string |
No |
Source scan identifier |
toScanId |
string |
No |
Target scan identifier |
PackageDelta Object
Properties
| Property |
Type |
Required |
Description |
purl |
string |
Yes |
Package URL (RFC 3986 compliant) |
fromVersion |
string |
No |
Source version (null if added) |
toVersion |
string |
No |
Target version (null if removed) |
changeType |
enum |
Yes |
Type of change |
symbols |
array |
No |
Symbol-level deltas (if available) |
bytes |
array |
No |
Byte-level deltas (if enabled) |
trustDelta |
object |
Yes |
Trust impact calculation |
ChangeType Enum
| Value |
Description |
unchanged |
No change detected |
added |
Package added in target |
removed |
Package removed in target |
upgraded |
Version increased |
downgraded |
Version decreased |
patched |
Security patch applied (same base version) |
rebuilt |
Same version, different build |
SymbolDelta Object
Properties
| Property |
Type |
Required |
Description |
symbolName |
string |
Yes |
Symbol/function name |
changeType |
enum |
Yes |
Type of symbol change |
sizeDelta |
integer |
No |
Size change in bytes |
cfgBlockDelta |
integer |
No |
CFG basic block count change |
confidence |
number |
No |
Match confidence (0.0-1.0) |
matchMethod |
string |
No |
Method used for matching |
explanation |
string |
No |
Human-readable explanation |
SymbolChangeType Enum
| Value |
Description |
unchanged |
No change detected |
added |
Symbol added in target |
removed |
Symbol removed in target |
modified |
Symbol modified (general) |
patched |
Security patch detected |
ByteDelta Object
Properties
| Property |
Type |
Required |
Description |
offset |
integer |
Yes |
Byte offset in binary |
size |
integer |
Yes |
Size of changed region |
fromHash |
string |
Yes |
SHA-256 hash of source bytes |
toHash |
string |
Yes |
SHA-256 hash of target bytes |
section |
string |
No |
Binary section name |
context |
string |
No |
Context hint (e.g., function name) |
Privacy Note: Raw byte content is never included; only hashes are stored.
TrustDelta Object
Properties
| Property |
Type |
Required |
Description |
score |
number |
Yes |
Trust delta value (-1.0 to +1.0) |
beforeScore |
number |
Yes |
Trust score before change |
afterScore |
number |
Yes |
Trust score after change |
reachabilityImpact |
enum |
Yes |
Impact on code reachability |
exploitabilityImpact |
enum |
Yes |
Impact on exploitability |
proofSteps |
array |
Yes |
Human-readable proof steps |
ReachabilityImpact Enum
| Value |
Description |
unchanged |
No change in reachability |
introduced |
Path now reachable |
eliminated |
Path no longer reachable |
reduced |
Fewer reachable paths |
increased |
More reachable paths |
ExploitabilityImpact Enum
| Value |
Description |
unchanged |
No change in exploitability |
introduced |
New exploitability concern |
eliminated |
Exploitability eliminated |
up |
Increased exploitability |
down |
Decreased exploitability |
Summary Object
Properties
| Property |
Type |
Required |
Description |
packagesChanged |
integer |
Yes |
Total packages with changes |
packagesAdded |
integer |
Yes |
Packages added |
packagesRemoved |
integer |
Yes |
Packages removed |
symbolsChanged |
integer |
Yes |
Total symbols with changes |
bytesChanged |
integer |
Yes |
Total bytes changed |
trustDelta |
number |
Yes |
Aggregate trust delta |
overallVerdict |
string |
Yes |
Overall verdict |
Verdict Values
| Value |
Trust Delta Range |
Description |
risk_down |
< -0.3 |
Risk decreased significantly |
neutral |
-0.3 to +0.3 |
No significant risk change |
risk_up |
> +0.3 |
Risk increased significantly |
inconclusive |
N/A |
Unable to determine |
Full Example
{
"$schema": "https://stella-ops.org/schemas/change-trace/1.0/schema.json",
"schema": "stella.change-trace/1.0",
"subject": {
"imageRef": "docker.io/library/nginx:1.25.3",
"fromDigest": "sha256:abc123def456...",
"toDigest": "sha256:789ghi012jkl...",
"fromScanId": "scan-20260112-001",
"toScanId": "scan-20260112-002"
},
"deltas": [
{
"purl": "pkg:deb/debian/libssl3@3.0.9-1",
"fromVersion": "3.0.9-1",
"toVersion": "3.0.9-1+deb12u3",
"changeType": "patched",
"symbols": [
{
"symbolName": "ssl3_get_record",
"changeType": "patched",
"sizeDelta": -24,
"cfgBlockDelta": 2,
"confidence": 0.97,
"matchMethod": "CFGHash+ChunkMatch",
"explanation": "Function patched: 2 basic blocks changed"
}
],
"bytes": [
{
"offset": 4096,
"size": 2048,
"fromHash": "sha256:abc...",
"toHash": "sha256:def...",
"section": ".text"
}
],
"trustDelta": {
"score": -0.27,
"beforeScore": 0.65,
"afterScore": 0.92,
"reachabilityImpact": "reduced",
"exploitabilityImpact": "down",
"proofSteps": [
"CVE-2026-12345 affects ssl3_get_record",
"Version changed: 3.0.9-1 -> 3.0.9-1+deb12u3",
"Patch verified via CFG match: 97% confidence",
"Reachable call paths: 3 -> 0 after patch",
"DSSE attestation present",
"Verdict: risk_down (-0.27)"
]
}
}
],
"summary": {
"packagesChanged": 1,
"packagesAdded": 0,
"packagesRemoved": 0,
"symbolsChanged": 1,
"bytesChanged": 2048,
"trustDelta": -0.27,
"overallVerdict": "risk_down"
},
"analyzedAt": "2026-01-12T14:30:00.000Z",
"algorithmVersion": "1.0"
}
Serialization Rules
Determinism Requirements
- Key ordering: Object keys must be sorted alphabetically
- Array ordering:
deltas: Sorted by purl (lexicographic)
symbols: Sorted by symbolName (lexicographic)
bytes: Sorted by offset (numeric ascending)
proofSteps: Preserve generation order
- Number formatting: No trailing zeros, no exponent notation
- String escaping: Minimal escaping per RFC 8785
- Timestamps: ISO 8601 with milliseconds, UTC (
Z suffix)
RFC 8785 Compliance
All JSON output must conform to RFC 8785 (JSON Canonicalization Scheme) for digest computation.
Validation
JSON Schema
The formal JSON Schema is available at:
Validation Command
Required Fields
The following fields are required for a valid trace:
schema
subject.imageRef
subject.fromDigest
subject.toDigest
deltas (may be empty array)
summary.* (all summary fields)
analyzedAt
CycloneDX Integration
Embedded Mode
When embedded in CycloneDX, the change trace is attached as a component-evidence extension:
Standalone Mode
Export as separate file: <basename>.cdxchange.json
Version History
| Version |
Date |
Changes |
| 1.0.0 |
2026-01-12 |
Initial release |
References
Document Version: 1.0.0
Last Updated: 2026-01-12