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.
| Test | Kind | Why 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. |