JSON-LD 1.1 processor conformance

EARL conformance report for PHP-JSON-LD v2.2.1, against the JSON-LD 1.1 API and Framing test manifests.

Assertions
1275
Passed
1262
Failed
13
Report
php-json-ld-earl.ttl (Turtle)
Generated
2026-10-30 09:29 UTC

Every test appears as one earl:Assertion, across expansion, compaction, flattening, toRdf, fromRdf and framing.

Tests the harness skips are the expected-failure list, and they are reported here as earl:failed rather than omitted. A report has to reflect conformance, not suite greenness — a skipped test is a test that does not pass, and presenting it as anything else would over-claim.

What is failing

Every failure below, and why. The reasons come from the harness's expected-failure list, which gates CI in both directions: an unlisted failure fails the build, and so does a listed one that starts passing.

TestKindWhy it fails
Expansion
#t0122 non-normative a keyword-form (@-) IRI as a node @id is dropped along with its node, but the fixture keeps the property with `{"@id": null}` (itself invalid JSON-LD per the test note). Low value.
#tc032 negative test an embedded context that is never used is not evaluated, so its "invalid scoped context" error is not raised (lazy scoped-context evaluation).
#tc033 negative test an unused context carrying an embedded-context error is not evaluated, so its error is not raised (lazy scoped-context evaluation).
#ter56 negative test defining a term named @context is not rejected as keyword redefinition. A naive throw conflates with a remote context DOCUMENT ({"@context": …}); the fix must unwrap remote contexts first (breaks #t0127/#te127 otherwise), so it is not a one-liner.
Serialize to RDF
#tc032 negative test an embedded context that is never used is not evaluated, so its "invalid scoped context" error is not raised (lazy scoped-context evaluation).
#tc033 negative test an unused context carrying an embedded-context error is not evaluated, so its error is not raised (lazy scoped-context evaluation).
#ter56 negative test defining a term named @context is not rejected as keyword redefinition. The fix must first unwrap remote context DOCUMENTS ({"@context": …}) or it breaks #t0127/#te127, so it is not a one-liner.
#tjs10 positive JSON-literal structural canonicalization differs (PHP json_decode cannot distinguish {} from []).
RDF to JSON-LD
#tdi11 non-normative rdfDirection=compound-literal blank-node folding is not implemented.
#tdi12 non-normative rdfDirection=compound-literal blank-node folding is not implemented.
#tli03 positive nested list-of-lists conversion requires inner lists to collapse before the outer chain consumes their heads; single-level lists are fully supported.
Framing
#t0045 positive a value-pattern keeps the matched value verbatim with @language "R", but the fixture lower-cases it to "r"; expansion intentionally preserves @language case (the toRdf bytes VC signs depend on it).
#t0059 positive @embed:@last (the legacy 1.0 last-embed-wins mode) is not implemented; the default @once is.