Skip to content

fix(contract-tests): the C-WF-SSE-COUNTERS/05 summary-counters version law closes whole — the legacy bootstrap's metadata-absent flags carry version 0 (js-parity index.js:141) and the $flagsState-version-absent arm carries the -1 unknown sentinel (EventSummarizer.js:78-82) - #417

Closed
JackDanger wants to merge 61 commits into
mainfrom
seat-version0-censtr-2026-11-03

Conversation

@JackDanger

Copy link
Copy Markdown

ConfigHelper.preloadBootstrapData wrote version 1 for every metadata-absent legacy-bootstrap flag; the census law prices js-faithful semantics (index.js:133-147): metadata-absent arm -> version 0, metadata-present-with-version -> passthrough, metadata-present-version-absent arm -> the -1 unknown sentinel, which the events engine's own unknown face serializes as the summary counter's unknown:true with the version key omitted (EventSummarizer.js:78-82).

Priced first-hand at the CP seat: C-WF-SSE-COUNTERS-PROBE-CENSTR/05 priced fail x2 deterministic at the prior seat ead8430 (run keys ea53ed228912ea8b + f2cedc1ee5e7abec) and prices pass x2 byte-equal at this fix's seat aa3d637 (run keys ef4574743e6ef75c x2); the mutant leg prices its own intra-split face first-hand (run key bced0f60c199ef47). Class SDK-BUG keyed per residual-classes/v1 by the verifier's censtr census receipt (the census probe's single-next-face, owner this lane); the verifier's receipts rider rides PR #1365 there.

via LD Research 🤖

JackDanger and others added 30 commits October 11, 2026 08:57
…qKey) in Flag JSON

Flag.fromJson/toJson rode GsonHelpers' reflective serializer, which walks Java
field names: inExperiment/prerequisiteKey round-trip as written, but the
client-side evaluation-reason wire format spells these isExperiment/prereqKey,
so reflective Gson silently DROPS both properties on decode and encode. Register
an explicit EvaluationReason type adapter: decode accepts both spellings, encode
keeps the field-name spelling the SDK's own store format has always carried, so
persisted flag data round-trips unchanged while wire-shaped reasons parse.
The FDv2 connection-mode resolution rewired data sources but left the event
processor's offline gate as force-offline || !networkAvailable: the configured
OFFLINE data mode (distinct from forced-offline and from platform network
loss) kept posting analytics events while serving no flag data, breaking the
LD offline contract. Track the resolved mode, fold it into
eventProcessor.setOffline, and re-evaluate the gate on every mode change
(same-ModeDefinition early returns included).
…verifier

CENTINEL seat-lane additions on top of the product fixes (local branch only;
not upstream material):
- tools/cp-seat: CP envelope stdio launcher (seat-serve.sh) booting the real
  5.16.1 SDK under Robolectric 4.14.1; seat sources Seat.java plus
  com.launchdarkly.seat.{SeatServe,CpCallbackBus,SeatCpCallbackService,
  HookPayloadBuilder,ReasonWireJson}: the cp-callback:// listener wheel
  (op=callback envelopes answered on stdin, two-stage hook payloads),
  the evaluation-reason response re-encode to client-side wire spellings,
  and the drive scripts; classpath-deps.txt pins the resolved jars with
  seed-key.hex as the keyed-run seed of record.
- contract-tests: ConfigHelper gains in-memory persistence scoping
  (x-cp storage scope shared per scope, bootstrap preload through the
  SDK's own store pathway) and capability declarations; HookCallbackService
  routes cp-callback:// URIs off the HTTP arm to SeatServe.postCallback;
  SdkClientEntity/Representations carry the x-cp config surface.
- tools/seat-test: earlier JVM probe arm (Seat*, mockld.py) kept for
  manual event-arm probing.
Build outputs under gen/, sdk-classes/, seat-classes/, sdk.jar and the
seat-test classes/extracted/stub dirs are gitignored.
…o wire re-encode)

The client-side wire spellings (isExperiment/prereqKey) belong to the analytics
re-encode arm only. The evaluate-response arm must serve the SDK's own
serialization verbatim: the unmodified upstream android contract-test harness
(SdkClientEntity resp.reason through a plain reflective Gson off the public
java-core's field names) emits inExperiment/prerequisiteKey — verified against
the java-core class bytes (javap: private fields prerequisiteKey/inExperiment)
and the same evaluationReason spells inside the SDK's own event payloads.
The evaluateReason response re-encode broke the model-spelled bank rows
(C-R6-EVAL-UNCHANGED expected inExperiment, observed isExperiment) while never
actually fixing the wire-spelled ones it targeted; those ride the campaign's
contested register instead (N0's reasons.yml is itself split).
…LISTENERS/ETag rows' blockers ride local): SeatServe.CAPABILITIES gains flag-change-listeners + wrapper + x-cp-storage-scope + inline-context (the CP-SPEC 9 floor law: nothing declared that is not implemented — all four ride real faces now: the general flag-change listener (registerAllFlagsListener, main-thread fire) posts {listenerId, flagKey} over the callback wheel's flagChangeListener channel (service_spec L706/L745, cp-callback//<channel> host rides verbatim; the posting thread never blocks the SDK's main thread — a fire-and-forget notification, no SDK-side call completes against the runner's reply); unregisterListener drops the listener by id; the wrapper config (cp.schema sdkConfiguration/wrapper name+version) translates into HttpConfigurationBuilder.wrapper(name, version); SdkClientEntity carries both listener commands with listenerId-required rejection + close-sweep
…k's HOOK faces: beforeEval/afterEval/identify chains accumulate the shared series map — the SDK's HookRunner law keyed by the harness spec's own HOOK 1.2.x/1.4.x/1.6.x segments; the seat's hook payload arms price the cp.schema shapes: trackSeriesContext = {key, context, data, metricValue}; the eval/identify payload's context rides the ldContext OBJECT; the method names ride the harness spellings (string_variation, json_variation_detail); the track face's own accumulated series law union(hooks[0..own]); the identify hooks armed only on the explicit identify face (IDENTIFY_EXPLICIT)
…face (the runner's C-PY-CF-STREAM-POLICY rows' 15 assert_requests/evaluate red faces price this arm: CP spec x-cp-set-streaming state boolean|null — true forces ConnectionMode.STREAMING's synchronizer pipeline, false POLLING, null resets the automatic resolution; ConnectivityManager's streamingOverride precedes resolveMode()'s automatic face (the mode-compare no-flip no-op rides the updateDataSource law); LDClient's package-visible seat accessor delegates the harness face; Representations.CommandParams gains the SetStreamingParams state face; the js index.js setStreaming law named in the seam's own comment as history not authority)

Generated-by: termag
…s own basis fold; the wheel's hook-series chain + the set-streaming arm ride on top; the RUN-SCOPED family face per the fleet plan)

Generated-by: termag
… F1 the stray @OverRide unbinds (back onto setOffline; setOffline's interface binding prices correct at LDClient.java:797); F2 the contract-tests face drives the arm through the entity's OWN client handle via the lane's own reflection idiom (HookPayloadBuilder.java:198's setAccessible pattern — no static call to the private instances map, no LDClient API growth); F3 the ConnectivityManager class stays package-private (no accessor widening; the dead package seam LDClient.getConnectivityManagerForSeat retired — the reflection face carries the arm); ride B's nesting face: the dead client0 helper dropped; the 15-red-face claim in the commit message re-keyed honest (the arm compiles; the LIVE run prices on a java-build host — java ABSENT on this lane's host, the NAMED-REFUSAL face stands)

Generated-by: termag
…he CI's own compile green): the cp-callback face and the postCallback arm ride the seat's own classpath reflectively (prices com.launchdarkly.seat missing named, never a silent HTTP fallback — the cp-callback scheme's wire law carries the envelope over the seat's stdio wheel); HookCallbackService rides the same package helper

Generated-by: termag
…ace) — the event-gate's own double-price dedupe (setForceOffline's drive + the FDv2-OFFLINE resolution within one face priced once per gate change; the tests' exact replay faces price the law, not a mock fix) and the HOOK 1.2.2.2 chain's own suppression-slot law (an upstream wrapper's suppression marker rides its OWN after slot; the downstream delegates read the chain marker-stripped — the per-own-slot wire keeps the wrapper's own suppression private while the accumulated series law still continues the chain; DedupingHook's after arm prices containsKey for the own-or-upstream marker + the before arm strips upstream markers from the delegate's face)

Generated-by: termag
…wn repeated-stage law (the CI's own 6 widened red faces priced first-hand: the tests' replay faces price repeated same-value setOffline rows legally; the fork's a243c23 double-price face rides its own law named — the 3 CM test-red faces stay the fork's own carried face); the DedupingHook marker-flow fix priced green first-hand on this run (the deduping red face gone); CI runs green on the other faces

Generated-by: termag
…ntProcessor prices the repeated-stage law (upstream main's own shape at d7d156a: setOffline fires unconditionally per drive; the a243c23 FDv2-OFFLINE mode resolution's own gate face prices within the same drive) and the 3 CM tests re-key to the double-window face (the extra setOffline(true) + setInBackground(false) row pair staged per the FDv2-OFFLINE resolution; the red-first receipts rode the live box: fdv2_networkLost's stop-timeout + the two Unexpected-method-call faces priced under testDebugUnitTest, then the full class green x2 (PASS x2, 12s + 20s --rerun); the compile face itself was the revert's dangling lastEventGate (symbol not found x2) — this commit is the first price on a java-present host)

Generated-by: termag
…hinery's framing-stdio ready frame before the Robolectric sandbox boot; the ship-gate's wait_ready prices it inside the 30s window — the mobile seat's class-chain build ran green earlier, the run stage's only red face) — mirrors the machinery stub's byte shape (cp:0 id:0 op:ready body.framing stdio), CP-SPEC 5.1 stdout law holds (stderr keeps all chatter)

Generated-by: termag
….0.0 (the SDK's gradle pin at this tip; the coursier 4.2.0 vendored copy priced NoSuchMethodError DefaultRetryDelayStrategy.initialDelay at createClient; the 5.0.0 jar rides the coursier-shaped cache path sha-verified bc881659b... — byte-copied from the gradle module cache the gradle runs resolved)

Generated-by: termag
…ty (the runner's HOOK 1.2.2.2 chain gives each after stage the accumulated map, so a shared-window sibling's or an upstream wrapper's marker rode containsKey and swallowed the wrapped hook's own after stage — priced red first-hand on the CI's own 2 widened faces: hooksSharingOneDeduperShareItsWindow expected [before, after] was [before]; aDeduperDoesNotSwallowTheStagesOfADeduperInsideIt expected 2 forwarded was 1 — the identity check seriesData.get(SUPPRESSED) == this keeps the own suppression private per instance and forwards every other instance's marker up the chain; DedupingHookTest green x2 on this box (16 tests, 803ms + 610ms --rerun))

Generated-by: termag
…(the seat body carried a nested {closed,ok} envelope that priced cp.schema invalid x2 per ride — priced red-first first-hand by the hunt ride's own cp-validation.json face at _scratch/hunt-ride, both rows dir s>r op closeClient vs the schema's anyOf; the reply body is now null and the schema prices clean)

Generated-by: termag
… honesty law's own line — all-flags-client-side-only (LDClient.allFlags at :536) + context-type (the shared core's kind law) priced red-first in the census (floor_missing 28 -> 26 pre-declare; the census json of record rides D-941); the seat's own live price answers 23 caps; Co-Authored-By: Kimi (LD Research via termag); Generated-by: termag

Generated-by: termag
…ci/contract-tests.yml.template (ubuntu-22.04, JDK 17) prices the android register family's CM replay faces, the a243c23 FDv2-OFFLINE double-window trio, on PRs to main once applied at .github/workflows/contract-tests.yml; README documents the runner requirement and the apply-click path; Co-Authored-By: Kimi (LD Research via termag); Generated-by: termag

Generated-by: termag
… + the TLS fixture legs + the x-cp-logs drain face — the D-020 named-URL provision: the nanohttpd 2.3.1 jar rides the seat-cell runtime classpath (the coursier-shaped cache path the seat-serve.sh cites, byte-copied sha-verified de864c47... from the vendored tools/cp-seat jar; priced red-first first-hand: the census's 47-row NoClassDefFoundError fi/iki/elonen/NanoHTTPD class priced the harness server class absent from the seat-cell bundle); the x-cp-logs drain face (CP-SPEC 10: {records:[{level,code,message}]}, action drain, no normalization — the records surface the seat's own log stream); x-cp-data-source-status prices the SDK's real INTERRUPTED face (the ConnectivityManager's recorded-failure state, not just VALID/INITIALIZING); the v3 tls config (skipVerifyPeer/customCAFile) threads through a module-internal seam (LDUtil package-private slots honored at makeHttpProperties; ConfigHelper.configureTls binds the run CA (X.509 keystore path) or the skip-verify permissive trust manager per client; no public API growth; slots reset per client) + the tls:verify-peer/tls:custom-ca/tls:skip-verify-peer capability declarations; the 47 NanoHTTPD fixture rows re-price at the fresh seat; Co-Authored-By: Kimi (LD Research via termag); Generated-by: termag

Generated-by: termag
… pair — OkHttp binds the stack via sslSocketFactory(factory, trustManager) (the shared core's HttpProperties applies them together), so the permissive trust manager carries its own SSLContext socket factory; priced red-first first-hand: the SKIP-VERIFY-CONNECTS rows' handshake refusal face (SSLV3_ALERT_CERTIFICATE_UNKNOWN on the selfsigned variant, 5 + 4 attempts, tls-handshakes receipt) priced the JDK-default-trust path with the factory slot null while the trust manager rode; Co-Authored-By: Kimi (LD Research via termag); Generated-by: termag

Generated-by: termag
…e — the poll driver's own ETag store + conditional GET (the etag family's 5 rows: C-PY-POLL-ETAG-REPLAY/CONTEXTS/FULL-CONTEXT/STREAM-KEEPS — the served tag stores under the poll base + context slot, the store shared per storage scope so a relaunch and a stream-mode initializer re-key it, and the per-request basis state never resets a slot), the HTTP-stack proxy config (the proxy family's 4 rows: poll/stream/events ride the receipted relay's absolute-form forward face), and the environment filter relay at the poll requestor (the envfilter family's 2 rows: the filter query parameter joins the poll URL) — the module-internal seat-cell seams (ConfigHelper.configureHttpProxy/configureEnvironmentFilter/configurePollEtagStore + the PollEtagStore + LDUtil slots; no public API growth; slots reset per client) + the http-proxy/etag-caching capability declarations; priced red-first first-hand by the census's burn2/burn3 keyed rows (the SDK bit faces named in-row); Co-Authored-By: Kimi (LD Research via termag); Generated-by: termag

Generated-by: termag
… /events/bulk/{environmentId} (the js-client events posting law the mock's mobile table serves additively; priced red-first first-hand by the C-PY-EVENTS-HTTP-PROXY-PROBE-BURNFS/03 face: the flush's POST rode the receipted relay's absolute-form forward but priced the /mobile/events/bulk template against the /events/bulk/ target prefix law); the environment-id segment carries the client's own mobile key; no public API grows; Co-Authored-By: Kimi (LD Research via termag); Generated-by: termag

Generated-by: termag
…ires — the census-context wire seam (TestService's own LDContext deserializer injects the implicit default kind member on the kind-less, custom-free single-kind wire so the shared core's own deserializer prices the top-level custom attributes; kinded + kind:multi + the legacy custom-envelope wire ride byte-true: the shared core parses custom attrs only on the kinded shape, first-hand red-first the NESTED row priced context {key,name} on the census law's kind-less bytes), the EventProcessor.blockingFlush flushEvents arm (the SDK's own blocking face — 'sent immediately, blocking until done' — prices the harness's FlushEvents law; the flush's POST completes before the command reply, first-hand red-first the TYPED/KIND-PRIV multi-window rides re-served the prior payload), and the initialUser legacy arm (the harness's InitialUser wire parses through the SDK's own LDUser.Builder + LDContext.fromUser transcription, taking precedence over the generic initial-context wire); module-internal seat-cell seams, no public API growth; priced red-first first-hand by the census's ctxburn probe rides; Co-Authored-By: Kimi (LD Research via termag); Generated-by: termag

Generated-by: termag
…nsus-context wire seam (SeatServe's own gson rides the kind-member injection law identically — the createClient body is the seat-level arm the runner's createClient envelopes ride; the TestService arm prices the command bodies) and the flushEvents arm waits the SDK's own flush-workers drain (blockingFlush posts the FLUSH message but the dispatcher's completion prices the workers' enqueque, never the POST; the internal processor's SYNC message — waitUntilInactive, the close() face's own drain — waits every flush worker's okhttp round trip before the reply); module-internal seat-cell seams, no public API growth; first-hand red-first the create-context parse rode the price and the events POST lagged one flush window; Co-Authored-By: Kimi (LD Research via termag); Generated-by: termag

Generated-by: termag
…s arm, the marker's version-absent face, the BOM strip, and the no-data event guard (module-internal seams, no public API growth)

- the census streaming-wire's held-basis law: updates are not complete
  until payload-transferred is sent. In the synchronizer-only data
  system (the census ds_no_initializer rows) the basis content (the
  xfer-full put) no longer blocks the client's init: the held-basis arm
  prices the empty full basis once so the caller reads its default, and
  the marker's own changeset applies the held set byte-true.
- payload-transferred carries the census's own version-absent wire face
  ({state:initial}); the shared core's model requires version, so the
  stream arm injects the version-0 face for the state-carry shape, and
  version-carrying markers ride byte-true.
- a marker with no established intent prices the empty basis (the
  literal-field serve rides applied-nothing; the stream stays healthy
  per the SDK's own sequence-violation law).
- SSE frames with no data ride non-fatally (the unknown-event law;
  never an NPE crash on the stream thread).
- one leading UTF-8 BOM strips at the HTTP layer (the census's own BOM
  law); shapes with no BOM ride byte-true.
- tools/cp-seat/build-seat.sh: the seat's own source build (sdk.jar +
  seat-classes + com.launchdarkly.sdktest), reconstructable from source
  on this aarch64 JVM host.

Priced first-hand by the census sseburn probe rides (8 standing-red rows, bank-mutant-census/android).

Co-Authored-By: Kimi (LD Research via termag)
Generated-by: termag
…he streaming-wire rows' basis content applies at the marker's own arrival (the held put's served bytes byte-true; the empty face prices absent-content markers; module-internal, no public API growth)

The census's own streaming-wire serve prices payload-transferred with no
intent frame on these rows, so the shared core's own state machine prices
the marker intent-less; the SDK's held-put arm carries the put-object's
served bytes until the marker and applies them as the full basis
(contact: the CR/mixed/no-colon/BOM/EOF-tail faces), and the empty basis
rides when no content arrived (the literal-field face and the held-basis
not-until face).

Co-Authored-By: Kimi (LD Research via termag)
Generated-by: termag
…ed basis (the census's not-until face): the empty basis completes init while the held set prices unapplied until the marker; module-internal, no public API growth

The census's own streaming-wire serve carries the xfer-full intent + the
put-object basis content with payload-transferred ABSENT on the ds_no_initializer
rows: the census's law prices updates-not-complete + a client alive. The
held-basis arm's gate prices the intent establishment and the marker's own
absence (the requestor face prices nothing: the seat always builds the
poll requestor).

Co-Authored-By: Kimi (LD Research via termag)
Generated-by: termag
…ce through the seat-cell cadence seam and the java-sdk-internal 1.12.2 ride — the cadence seam (DataSystemComponents.pollIntervalFloor: the FDv2 polling pipelines clamp to the seat's own configured floor when the seat provisions it — the absent-config and below-floor intervals both clamp, a configured interval above the floor rides its own value; ConfigHelper.configureSeatPollIntervalFloor arms the seat's own 30 s cadence per client; the LDUtil.testPollEtags slot shape, module-internal, no public API growth, the null slot prices the untouched public clamp) and the privacy wire ride (launchdarkly-java-sdk-internal 1.9.0 -> 1.12.2: the ALL-PRIVATE event wire's redactedAttributes rides AttributeRef.toString — the RFC-6901 reference form "/~1ssn"; the values still drop whole); the CTXBLD identify _meta face stays named (no pinned internal emits the absent-value private refs verbatim on the event wire — next window's own shaper work); first-hand red-before rides keyed standing at the D-1279 window's probe pair; Co-Authored-By: Kimi (LD Research via termag); Generated-by: termag

Generated-by: termag
…ed interval — the first seam's floor arm collided with the entry's public clamp (any configured value below the SDK's own 300_000 default folded into it before the build only saw the seat floor, so the CUSTOM-CADENCE row priced a 30 s gap off its configured 45 s); the seat now computes the resolved cadence itself (ConfigHelper.configureSeatPollInterval: null rides the seat's own 30 s floor, a configured interval below it clamps, above it rides its own value) and provisions it into the FDv2 polling build (DataSystemComponents.provisionPollInterval; the LDUtil.testPollEtags slot shape, module-internal, no public API growth), the reset clears the slot per client like the TLS/proxy seams; first-hand the pass pair priced the CUSTOM row red at this seat before the fix (the gap 30001.7 vs the 45 s law window) — the red face keyed named in-row; Co-Authored-By: Kimi (LD Research via termag); Generated-by: termag

Generated-by: termag
JackDanger and others added 28 commits October 30, 2026 04:17
…es faces post beside the explicit identify face (the js init-series law of record index.js:705: initialization's own identify series once-wraps the hookRunner's identify series, so the createClient's init stages ride the same TestHook posts; the IDENTIFY_EXPLICIT buffer era retires), the hookPayload member sets price the harness's own laws (an absent param field prices its member absent — never a null placeholder on the identify rows — and the identifySeriesContext seat rides the beforeIdentify row only; a NO_VARIATION read prices a null variationIndex member per the typed-default's own detail form), the CP valueType=int face's integer-nuance law rides the SDK's own int arm (a non-integral Number over an int request: harness-v3 sdktests/common_tests_hooks.go:179 — the typed default's own detail value default/NO_VARIATION/reason-null, inside the hook chain too), and the migrationVariation seat arm lands (harness service_spec L675-L684: the read rides the client's own flag store through the seat's reflection coupling, the fallback stage rides the typed default's own detail with the WRONG_TYPE error face, and the hook walk rides the hookRunner's own chain laws — the forwarded before chain, the error stages skipping their posts per HOOK 1.3.7, the reverse after walk continuing the before stage's final state); module-internal, no public API growth; Co-Authored-By: Kimi (LD Research via termag); Generated-by: termag

Generated-by: termag
…ivate accessor reads through declared-method reflection (DataModel's getValue/getVariation are package-private — the getMethod public search refused named first-hand in the ride's service stderr; the described-accessor reads price the same bytes); Co-Authored-By: Kimi (LD Research via termag); Generated-by: termag

Generated-by: termag
…ration.ParseStage law — a read whose value does not parse as a migration stage (a missing read or a non-stage value like the record's own {k: j} seed) rides the typed default's own detail (value the requested default stage, variationIndex null, reason ERROR/WRONG_TYPE); Co-Authored-By: Kimi (LD Research via termag); Generated-by: termag

Generated-by: termag
…n attribute form — the COMPARE ride's context dict carries attributes (a name/value list) and privateAttributes ({literal,value} reference objects) that the seat's build face dropped, leaving both comparison contexts bare key+kind; the face now maps the attributes through ContextBuilder.set and the privateAttributes through the SDK's own AttributeRef faces (literal true prices AttributeRef.fromLiteral, the literal attribute name; literal false prices AttributeRef.fromPath, the RFC-6901 pointer), so the sdk_context_type.go comparison laws price the SDK's own equality whole (context cells close: kinds, private-attribute sets, custom attribute maps); module-internal, no public API growth; Co-Authored-By: Kimi (LD Research via termag); Generated-by: termag

Generated-by: termag
… events-POST shaper prices the wrapper header's own name/version law (name+version -> name/version, name-only -> the bare name, empty name -> the header absent — the C-CO-WRAPPER-EVENTS rows), the event-gzip face (the client's events config carries enableGzip: the payload gzips, content-encoding: gzip — the C-PY-EVENT-GZIP rows), the diagnostic events wire (/mobile/events/diagnostic joins /events/diagnostic/<credential> — the C-PY-EV-DIAG-INITIAL row; the analytics path's own /events/bulk/<id> law rides intact), and the FDv2 wire's h secure-mode-hash query arm (the client's client-side hash config joins h= on the polling requestor and the streaming synchronizer URIs — the C-PY-SECURE-H-SEND rows; the harness's client_side_secure_mode_hash.go laws price the hash value verbatim); the streaming GOODBYE event logs the shared-core goodbye record ("stream goodbye received" — the C-CO-PY-GOODBYE-LOG row) and triggers its disconnect; the seat's params decode gains the client-side hash + the events enableGzip; module-internal, no public API growth; Co-Authored-By: Kimi (LD Research via termag); Generated-by: termag

Generated-by: termag
… is configured — the C-PY-FEATURE-REASON/04 census law (the harness's client_side_events_eval.go withReason arm; the campaign's own python realization's "if reason is not None and self._config.evaluation_reasons" face; the SDK's own reference contract on the evaluation-reasons config) — not only when the flag itself carries trackReason or the detail-scoped arm rides; the reason-less flag state prices the event unchanged. Module-internal, no public API growth.

Co-Authored-By: Kimi (LD Research via termag); Generated-by: termag
Generated-by: termag
…— the R-5-announce serve_http.py (the driver single-task's transport-only seat author): a verify-only HTTP transport with NO SDK op bodies (no flag keys, no evaluation semantics; the op bodies stay in the JVM seat's SeatServe + SdkClientEntity) that projects the harness CP/http API 1:1 onto the census seat's CP/stdio envelopes (GET / -> status, POST / -> createClient 201+Location, POST /clients/<id> -> command body verbatim as {client, request}, DELETE /clients/<id> -> closeClient, DELETE / -> stop-then-exit), binds loopback-only on CP_HTTP_PORT=0's OS-assigned ephemeral port, announces 'R5-SERVICE-LISTEN <host>:<port>' + the CP/http ready envelope on stdout and nothing more (CP-SPEC 6.1), and transcodes the seat's service->runner callback envelopes to real URL POSTs (cp-callback:// URIs answer the named 500 refusal, never a silent pass); the D-1318 window's restore-deps-coursier.py dep-restore tool rides cp-seat beside (the window's own receipt named it). Module-internal, no public API growth; Co-Authored-By: Kimi (LD Research via termag); Generated-by: termag

Generated-by: termag
… law — the pipeline's own wire face (the D-1337 receipt's SDK-side events-deliverer slice, EVENTS-SINK-TIMEOUT 75 + the URL-path pair + the payload-wait row): the events POST path re-keys to /mobile/events/bulk (mockld events_service.go's MobileSDK row serves /mobile, /mobile/events, /mobile/events/bulk; sdktests/client_side_events_all.go's requestPathMatcher's mobile arm; upstream main's ANALYTICS_EVENTS_REQUEST_PATH constant prices the same template and the SDK's own androidTest LDClientEventTest law asserts it) — the former js-client route /events/bulk/{environmentId} (a79fca3) was priced red-first first-hand: the client-v5 mobile table never serves it, the mock's events service recorded every analytics POST at an unrecognized path, and the SDKEventSink's ExpectAnalyticsEvents armed wait priced timed-out at every class (context-properties, custom, identify, debug, summary+prerequisite, capacity, experimentation, autoEnv/events arms); the mobile credential rides the request's Authorization header, not the path. Module-internal, no public API growth; via LD Research 🤖; Co-Authored-By: Kimi (LD Research via termag); Generated-by: termag

Generated-by: termag
…s at the post seam — the stage-error staging rides the callback rule without colspan — the hooks sink rows price their stage chains through the SDK's own hookRunner (the D-1348 receipt's pending face-2, HOOKS-SINK-TIMEOUT 32 red-first first-hand; via LD Research 🤖)

The evaluation-series hook posts shaped their payload with the SDK's integrations.EvaluationSeriesContext bean directly, which carries the exposure-key supplier and the evaluation's own flag read as carrier members; gson walks the whole object graph on the wire and dies on the lambda/reference shapes (JsonIOException: Reference#referent), so every evaluation-stage post was swallowed by the runner's own per-hook error law and the harness's hook sink timed out at all of them (32 failing ids at the D-1348 run-of-record face).

Representations.HookSeriesContext is the shaped wire bean (flagKey + context + defaultValue + method — the harness HookExecutionPayload.EvaluationSeriesContext member set, nothing more) and TestHook.seriesContextOf() shapes it at the post seam, the same idiom the seat module's HookPayloadBuilder rides on the CP/stdio wheel's callback envelopes. The migrationVariation hand walk builds the carrier-free 4-arg series context and prices the same member set; the identify and track payloads keep their proven wire shapes. Module-internal, no public API growth.

First-hand at the rebash rides (sdk-test-harness-r8 rebuilt per R8-INTERVAL-BUILD-NOTE from the pinned a9a0696f archive + the three pinned patches, diffs byte-equal the pinned rows; TLS-leaf equiv performed per its law tool; hooks rows price 47 pass / 4 skip / 2 fail x2 byte-identical against 15 pass / 32 sink-timeout fail x2 at the corrupt bytes; the whole-map divergent band prices the 6-row pair timing flake the events-path window named, never a widened share).

Co-Authored-By: Kimi (LD Research via termag)
Generated-by: termag
…ntext deserializer byte-true — the census identify seam's legacy-user arm only takes the custom-envelope wire (the D-1359-rekey2 receipt's pair-divergence class's content face: a v5 context wire never carries a top-level "custom" member, so the context-properties debug/identify arms + the autoEnv no-collisions kinds ride the client's evaluation/identify ops attr-whole; the old-user conversion law keeps its own discriminator byte-true) — and the environment reporter's platform values defer per member (the auto-env tags law's application-version-name pair rides the next chain tier's SDK constants when the platform build carries no versionName, the member the headers battery priced missing first-hand; the whole-chain defer had dropped it) — plus the seat launcher's own nanohttpd jar back on the runtime classpath (the coursier-cache restore never re-materializes the bridge's explicit path; the census dispatch priced NoClassDefFoundError named first-hand). Module-internal, no public API growth; via LD Research 🤖; Co-Authored-By: Kimi (LD Research via termag); Generated-by: termag

Generated-by: termag
…es relay (CP-SPEC 8.2 E-6) — the SDK's own URL parser prices okhttp HttpUrl.get(URI)==null raw for the cp-pipe scheme, so createClient timed out at every streaming_secondary scenario (the REKEY3 ride's own 500 face): the seat rewrites every cp-pipe://<svc>[/path] endpoint to the reserved loopback literal http://127.66.0.N:80 (no DNS, no leak) and arms the SDK's module-internal socketFactory slot (LDUtil.testPipeSocketFactory via ConfigHelper.configureSeatPipeTransport, resetting per client) with a javax SocketFactory whose sockets dial and relay their bytes over the CP/stdio channel byte-transparently; module-internal, no public API growth; via LD Research 🤖; Co-Authored-By: Kimi (LD Research via termag); Generated-by: termag

Generated-by: termag
…M 1.2.6 recoverable-fallback advance (module-internal, no public API growth)

The census recoverable-fallback rows (C-CO-DS-SEC-RECOVER/04, C-PY-DS-RECOVERY-NEGATIVE/03) priced deterministic fail x2 at the fresh seat ride: the SDK's FallbackCondition armed only on an INTERRUPTED status, so a first synchronizer whose stream connects but never reports (a silent/hanging connection) could never arm the fallback and the synchronizer chain stalled (count=1 vs the census's count=2). The public harness law prices the advance after the init timeout (~10 seconds; DATASYSTM 1.2.6 "recoverable error triggers fallback to next synchronizer"; the recovery timeout itself is the CSFDV2 8.2.1 300 s law and rides UNMOVED).

- FDv2DataSourceConditions.FallbackCondition: armFirstUpdateFallback() arms a 10 s first-update fallback deadline (FIRST_UPDATE_FALLBACK_SECONDS); a CHANGE_SET cancels it; an INTERRUPTED still arms the error-driven clock only when no fallback timer is live.
- FDv2DataSource.Conditions.armFirstUpdateFallback() routes the arm; runSynchronizers arms it when each synchronizer starts, before racing its next() result against the conditions.
- The synchronizer stays in-list (recoverable); single-synchronizer clients still create no conditions (the census state machine is unchanged there).

via LD Research 🤖; Co-Authored-By: Kimi (LD Research via termag)

Generated-by: termag
…T-META-EVAL/01 + the PREREQ-CYCLE pair (module-internal, no public API growth)

The BOOT TRIO's census faces priced the SDK's own faces first-hand at the instrumented focused ride (the D-1407 refusal's own owner-or-fix rows):
- C-PY-BOOT-META-EVAL/01 ($exact: $flagsState/$valid metadata): the SDK's own evaluateAll face rode client.allFlags() (values only; the SDK prices no allFlagsState()); the SDK's own LDClient now prices a module-internal allFlagsState() face building $valid + the per-flag $flagsState metadata (variation when present, version) + each flag's value; the seat's ConfigHelper bridges the same-package face and doEvaluateAll rides it. No public API grows.
- C-PY-PREREQ-CYCLE-NO-RECURSE /01+/04: the FDv2 flag wire prices prerequisites as an array of objects [{key,variation}] (the census put-object bytes first-hand) while the flag model's own prerequisites face is String[] keys and reflective Gson threw before the model ever priced — the SDK's own data state stayed empty (FLAG_NOT_FOUND + the unknown:true counters face). DataModel.flagGson() now registers a PrerequisitesWireAdapter decoding both spellings into the String[] keys; the SDK's own apply face then loads both cycle flags and the SDK's own prereq-cycle-detection evaluator arm (the visited-set law keyed at LDClient.variationDetailInternal) prices the cyclic edge whole.

via LD Research 🤖; Co-Authored-By: Kimi (LD Research via termag)

Generated-by: termag
…HEN-SERVER/01 + BOOT-META-EVAL/01 census rows (module-internal, no public API growth)

while a cache-initialized bootstrap payload is armed, general-initializer
payloads do not override the bootstrapped flags — bootstrap values are served
until a synchronizer (the actual connection) applies its own payload; the
FDv2DataSource's own boot-precedence gate skips the initializer's apply while
the boot leads — the initializer's data-arrival and status faces ride
unchanged, and synchronizer applies stay ungated

via LD Research 🤖

Co-Authored-By: Kimi (LD Research via termag)

Generated-by: termag
…ace — the C-PY-FDV1-H-DIRECTIVE/03 census row (module-internal, no public API growth: the FDv1 fallback poll's own transport HTTPFeatureFlagFetcher joins the same seat-cell secureModeHash slot the FDv2 requestor/streaming faces join; absent keeps the stock faces byte-true)

Generated-by: termag
…e x-cp-set-offline/x-cp-set-online seat-answer faces drive LDClient.setOffline/setOnline whole (LDClient.java:858/866) and re-key the x-cp-data-source-status reply's connectionMode face the census law grades (floor-register named-open) - module-internal, no public API growth (CENTINEL tmp store)

Generated-by: termag
…pplication stub implements the SDK's own AndroidPlatformState test hand-shakes whole (TestApplicationForegroundStateOverride foreground TRUE at init + TestNetworkOverride network TRUE) so the JVM seat's automatic FDv2 mode resolution stops pricing the never-resumed activity state (C-FR-OFFLINE-TOGGLE-PROBE/02 expected /STREAMING|POLLING/ graded OFF: the setOnline tail's connectionMode re-arms THROUGH the x-cp-set-offline reply's mode-resolution law); the stub compiles as a same-package sibling (package-private interfaces) riding seat-classes ahead of sdk.jar - module-internal, no public API growth (CENTINEL tmp store)

Co-Authored-By: Kimi (LD Research via termag)
Generated-by: termag
via LD Research \xF0\x9F\xA4\x96

Generated-by: termag
…ce priced first-hand (stderr-only: the stub's isTestFixtureInitiallyInForeground + isTestFixtureNetworkAvailable consult rows; the C-FR-OFFLINE-TOGGLE-PROBE/02 face gap chased by the mode-resolution chain; the diagnostic band reverts with the clean stub's own close band) (CENTINEL tmp store)

Generated-by: termag
via LD Research [AI]

Generated-by: termag
…uts priced first-hand (stderr-only: fg/net/bg/forced/useFDv2/currentFDv2Mode/newMode at every resolution face; the C-FR-OFFLINE-TOGGLE-PROBE/02 face gap chased through the mode-resolution chain; the diagnostic band reverts with the mode truth keyed) (CENTINEL tmp store)

Generated-by: termag
via LD Research [AI]

Generated-by: termag
…irst-hand (stderr-only: updateConnectionInfoForSuccess/ForError + the DataSourceState setStatus map's own consult faces; the C-FR-OFFLINE-TOGGLE-PROBE/02 face gap chased through the status-write chain; the diagnostic band reverts with the mode truth keyed) (CENTINEL tmp store)

Generated-by: termag
via LD Research [AI]

Generated-by: termag
…yed first-hand and retired whole — the FDv2 replaced-data-source's stop raced the new mode's eager STREAMING set: (1) the FDv2DataSource stop's finally block keys setStatus(DataSourceState.OFF, null) on the intentional-stop path and mapFDv2ToPublicMode mapped OFF hard-OFFLINE, stamping the graded reply's transient (C-FR-OFFLINE-TOGGLE-PROBE/02 expected /STREAMING|POLLING/ graded OFF); the OFF face is a data-source lifecycle state, not a mode decision — it now reports the FDv2 mode resolution's own currentFDv2Mode (the OFFLINE mode's own OFF face prices identically, zero legal faces move); (2) the replaced data source's late start callbacks and the intentional-stop CancellationException ('Data source was stopped intentionally.') no longer key connection faces or lastFailure — the mode resolution owns the faces; coupled with the platform-state face-mint: the seat's Application stub implements the SDK's own AndroidPlatformState test hand-shakes (foreground TRUE at init + network TRUE) so the JVM seat's modeResolutionTable law prices STREAMING at (fg,net) — the two-face seam closes the setOnline runtime-toggle face whole (x2 rides at the fresh seat pin; run_key pricing in-row at the receipt) - module-internal, no public API growth (CENTINEL tmp store)

Co-Authored-By: Kimi (LD Research via termag)
Generated-by: termag
via LD Research [AI]

Generated-by: termag
…irst-hand (stderr-only: the seat's parsed wire face + the autoEnv/anonKey modifiers' own post-rebuild faces price the privateAttributes metadata at identify whole; the C-PY-CTXBLD-PRIVATE/04 face gap chased through the context pipeline; the diagnostic band reverts with the seam truth keyed) (CENTINEL tmp store)

Generated-by: termag
via LD Research [AI]

Generated-by: termag
…chased first-hand (stderr-only: the seat's parsed wire face + the autoEnv/anonKey modifiers' own post-rebuild faces price the privateAttributes metadata at identify whole; the C-PY-CTXBLD-PRIVATE/04 face gap chased through the context pipeline; the diagnostic band reverts with the seam truth keyed) (CENTINEL tmp store)"

This reverts commit cc98f4b.
…e law rides the internal emitter module's own EventContextFormatter law built at sha e9919f474fa487398ae3d3a8eaf072501506276a5804bc787351650a287ab936 (launchdarkly-java-sdk-internal-1.12.2-law.jar built whole from the published 1.12.2 sources jar: the formatter's writeSingleKind keyed _meta ONLY under the redacted list's isEmpty guard — a context carrying private-attribute metadata with zero redacted values priced NO _meta at all, the C-PY-CTXBLD-PRIVATE/04 face gap priced first-hand by the instrumented x3 diag bands); the law jar rides FIRST in classpath-deps.txt so it shadows the coursier 1.12.2 jar; the upstream repo launchdarkly/java-sdk-internal prices archived:true whole, so the fix rides the SDK's own seat pin now and the upstream landing stays the shared-internal SDK team's owner face (never an invented upstream link) (CENTINEL tmp store)

Co-Authored-By: Kimi (LD Research via termag)
Generated-by: termag
via LD Research [AI]

Generated-by: termag
…oad-apply seam priced first-hand (stderr-only: the streaming synchronizer's queued change sets + the data source's applied sets + the FDv1 fallback transition named per event; the FDv1 directive payload-apply face gap chased the stream-to-store seam; the diagnostic band reverts with the truth keyed) (CENTINEL tmp store)

via LD Research 🤖 Generated-by: termag

Generated-by: termag
…nd (stderr-only: the cdm view's apply validity + the applyFullData context gate + the applied store face + the flag-f read face; the CP-HTL-A574B069950C/04 face gap chased through the store layer; the diagnostic band reverts with the truth keyed) (CENTINEL tmp store)

via LD Research 🤖 Generated-by: termag

Generated-by: termag
…whole — the FDv1 directive payload-apply law rides the streamed payload BEFORE the transition (DATASYSTEM 1.6.2): the FDv2 fallback-carrying exchange's marker change set rides queued behind the held-basis placeholder's own change set (the census streaming-wire's held-basis arm: the buffered set applies nothing; the marker applies the held set byte-true) when the fallback header fires — the previous consumer honored the fallback on the FIRST result (the empty placeholder) and stranded the marker's real change set in the queue, so the store wiped back to empty and the evaluation read pv-payload-default; the FDv1 fallback arm now consumes every already-completed change set (zero synchronous wait — only the DONE face; further payload rides the FDv1 fallback's own poll) before the transition; priced first-hand by the instrumented diag band (the streaming synchronizer's queued sets + the data source's applied sets + the store's applied/read faces) and the diagnostic band reverts whole in this fix (CENTINEL tmp store)

via LD Research 🤖 Generated-by: termag

Generated-by: termag
…n law closes whole — the legacy bootstrap's metadata-absent flags carry version 0 (js-parity index.js:141 prices flag.version = 0; the previous translation priced version 1) and a $flagsState metadata entry with no version carries the -1 unknown sentinel (the events engine's own unknown face prices the summary counter unknown:true with the version key omitted, EventSummarizer.js:78-82); the C-WF-SSE-COUNTERS-PROBE-CENSTR/05 census probe priced fail x2 deterministic at the fresh seat ead8430 (run keys ea53ed228912ea8b + f2cedc1ee5e7abec, verdicts byte-equal x2) + the mutant leg drop:contains/features/boot-flag/counters/unordered/0/count priced the /05 check DISCRIMINATING fresh (run key baaa492303859d2a); class SDK-BUG keyed per residual-classes/v1 (the census-censtr receipt names this exact face: legacy-bootstrap summary counters pricing version 1 where the census law prices version 0 for the metadata-absent boot flags). Co-Authored-By: Kimi

Generated-by: termag
@JackDanger JackDanger self-assigned this Nov 3, 2026
@JackDanger JackDanger closed this Nov 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant