Skip to content

Independent Python runner and internal adapters

The implementation under conformance/runner is independent of all GES implementations. The language-neutral Markdown and execution contracts remain owned by MarkdownFormat and Runner.

Load-error cases additionally verify real Host.Load diagnostics independently of compiler failures. External-type catalog cases verify counts or duplicate-name rejection through the portable API. All currently authored valueApi cases exercise real value construction, normalization, flags, length, equality, hash equality and defensive copies. Input entry order and duplicate keys are preserved across transport; only the implementation normalizes them. Copy checks mutate the original source array after construction and observe the resulting value. Expected results remain exclusively in Python. The initial 21 messageApi cases cover ordered signatures and arguments, construction failures, equality/hash equality and signature-based creation. Another 48 cases qualify the independent conformance-message comparison against raw constructed messages, using the same typed comparison as runtime expectations. Expected messages and numeric comparison options never reach the adapter. Product JSON cases are supported through the actual product codec, with exact canonical text comparison and structured message.* failures. JSON observations carry the serialized envelope instead of typed Conformance transport. Combining JSON with compareConformanceMessage requests an additional typed observation; expectations remain in Python.

The current executable scope covers bytecodeSnapshot, compileError, bytecode, compileMetadata and all currently authored programBinary cases, including their Steps, plus all currently authored scriptApi cases: single- and multi-Program scenarios and native-only Hosts. Inventory validates every selected execution schema. Runtime transport currently covers Nothing, Boolean, Text, Tag, Dice, exact Int64/Binary64, Quantity, Percentage, Vector, Point, both Range variants, Messages, record snapshots, Lists and Maps, with local/outbound messages and limit observations. All runtime-limit overrides and completion, enqueue, single-frame and repeated-frame pumping are supported. Limit assertions use stable names, configured values, and wildcard constraints; English detail matching is rejected; stable limit fields and observer traces replace such assertions. Deterministic random configuration covers signed Int64 seeds, finite start sequences, and entropy bytes passed to the corresponding host APIs. Multiple Hosts reuse the same immutable Program and are observed and checked independently; hostCount is bounded at 256. The runner does not implement a PRNG; omitted configuration and sequence fallback use seed zero. Python owns exact-bit/ULP comparisons while preserving storage kind and unit; expected NaN matches Nothing. Declarative native handlers support matching, priorities, emissions, argument forwarding and deliberate/unexpected faults. Runtime diagnostics are checked in order against stable fields and context. Load/detach and subscribe/unsubscribe actions are supported in native handlers and before step inputs. Their Boolean or structured link-error results are checked in Python; action expectations never reach the adapter. Virtual-time advances and optional readiness, Program-start and idle-duration assertions are supported, including explicit initialization observations and Start-only pumping. Observer traces cover emit, publish, dispatch start/completion, runtime limits and diagnostics in exact callback order. Omitted trace expectations make no ordering assertion; an explicit empty trace requires no callbacks. Diagnostic and limit entries retain their normal partial-constraint semantics. Trace messages use the case’s numeric comparison mode. The publishSink input selects accept (default), absent, reject, or throw; outbound observations retain every sink call even when it rejects or throws. No sink is installed for absent. All currently authored kinds are implemented. Unknown schemas fail explicitly rather than producing partial acceptance. The default run includes every case; optional performance execution is represented by a skip unless profiles are selected. The legacy C# runner has been removed; C# acceptance uses this runner and the internal adapter. Swift uses the same protocol and Python assertions; its legacy parser and runner have also been removed.

Adapter observations contain raw canonical dumps, structured compiler diagnostics, opcode counts, Program metadata and rewritten fixture bytes rather than assertion results. Python validates fixture integrity and performs binary comparisons without implementing a GES binary reader. The oracle applies the exact LF/UTF-8 snapshot comparison specified by Runner.md. The V1 observation-file/process-batch envelope and its python.observation.* codes describe the process transport boundary; the portable assertion and input diagnostic contracts remain owned by Runner.md and MarkdownFormat.md.

See the runner usage and scope for commands, limits and profile-provider contracts. Generated requests, observations and reports belong under ignored artifacts, never in the authored corpus.

Performance schema and bound controls cover all authored profiles. The runner contains no implementation-specific measurement provider. Profile identifiers come from the adapter’s --describe response and are matched against corpus references. The generic --measure invocation sends workload directives and metric IDs/units, never references or tolerances. Correctness must pass first. Python checks the response identity/digest, metric structure and bounds. Optional evidence is opaque diagnostic data. Native instrumentation, counter controls, aggregation and their verification belong to the adapter implementation. See the runner README for the complete V1 process envelope. Implementation-specific integration tests live alongside the adapter; standalone runner tests use synthetic observations and arbitrary profile names. No language adapter is needed to test or install the runner.

Normalized inputs are immutable snapshots; explicit copies support negative controls. The fileless byte-buffer parser retains original UTF-8 ranges; the CLI owns file access. The complete selection is validated before execution. run and observation-file verify emit the portable V1 report fields. Two tooling extensions retain sourceDocuments (logical input name to original-byte SHA-256) and optional measurementEvidence (qualified raw provider reports).

The received command requires a single source document, explicit case selection, a report and a separate output path. It verifies source hashes, case identity, profile/metric identity and original ranges before replacing only GESA payloads or performance reference tokens. It never updates the authored source itself. This implements the restricted received writer from Runner.md; it is not a serializer for arbitrary Markdown or changed expectations.