2026-07-30 10:52:41 -04:00
{
"fixture_version" : 1 ,
2026-07-31 15:23:30 -04:00
"manifest_revision" : 3 ,
2026-07-30 10:52:41 -04:00
"description" : "Cross-platform conformance cases for settings resolution. Every case runs against the shipped manifest in this directory: definitions are referenced by key, never restated, so an expectation can only be satisfied by resolving the real contract. Each platform's resolver (Go in internal/settingsresolve, TypeScript in web/src/lib/settingsResolve.ts, Kotlin and Swift in the client repos) runs every case through a hand-written runner; a runner must fail on any fixture field it does not know, because schema drift in the fixture itself is drift. A case's constraint_bindings attach a constraint to a copy of a real definition so constraint semantics stay testable even while no shipped definition carries that constraint kind. In expected entries, constrained:true requires stored_value and constraint_kind to be present, and stored_value may be null to mean the authored value was JSON null." ,
"cases" : [
{
"name" : "resolution_order_series_wins" ,
"description" : "The full ladder: with values stored at every scope a content key allows, profile_series beats profile_library, profile_device, and profile." ,
"keys" : [ "playback.subtitle_language" ],
"context" : {
"profile_id" : "p1" ,
"device_id" : "d1" ,
"library_ids" : [ 7 ],
"series_ids" : [ "s-101" ]
},
"stored" : [
{ "key" : "playback.subtitle_language" , "scope" : "profile" , "profile_id" : "p1" , "value" : "en" },
{
"key" : "playback.subtitle_language" ,
"scope" : "profile_device" ,
"profile_id" : "p1" ,
"device_id" : "d1" ,
"value" : "de"
},
{
"key" : "playback.subtitle_language" ,
"scope" : "profile_library" ,
"profile_id" : "p1" ,
"library_id" : 7 ,
"value" : "fr"
},
{
"key" : "playback.subtitle_language" ,
"scope" : "profile_series" ,
"profile_id" : "p1" ,
"series_id" : "s-101" ,
"value" : "ja"
}
],
"expected" : [
{ "key" : "playback.subtitle_language" , "value" : "ja" , "source" : "profile_series" }
]
},
{
"name" : "resolution_order_library_beats_device" ,
"description" : "Without a series row, the library row wins over the device and profile rows." ,
"keys" : [ "playback.subtitle_language" ],
"context" : {
"profile_id" : "p1" ,
"device_id" : "d1" ,
"library_ids" : [ 7 ],
"series_ids" : [ "s-101" ]
},
"stored" : [
{ "key" : "playback.subtitle_language" , "scope" : "profile" , "profile_id" : "p1" , "value" : "en" },
{
"key" : "playback.subtitle_language" ,
"scope" : "profile_device" ,
"profile_id" : "p1" ,
"device_id" : "d1" ,
"value" : "de"
},
{
"key" : "playback.subtitle_language" ,
"scope" : "profile_library" ,
"profile_id" : "p1" ,
"library_id" : 7 ,
"value" : "fr"
}
],
"expected" : [
{ "key" : "playback.subtitle_language" , "value" : "fr" , "source" : "profile_library" }
]
},
{
"name" : "resolution_order_device_beats_profile" ,
"description" : "Without content rows, the device override wins over the profile fallback even though the context names a library and a series." ,
"keys" : [ "playback.subtitle_language" ],
"context" : {
"profile_id" : "p1" ,
"device_id" : "d1" ,
"library_ids" : [ 7 ],
"series_ids" : [ "s-101" ]
},
"stored" : [
{ "key" : "playback.subtitle_language" , "scope" : "profile" , "profile_id" : "p1" , "value" : "en" },
{
"key" : "playback.subtitle_language" ,
"scope" : "profile_device" ,
"profile_id" : "p1" ,
"device_id" : "d1" ,
"value" : "de"
}
],
"expected" : [
{ "key" : "playback.subtitle_language" , "value" : "de" , "source" : "profile_device" }
]
},
{
"name" : "resolution_order_profile_alone" ,
"description" : "A profile row alone resolves at profile scope." ,
"keys" : [ "playback.subtitle_language" ],
"context" : {
"profile_id" : "p1" ,
"device_id" : "d1" ,
"library_ids" : [ 7 ],
"series_ids" : [ "s-101" ]
},
"stored" : [
{ "key" : "playback.subtitle_language" , "scope" : "profile" , "profile_id" : "p1" , "value" : "en" }
],
"expected" : [{ "key" : "playback.subtitle_language" , "value" : "en" , "source" : "profile" }]
},
{
"name" : "device_override_beats_profile_for_quality" ,
"description" : "playback.preferred_quality has no content scopes; its device override wins over the profile value." ,
"keys" : [ "playback.preferred_quality" ],
"context" : { "profile_id" : "p1" , "device_id" : "d1" },
"stored" : [
{
"key" : "playback.preferred_quality" ,
"scope" : "profile" ,
"profile_id" : "p1" ,
"value" : "720p"
},
{
"key" : "playback.preferred_quality" ,
"scope" : "profile_device" ,
"profile_id" : "p1" ,
"device_id" : "d1" ,
"value" : "1080p"
}
],
"expected" : [
{ "key" : "playback.preferred_quality" , "value" : "1080p" , "source" : "profile_device" }
]
},
{
"name" : "missing_device_identity_drops_device_scope" ,
"description" : "A caller with no device identity must not see a device override; the profile row answers instead. This is the anonymous jellycompat seed: a device row leaking here hands one device's settings to every client." ,
"keys" : [ "playback.subtitle_language" ],
"context" : { "profile_id" : "p1" },
"stored" : [
{ "key" : "playback.subtitle_language" , "scope" : "profile" , "profile_id" : "p1" , "value" : "en" },
{
"key" : "playback.subtitle_language" ,
"scope" : "profile_device" ,
"profile_id" : "p1" ,
"device_id" : "d1" ,
"value" : "de"
}
],
"expected" : [{ "key" : "playback.subtitle_language" , "value" : "en" , "source" : "profile" }]
},
{
"name" : "foreign_identity_rows_never_resolve" ,
"description" : "Rows for another profile, another device, or another series must not resolve just because a batched read returned them; the answer falls to the contract default." ,
"keys" : [ "playback.subtitle_language" ],
"context" : { "profile_id" : "p1" , "device_id" : "d1" , "series_ids" : [ "s-101" ] },
"stored" : [
{ "key" : "playback.subtitle_language" , "scope" : "profile" , "profile_id" : "p2" , "value" : "xx" },
{
"key" : "playback.subtitle_language" ,
"scope" : "profile_device" ,
"profile_id" : "p1" ,
"device_id" : "d2" ,
"value" : "yy"
},
{
"key" : "playback.subtitle_language" ,
"scope" : "profile_series" ,
"profile_id" : "p1" ,
"series_id" : "s-other" ,
"value" : "zz"
}
],
"expected" : [{ "key" : "playback.subtitle_language" , "value" : null , "source" : "default" }]
},
{
"name" : "absent_values_resolve_to_contract_defaults" ,
"description" : "Nothing stored resolves to each definition's default_value with source \"default\": enum, boolean, integer, and nullable language tag." ,
"keys" : [
"playback.subtitle_mode" ,
"playback.show_forced_subtitles" ,
"playback.next_up_prompt_seconds" ,
"playback.audio_language"
],
"context" : { "profile_id" : "p1" , "device_id" : "d1" },
"expected" : [
{ "key" : "playback.subtitle_mode" , "value" : "auto" , "source" : "default" },
{ "key" : "playback.show_forced_subtitles" , "value" : true , "source" : "default" },
{ "key" : "playback.next_up_prompt_seconds" , "value" : 30 , "source" : "default" },
{ "key" : "playback.audio_language" , "value" : null , "source" : "default" }
]
},
{
"name" : "batch_resolves_each_key_independently" ,
"description" : "One batch, three keys, three different sources: a device override, a profile value, and a default." ,
"keys" : [
"playback.preferred_quality" ,
"playback.subtitle_mode" ,
"playback.audio_language"
],
"context" : { "profile_id" : "p1" , "device_id" : "d1" },
"stored" : [
{
"key" : "playback.preferred_quality" ,
"scope" : "profile_device" ,
"profile_id" : "p1" ,
"device_id" : "d1" ,
"value" : "1080p"
},
{ "key" : "playback.subtitle_mode" , "scope" : "profile" , "profile_id" : "p1" , "value" : "always" }
],
"expected" : [
{ "key" : "playback.preferred_quality" , "value" : "1080p" , "source" : "profile_device" },
{ "key" : "playback.subtitle_mode" , "value" : "always" , "source" : "profile" },
{ "key" : "playback.audio_language" , "value" : null , "source" : "default" }
]
},
{
"name" : "ceiling_caps_stored_quality_and_reports_the_stored_value" ,
"description" : "The manifest binds playback.preferred_quality to the max_playback_quality ceiling. A stored 2160p over a 1080p cap resolves to 1080p while the authored value survives, reported as stored_value with constrained:true." ,
"keys" : [ "playback.preferred_quality" ],
"context" : { "profile_id" : "p1" },
"stored" : [
{
"key" : "playback.preferred_quality" ,
"scope" : "profile" ,
"profile_id" : "p1" ,
"value" : "2160p"
}
],
"constraints" : { "max_playback_quality" : "1080p" },
"expected" : [
{
"key" : "playback.preferred_quality" ,
"value" : "1080p" ,
"source" : "profile" ,
"constrained" : true ,
"stored_value" : "2160p" ,
"constraint_kind" : "ceiling"
}
]
},
{
"name" : "ceiling_leaves_quality_under_the_cap_alone" ,
"description" : "A value at or under the cap passes through untouched and is not reported as constrained." ,
"keys" : [ "playback.preferred_quality" ],
"context" : { "profile_id" : "p1" },
"stored" : [
{
"key" : "playback.preferred_quality" ,
"scope" : "profile" ,
"profile_id" : "p1" ,
"value" : "720p"
}
],
"constraints" : { "max_playback_quality" : "1080p" },
"expected" : [{ "key" : "playback.preferred_quality" , "value" : "720p" , "source" : "profile" }]
},
{
"name" : "ceiling_ranks_auto_below_every_cap" ,
"description" : "The ordered enum lists \"auto\" first because it never exceeds a cap: even the lowest cap leaves it alone." ,
"keys" : [ "playback.preferred_quality" ],
"context" : { "profile_id" : "p1" },
"stored" : [
{
"key" : "playback.preferred_quality" ,
"scope" : "profile" ,
"profile_id" : "p1" ,
"value" : "auto"
}
],
"constraints" : { "max_playback_quality" : "480p" },
"expected" : [{ "key" : "playback.preferred_quality" , "value" : "auto" , "source" : "profile" }]
},
{
"name" : "ceiling_caps_original_as_the_highest_member" ,
"description" : "\"original\" is the uncapped source and ranks above every resolution, so any cap brings it down." ,
"keys" : [ "playback.preferred_quality" ],
"context" : { "profile_id" : "p1" },
"stored" : [
{
"key" : "playback.preferred_quality" ,
"scope" : "profile" ,
"profile_id" : "p1" ,
"value" : "original"
}
],
"constraints" : { "max_playback_quality" : "2160p" },
"expected" : [
{
"key" : "playback.preferred_quality" ,
"value" : "2160p" ,
"source" : "profile" ,
"constrained" : true ,
"stored_value" : "original" ,
"constraint_kind" : "ceiling"
}
]
},
{
"name" : "null_bitrate_is_unbounded_and_a_ceiling_caps_it" ,
"description" : "null on the nullable integer playback.max_bitrate_kbps means \"no cap of my own\", which is unbounded above. It has no numeric rank, so a resolver that compares it as equal lets the one value that most needs capping slip past; a ceiling must bring it down to the limit." ,
"keys" : [ "playback.max_bitrate_kbps" ],
"context" : { "profile_id" : "p1" },
"stored" : [
{ "key" : "playback.max_bitrate_kbps" , "scope" : "profile" , "profile_id" : "p1" , "value" : null }
],
"constraint_bindings" : [
{
"key" : "playback.max_bitrate_kbps" ,
"policy_input" : "max_bitrate_kbps" ,
"constraint" : "ceiling"
}
],
"constraints" : { "max_bitrate_kbps" : 8000 },
"expected" : [
{
"key" : "playback.max_bitrate_kbps" ,
"value" : 8000 ,
"source" : "profile" ,
"constrained" : true ,
"stored_value" : null ,
"constraint_kind" : "ceiling"
}
]
},
{
"name" : "default_null_bitrate_is_capped_by_a_ceiling" ,
"description" : "The contract default for playback.max_bitrate_kbps is null, so even with nothing stored a ceiling caps the resolved default; source stays \"default\" and the null is reported as stored_value." ,
"keys" : [ "playback.max_bitrate_kbps" ],
"context" : { "profile_id" : "p1" },
"constraint_bindings" : [
{
"key" : "playback.max_bitrate_kbps" ,
"policy_input" : "max_bitrate_kbps" ,
"constraint" : "ceiling"
}
],
"constraints" : { "max_bitrate_kbps" : 8000 },
"expected" : [
{
"key" : "playback.max_bitrate_kbps" ,
"value" : 8000 ,
"source" : "default" ,
"constrained" : true ,
"stored_value" : null ,
"constraint_kind" : "ceiling"
}
]
},
{
"name" : "floor_leaves_an_unbounded_bitrate_alone" ,
"description" : "The mirror rule: unbounded already satisfies any floor, so a floor must not touch a null numeric." ,
"keys" : [ "playback.max_bitrate_kbps" ],
"context" : { "profile_id" : "p1" },
"stored" : [
{ "key" : "playback.max_bitrate_kbps" , "scope" : "profile" , "profile_id" : "p1" , "value" : null }
],
"constraint_bindings" : [
{
"key" : "playback.max_bitrate_kbps" ,
"policy_input" : "min_bitrate_kbps" ,
"constraint" : "floor"
}
],
"constraints" : { "min_bitrate_kbps" : 8000 },
"expected" : [{ "key" : "playback.max_bitrate_kbps" , "value" : null , "source" : "profile" }]
},
{
"name" : "allowlist_falls_back_when_the_default_is_outside_the_list" ,
"description" : "With nothing stored, catalog.metadata_language resolves to its default null, which is outside the allowlist. The fallback is the first allowed member — not the definition default, which is exactly the value the policy forbids." ,
"keys" : [ "catalog.metadata_language" ],
"context" : { "profile_id" : "p1" },
"constraint_bindings" : [
{
"key" : "catalog.metadata_language" ,
"policy_input" : "allowed_metadata_languages" ,
"constraint" : "allowlist"
}
],
"constraints" : { "allowed_metadata_languages" : [ "en" , "fr" ] },
"expected" : [
{
"key" : "catalog.metadata_language" ,
"value" : "en" ,
"source" : "default" ,
"constrained" : true ,
"stored_value" : null ,
"constraint_kind" : "allowlist"
}
]
},
{
"name" : "allowlist_replaces_a_forbidden_choice" ,
"description" : "A stored value outside the allowlist is replaced by the first allowed member, with the authored choice preserved as stored_value." ,
"keys" : [ "catalog.metadata_language" ],
"context" : { "profile_id" : "p1" },
"stored" : [
{ "key" : "catalog.metadata_language" , "scope" : "profile" , "profile_id" : "p1" , "value" : "ja" }
],
"constraint_bindings" : [
{
"key" : "catalog.metadata_language" ,
"policy_input" : "allowed_metadata_languages" ,
"constraint" : "allowlist"
}
],
"constraints" : { "allowed_metadata_languages" : [ "en" , "fr" ] },
"expected" : [
{
"key" : "catalog.metadata_language" ,
"value" : "en" ,
"source" : "profile" ,
"constrained" : true ,
"stored_value" : "ja" ,
"constraint_kind" : "allowlist"
}
]
},
{
"name" : "allowlist_passes_a_permitted_choice" ,
"description" : "A stored value inside the allowlist passes through untouched." ,
"keys" : [ "catalog.metadata_language" ],
"context" : { "profile_id" : "p1" },
"stored" : [
{ "key" : "catalog.metadata_language" , "scope" : "profile" , "profile_id" : "p1" , "value" : "fr" }
],
"constraint_bindings" : [
{
"key" : "catalog.metadata_language" ,
"policy_input" : "allowed_metadata_languages" ,
"constraint" : "allowlist"
}
],
"constraints" : { "allowed_metadata_languages" : [ "en" , "fr" ] },
"expected" : [{ "key" : "catalog.metadata_language" , "value" : "fr" , "source" : "profile" }]
},
2026-07-31 15:23:30 -04:00
{
"name" : "metadata_language_exceptions_resolve_as_one_object" ,
"description" : "The original-language exception map is a single profile-scoped value; resolution preserves every source-to-target entry together." ,
"keys" : [ "catalog.metadata_language_overrides" ],
"context" : { "profile_id" : "p1" },
"stored" : [
{
"key" : "catalog.metadata_language_overrides" ,
"scope" : "profile" ,
"profile_id" : "p1" ,
"value" : { "ja" : "en" , "no" : "x-silo-original" }
}
],
"expected" : [
{
"key" : "catalog.metadata_language_overrides" ,
"value" : { "ja" : "en" , "no" : "x-silo-original" },
"source" : "profile"
}
]
},
2026-07-30 10:52:41 -04:00
{
"name" : "locked_replaces_a_differing_choice" ,
"description" : "locked is total: the policy value replaces the user's outright, and the authored choice is preserved as stored_value so it takes effect the day the lock lifts." ,
"keys" : [ "playback.subtitle_mode" ],
"context" : { "profile_id" : "p1" },
"stored" : [
{ "key" : "playback.subtitle_mode" , "scope" : "profile" , "profile_id" : "p1" , "value" : "off" }
],
"constraint_bindings" : [
{
"key" : "playback.subtitle_mode" ,
"policy_input" : "forced_subtitle_mode" ,
"constraint" : "locked"
}
],
"constraints" : { "forced_subtitle_mode" : "always" },
"expected" : [
{
"key" : "playback.subtitle_mode" ,
"value" : "always" ,
"source" : "profile" ,
"constrained" : true ,
"stored_value" : "off" ,
"constraint_kind" : "locked"
}
]
},
{
"name" : "locked_leaves_an_equal_value_unconstrained" ,
"description" : "A stored value already equal to the lock is not a narrowing: it passes through with no constrained flag, so clients do not tell the user their own choice was overridden." ,
"keys" : [ "playback.subtitle_mode" ],
"context" : { "profile_id" : "p1" },
"stored" : [
{
"key" : "playback.subtitle_mode" ,
"scope" : "profile" ,
"profile_id" : "p1" ,
"value" : "always"
}
],
"constraint_bindings" : [
{
"key" : "playback.subtitle_mode" ,
"policy_input" : "forced_subtitle_mode" ,
"constraint" : "locked"
}
],
"constraints" : { "forced_subtitle_mode" : "always" },
"expected" : [{ "key" : "playback.subtitle_mode" , "value" : "always" , "source" : "profile" }]
},
{
"name" : "locked_replaces_the_contract_default" ,
"description" : "With nothing stored, the lock replaces even the contract default: source stays \"default\" and the default is reported as stored_value, exactly like a capped default." ,
"keys" : [ "playback.subtitle_mode" ],
"context" : { "profile_id" : "p1" },
"constraint_bindings" : [
{
"key" : "playback.subtitle_mode" ,
"policy_input" : "forced_subtitle_mode" ,
"constraint" : "locked"
}
],
"constraints" : { "forced_subtitle_mode" : "always" },
"expected" : [
{
"key" : "playback.subtitle_mode" ,
"value" : "always" ,
"source" : "default" ,
"constrained" : true ,
"stored_value" : "auto" ,
"constraint_kind" : "locked"
}
]
},
{
"name" : "subtitle_appearance_ignores_content_scopes" ,
"description" : "playback.subtitle_appearance resolves profile_device then profile only. With a library and a series in the context, the device row still wins — and the sparse device object replaces the profile object outright rather than merging with it." ,
"keys" : [ "playback.subtitle_appearance" ],
"context" : {
"profile_id" : "p1" ,
"device_id" : "d1" ,
"library_ids" : [ 7 ],
"series_ids" : [ "s-101" ]
},
"stored" : [
{
"key" : "playback.subtitle_appearance" ,
"scope" : "profile" ,
"profile_id" : "p1" ,
"value" : { "fontSize" : "medium" , "fontColor" : "#ffcc00" }
},
{
"key" : "playback.subtitle_appearance" ,
"scope" : "profile_device" ,
"profile_id" : "p1" ,
"device_id" : "d1" ,
"value" : { "fontSize" : "xxlarge" , "position" : "top" }
}
],
"expected" : [
{
"key" : "playback.subtitle_appearance" ,
"value" : { "fontSize" : "xxlarge" , "position" : "top" },
"source" : "profile_device"
}
]
},
{
"name" : "subtitle_appearance_falls_to_profile_without_device" ,
"description" : "Without a device identity the profile's appearance object answers, unmerged." ,
"keys" : [ "playback.subtitle_appearance" ],
"context" : { "profile_id" : "p1" },
"stored" : [
{
"key" : "playback.subtitle_appearance" ,
"scope" : "profile" ,
"profile_id" : "p1" ,
"value" : { "fontSize" : "medium" , "fontColor" : "#ffcc00" }
},
{
"key" : "playback.subtitle_appearance" ,
"scope" : "profile_device" ,
"profile_id" : "p1" ,
"device_id" : "d1" ,
"value" : { "fontSize" : "xxlarge" , "position" : "top" }
}
],
"expected" : [
{
"key" : "playback.subtitle_appearance" ,
"value" : { "fontSize" : "medium" , "fontColor" : "#ffcc00" },
"source" : "profile"
}
]
}
]
}