CAN DEMİR GIF 0.8.22 — RUNTIME CONTEXT SCHEMA FIX

This fixes a local encoder defect, not proven GIF acceptance. No real GIF comment has been created or independently
verified with this transport. On 2026-10-16 the user explicitly requested this
unverified experiment be published directly as an app update. Its display version
is 0.8.22 / code 40 because existing updaters require a numeric semantic version.
Release notes retain the unverified status and one-video/one-attempt limit.

0.8.22 handles applicationState (field 35), connectionType (61), effective
connection type (94), internalGeo (34), and request.attestationResponseData (34).
The live public YouTube Kevlar request builder adds applicationState after the
initial page context has loaded. The old encoder rejected this normal field.
The prior anonymous read check only used the initial page context, so missed it.
The user's report did not include the exact unsupported field; this reproducible
defect explains a failure path but is not proof it was the sole issue on device.

Sources: current public Kevlar/player bundles recorded in schema-20261016;
yt-dlp-ytse client_info.py blob b7b65a179240d45f296bea905ae801641bc186b4;
YouTube.js request_info.proto and attestation_response_data.proto at commit
3276daa6310031e3621ff26992816f0bf3a40722. CONN_WIRED is 30 in the current public
YouTube bundle, not the older unconfirmed value 13. Attestation enum numbers are
from public player 0229cd64. Only original challenge/response/error values are
forwarded; no integrity response, client identity or access permission is invented.
Unknown fields still stop before I/O. Diagnostics include at most eight field
paths, never their values, raw parameters, comment text, headers or tokens.

0.8.21 fixes the local test guard and failure UI. Unknown opaque params no
longer imply a wrong video. The exact server-provided params are retained;
a positively decoded different video still blocks. Picker and transport share
one page URL parser. Local preflight failures return a marked local 412 to
settle the page request, never an invented YouTube success. Diagnostics stay
HTTP 0 / attempts 0, and the native app shows a terminal failure dialog.
The user's previous report did not include the two video IDs, so its exact
branch cannot be reconstructed. The new diagnostic includes only those public
IDs, not raw opaque params, comment text, credentials or account identifiers.

Hypothesis: the JSON and protobuf request parsers may treat the optional GIF field
differently. This is a serialization comparison, not proof of an authentication or
feature-access workaround. The real browser client name/version, original headers,
account context, rollout data and opaque createCommentParams are retained. No
Google credentials are synthesized, copied from another client or exported.

Scope: one new comment on YJqo89sa6iw, initiated by the user's native YouTube button.
No edit, reply, other video, XHR transport, automatic retry or JSON fallback.
The one-use marker is stored on the same YouTube origin. Clearing site data can
reset it; this is an accident-prevention guard, not an access-control mechanism.
No public comment is automatically created by installing or opening the APK.

Schema sources:
- LuanRT/YouTube.js: protos/youtube/api/pfiinnertube/innertube_context.proto,
  client_info.proto, request_info.proto and user_info.proto.
- coletdjnz/yt-dlp-ytse commit 8bf27253b52753242ad9f7eb7b63115d61ce46e4:
  yt_dlp_plugins/extractor/_ytse/protos/innertube/client_info.py.
  Its MIT notice is included as PROTO-SCHEMA-LICENSE.txt.
- Static original YouTube 21.41.525 Lbgfw request descriptor: context 1,
  params 2, comment text 3, optional string 32 (presence bit 3).
  Lbeaf.n -> Laljc.K -> Lbgfw.h is the field-32 command path.
- mabinewb/revanced-gif-comments commit e5b73a5adbada7636a556871ba179c1eff24a1ed
  uses field 32 for Tenor. Its October 14 user-success report is unverified here.
  Field-32's Tenor meaning is still an inference, not a captured successful request.
  Previous local field-27 inference is not used by this experiment.

Explicit limitations:
- client.platform and client.mainAppWebInfo are omitted presentation hints because
  their published enum mappings are unconfirmed. No enum value is invented.
- Unknown fields and nonempty consistencyTokenJars stop the request before I/O.
  They are never silently removed, guessed or sent through the previous JSON path.
- Native theme/form-factor enum values were compared to the original APK. In
  particular DARK is 2, unlike the older YouTube.js proto's value 0.
- A successful read request does not establish authenticated comment acceptance.
- HTTP 200 is not GIF success. Independent read of the actual comment and animated
  attachment is required; a text link or old attachment cannot prove replacement.

Validation artifacts: D:/mercia3/artifacts/can-demir-gif/binary-route-20261016/
Release publication artifacts: D:/mercia3/artifacts/can-demir-gif/release-0.8.22/.
The prior 0.8.19 source, APKs and deployment remain available for recovery.
