

                             Configuration options


SymCC is configured at two different stages:

1. At compile time, you decide which features to enable, which mainly affects
   compilation time and the set of dependencies. This is done via arguments to
   CMake.

2. When you run programs that have been compiled with SymCC, the environment
   variables control various aspects of the execution and analysis.

We list all available options for each stage in turn.


                              Compile-time options


Each of these is passed to CMake with "-D" when configuring the build:

- QSYM_BACKEND=ON/OFF (default OFF): Compile either the QSYM backend or our
  simple Z3 wrapper (see docs/Backends.txt for details). Note that binaries
  produced by the SymCC compiler are backend-agnostic; you can use
  LD_LIBRARY_PATH to switch between backends per execution.

- TARGET_32BIT=ON/OFF (default OFF): Enable support for 32-bit compilation on
  64-bit hosts. This will essentially make the compiler switch "-m32" work as
  expected; see docs/32-bit.txt for details.

- LLVM_DIR/LLVM_32BIT_DIR (default empty): Hints for the build system to find
  LLVM if it's in a non-standard location.

- Z3_DIR/Z3_32BIT_DIR (default empty): Hints for the build system to find Z3 if
  it's in a non-standard location.

- Z3_TRUST_SYSTEM_VERSION (default OFF): Trust that the system provides a
  suitable version of Z3 if the corresponding CMake module can't be found. Use
  this with Linux distributions that don't package the CMake module but still
  ship an otherwise usable development setup (e.g., Fedora before F33). Note
  that we can't check the Z3 version for compatibility in this case, so prepare
  for compiler errors if the system-wide installation of Z3 is too old.


                                Run-time options


"Run time" refers to the time when you run programs compiled with SymCC, not
when you run SymCC itself. In other words, these are settings that you can
change on every execution of an instrumented program. They are specified via
environment variables.

- SYMCC_NO_SYMBOLIC_INPUT=0/1 (default 0): When set to 1, input is never marked
  as symbolic; in other words, instrumented programs will run just like their
  uninstrumented counterparts.

- SYMCC_OUTPUT_DIR (default "/tmp/output"): This is the directory where SymCC
  will store new inputs (QSYM backend only). If you prefer to handle them
  programmatically, make your program call symcc_set_test_case_handler; the
  handler will be called instead of the default handler each time the backend
  generates a new input.

- SYMCC_INPUT_FILE (default empty): When empty, SymCC treats data read from
  standard input as symbolic; when set to a file name, any data read from that
  file is considered symbolic. Ignored if SYMCC_NO_SYMBOLIC_INPUT is set to 1.

- SYMCC_MEMORY_INPUT=0/1 (default 0): When set to 1, expect the program under
  test to communicate symbolic inputs with one or more calls to
  symcc_make_symbolic. Can't be combined with SYMCC_INPUT_FILE. Ignored if
  SYMCC_NO_SYMBOLIC_INPUT is set to 1.

- SYMCC_LOG_FILE (default empty): When set to a file name, SymCC creates the
  file (or overwrites any existing file!) and uses it to log backend activity
  including solver output (simple backend only).

- SYMCC_ENABLE_LINEARIZATION=0/1 (default 0): Enable QSYM's basic-block pruning,
  a call-stack-aware strategy to reduce solver queries when executing code
  repeatedly (QSYM backend only). See the QSYM paper for details; highly
  recommended for fuzzing and enabled automatically by the fuzzing helper.

- SYMCC_FOCUS_BYTES=LO-HI (default empty): Restrict QSYM input symbolization to
  one inclusive byte range for one worker execution. This is used for coarse
  work splitting and remains disabled for exact prefix-target replay.

- SYMCC_FOCUS_SET=<path> and SYMCC_FOCUS_MARGIN=N (default 2): Restrict QSYM
  input symbolization to a sparse offset set plus a small byte-neighborhood.
  The file contains one offset per line. Bytes beyond the largest known offset
  remain symbolic to avoid losing unexplored suffix-dependent paths.

- SYMCC_COMPACT_FOCUS_SET=0/1 (default 1 in the MPI helper): Enable
  Gordian-style compact input linearization in the coordinator. Recent AFL hint
  offsets and Cottontail comparison-taint dependency offsets are written to a
  bounded `.compact_focus_set` file and dispatched as SYMCC_FOCUS_SET for
  ordinary non-targeted work. Targeted prefix replay and explicit focus
  partitions do not use the compact set.

- SYMCC_AFL_COVERAGE_MAP (default empty): When set to the file name of an
  AFL-style coverage map, load the map before executing the target program and
  use it to skip solver queries for paths that have already been covered (QSYM
  backend only). The map is updated in place, so beware of races when running
  multiple instances of SymCC! The fuzzing helper uses this to remember the
  state of exploration across multiple executions of the target program.
  Warning: This setting has a misleading name - while the format of the map
  follows (classic) AFL, the variable isn't meant to point at a map file that
  AFL uses too!

- SYMCC_TELEMETRY_OUT (default empty, QSYM backend): Atomically write a
  versioned JSON summary for one concolic execution. Schema 3 contains an
  ordered path fingerprint, branch/dependency counts, prefix-sensitive branch
  trace, solver outcomes and timings, generated-input counts, and optional data
  coverage features. It also reports bounded implicit-flow targets, Backsolver
  attempts, and successful adapted models. The MPI helper enables this
  automatically for adaptive scheduling and persists the resulting scheduling
  signal in the prefix DAG. Static-data fields are
  `static_data_regions`, `static_data_objects`, `static_data_segments`,
  `static_data_accesses`, `data_switches`, `data_switch_probes`, and
  `static_data_features`. Each static feature row is
  `[object_id, byte_offset, matched_bits, maximum_bits, kind]`, where kind 0 is
  a simple load, kind 1 is a predicate/load-based comparison, and kind 2 is a
  byte-region comparison.

- SYMCC_DATA_COVERAGE=0/1 (default 0 in the runtime, enabled by the MPI hybrid
  helper when adaptive scheduling is enabled): Enable structured Data Coverage
  for immediate integer comparisons, bounded switch neighbors, simple loads
  from static storage, load-derived predicates, and byte-region comparisons.
  Trivial branch outcomes remain represented by ordinary code coverage instead
  of being duplicated. Equality progress is the number of equal bits; ordered
  comparisons use the number of equal leading bits. Switch instrumentation
  sorts cases once and probes only the adjacent cases (or range endpoint).

  Constant globals compiled by SymCC are registered with deterministic
  module/global IDs. At startup the QSYM runtime also registers readable,
  non-writable ELF PT_LOAD segments from already loaded modules, so an
  instrumented caller can cover read-only tables in an uninstrumented DSO.
  Runtime addresses are normalized to ASLR-independent
  `(object_id, byte_offset, effective_width_bits)` feature keys. Fine-grained
  LLVM objects take precedence over their containing ELF segment.

  The adaptive coordinator stores comparison and static-data winners in the
  `data_coverage` section of its versioned scheduler state. This is an
  independent, collision-free novelty set; it is not overlaid on the AFL edge
  bitmap. A seed replaces another feature winner only after strictly improving
  matched bits. `data_corpus_refinements` is incremented only when both inputs
  have the same nonzero path fingerprint, a conservative proxy for equal code
  coverage. Replacement is logical scheduling dominance: AFL-owned queue files
  are not deleted, and a seed that remains best for another feature keeps its
  priority.

- SYMCC_DATA_CMP_BYTES=N (default 64, maximum 4096): Maximum bytes recorded for
  libc constant-data comparisons and region features. The runtime wrappers emit
  region progress for memcmp/bcmp and bounded strcmp/strncmp comparisons, then
  retain the existing symbolic-vs-concrete byte hints. A late, uninstrumented
  module loaded with dlopen after runtime initialization is not part of the ELF
  fallback registry unless its relevant objects are explicitly registered.

- SYMCC_CMP_TAINT=0/1 (default 1 when SYMCC_TELEMETRY_OUT is set): Emit
  Cottontail-style comparison-taint summaries in telemetry. Each bounded entry
  records a branch site, prefix-sensitive branch id, dependent input-byte count,
  min/max dependent byte offsets, taken outcome, and whether the branch was
  solver-interesting. The adaptive scheduler converts these summaries into a
  locality signal for structure-aware seed ranking and exports them to agentic
  planning hooks. Setting this option to 0 disables the JSON field without
  affecting ordinary solving.

- SYMCC_ECT=0/1 (default 1 in the adaptive coordinator): Maintain an
  engine-neutral expressive coverage tree from prefix-sensitive branch traces,
  comparison dependencies, compiler structural metadata, data progress, solver
  outcomes, and concrete coverage reward. Observed and open outcomes are
  separate nodes; source/function/context fields come from SYMCC_TASK_GRAPH.
  Constraint shapes intentionally omit absolute byte offsets so structurally
  equivalent parser states can share duplicate and rarity statistics.

- SYMCC_ECT_NODES=N (default 16384), SYMCC_ECT_TRACE=N (default 512), and
  SYMCC_ECT_CONTEXT=N (default 8): Bound retained ECT nodes, consumed trace
  length per execution, and function-context depth. Repeated site/outcome
  shapes are compressed into loop counters, and inactive low-quality nodes are
  pruned before active open/timeout nodes.

- SYMCC_ECT_OUT=PATH (default empty): Atomically export the persisted scheduler
  ECT as versioned JSON for offline analysis or an external planner. ECT
  priority is used internally even when no export path is configured.

- SYMCC_POLY_CACHE=PATH/0 (default off in the runtime, enabled by the adaptive
  MPI hybrid helper as "$AFL_OUT/<symcc-name>/.poly_cache"): Enable Pangolin-
  style context reuse in the QSYM backend. Each interesting branch stores a
  prefix-sensitive cache entry containing the SAT/UNSAT/timeout result, the
  changed bytes from the Z3 model, a byte-interval polyhedral box for a bounded
  subset of dependent input bytes, and normalized linear path constraints when
  QSYM can extract them. Later executions with the same
  prefix/expression/dependency key can replay the model, skip known UNSAT work,
  and generate extra samples from the saved constraint context before falling
  back to ordinary Z3 solving.

- SYMCC_POLY_CROSS_PREFIX=0/1 (default 0 in the standalone runtime; enabled
  by the adaptive MPI sampling profile): On an exact-key SAT miss, scan a
  bounded set of cache entries and classify their normalized
  linear abstractions as equivalent, cached-subset, current-subset, or
  compatible. This relation only ranks candidates. Every foreign model and
  every derived polyhedral sample is re-evaluated against the complete current
  prefix and desired target before it is written. UNSAT entries are never
  reused across prefixes.

- SYMCC_POLY_PROJECTED_REUSE=0/1 (default 1 when cross-prefix reuse is
  enabled): Permit foreign SAT entries with different variable sets or input
  lengths to be related over shared byte offsets. Missing byte variables are
  eliminated per linear row using their `[0,255]` interval, producing a
  conservative projected proposal domain. Cross-size entries must pass this
  projection path. Every projected model/sample is still evaluated against the
  complete current prefix and target; UNSAT entries are never projected.

- SYMCC_POLY_EXACT_PROJECTION=0/1 (default 1 when cross-prefix reuse is
  enabled): Refine projected relation classification with bounded exact
  integer formulas. Cached and current non-shared bytes are existentially
  quantified over `[0,255]`; Z3 checks both implications and their
  intersection. The interval projection remains the sampling envelope and
  every candidate still receives complete current-expression validation.
  Timeout or unknown falls back to interval classification.

- SYMCC_POLY_EXACT_PROJECTION_VARS=N (default 2, maximum 6): Maximum total
  number of existentially eliminated cached/current byte variables.

- SYMCC_POLY_EXACT_PROJECTION_ROWS=N (default 32, maximum 128): Maximum total
  number of cached/current linear rows admitted to exact relation checks.

- SYMCC_POLY_EXACT_PROJECTION_TIMEOUT=N (default 10, maximum 1000):
  Millisecond timeout for each implication or intersection check.

- SYMCC_POLY_EXACT_PROJECTION_PROBES=N (default 8, maximum 64): Maximum
  exact projected cache relations attempted for one branch.

- SYMCC_POLY_FIELD_RENAMING=0/1 (default 1 when cross-prefix reuse is
  enabled): Search for a bounded structure-preserving bijection or exact-proof
  injection between cached and current linear byte variables when their input
  offsets, widths, or total input sizes differ. A matched mapping rewrites the
  cached model, byte box, and full constraint matrix. Multi-byte endian changes
  are supported when their byte coefficients form a provable permutation.
  Wider/narrower variable-count mappings additionally require exact existential
  integer projection; interval-only relations cannot authorize width changes.
  This is SAT-candidate retrieval only; every renamed candidate is checked
  against the complete current prefix and target, and UNSAT is never renamed.

- SYMCC_POLY_RENAME_VARS=N (default 6, maximum 8): Maximum number of nonzero
  variables on either side of a field-renaming search.

- SYMCC_POLY_RENAME_ATTEMPTS=N (default 128, maximum 4096): Maximum number of
  complete variable mappings checked for one cached/current relation.

- SYMCC_POLY_RENAME_EXACT_PROBES=N (default 8, maximum 32): Maximum exact
  integer projection checks used while searching an injective width-changing
  field mapping. Widening and narrowing mappings are rejected when this proof
  budget is exhausted; they never fall back to interval-only acceptance.

- SYMCC_POLY_CROSS_PREFIX_PROBES=N (default 32, maximum 256): Maximum number
  of relation-ranked foreign SAT models evaluated for one branch. Telemetry
  reports `poly_cross_prefix_probes`, `poly_cross_prefix_relations`,
  `poly_cross_prefix_hits`, `poly_cross_prefix_validation_failures`,
  `poly_projection_attempts`, `poly_projection_relations`,
  `poly_projection_hits`, `poly_exact_projection_attempts`,
  `poly_exact_projection_relations`, `poly_exact_projection_unknown`,
  `poly_exact_projection_hits`, `poly_renaming_attempts`,
  `poly_renaming_relations`, `poly_renaming_hits`,
  `poly_sample_validations`, and
  `poly_sample_validation_failures`.

- SYMCC_PREFIX_CONTEXT_CACHE=0/1 (default follows SYMCC_POLY_CACHE): Cache the
  translated Z3 assertion vector for prefix dependency forests. This keeps
  repeated branch, address, and solve-all queries from rebuilding the same Z3
  context when Pangolin-style reuse is enabled.

- SYMCC_POLY_RANGE_BYTES=N (default 4, 0 disables box extraction): Maximum
  number of dependent input bytes for which the QSYM backend computes min/max
  feasible byte intervals when SYMCC_POLY_CACHE is enabled.

- SYMCC_POLY_LINEAR_BYTES=N (default 4, maximum 6): Maximum number of symbolic
  input bytes that the QSYM backend linearizes into one unsigned integer for
  cached path constraints. Linearized add/sub/neg and multiplication by small
  constants are stored with the poly cache and used to keep generated samples
  inside the cached context.

- SYMCC_POLY_SAMPLES=N (default 2, maximum 16): Number of deterministic samples
  to generate from a cached or freshly computed polyhedral byte box.

- SYMCC_POLY_TEMPLATE_BYTES=N (default SYMCC_POLY_RANGE_BYTES, maximum 16) and
  SYMCC_POLY_TEMPLATE_PAIRS=N (default 16, maximum 128): Add Pangolin-style
  linear template bounds to SAT cache entries. The runtime computes exact
  feasible min/max bounds under the current strict Z3 context for selected
  bytes, pairwise sums, pairwise differences, and already extracted linear
  path expressions. The serialized format remains the existing linear
  constraint column, so older cache entries are still readable.

- SYMCC_POLY_WALK=john|dikin|coordinate (default john when linear constraints
  are available): Choose the cache sampler. John and Dikin modes construct the
  complete dense `A x <= b` system from byte boxes and cached linear
  inequalities, factor the full slack-scaled barrier Hessian, and draw
  correlated directions through its Cholesky factor. John mode additionally
  performs fixed-point Lewis/leverage weighting over all facets. Every rounded
  byte assignment is checked against the exact integer inequalities; singular
  and boundary cases fall back to integer hit-and-run and coordinate sampling.

- SYMCC_POLY_DENSE_DIM=N (default 16, maximum 64),
  SYMCC_POLY_JOHN_STEPS=N (default 4, maximum 16), and
  SYMCC_POLY_WALK_STEPS=N (default max(12, 3 * dimension), maximum 256): Bound
  dense polytope dimension, John/Lewis reweighting iterations, and transitions
  per sample. Offsets outside the dense cap remain fixed in each inequality, so
  the projected polytope stays consistent with the concrete model.

- SYMCC_UNSAT_CORE_CACHE=0/1 (default 0): Enable an exact-subset UNSAT reuse
  cache in the QSYM backend. The runtime asks Z3 for tracked UNSAT cores,
  minimizes small cores under a bounded timeout, and stores both exact and
  structural fingerprints. Later same-shaped contexts can reuse the core even
  when symbolic input indices have been renamed. Linear constraint
  contradictions are also pruned early when the poly cache has collected
  normalized path constraints.

- SYMCC_UNSAT_CORE_MINIMIZE_MAX (default 16, maximum 128) and
  SYMCC_UNSAT_CORE_MINIMIZE_TIMEOUT (default 50 ms, maximum 1000 ms): Bound
  UNSAT-core reduction probes before caching.

- SYMCC_EMIT_HINTS=0/1 (default 0 in the runtime, enabled by the fuzzing
  helper): Emit changed-byte sidecars for generated inputs. Values 0, false,
  off, and no disable the option.

- SYMCC_STRING_HINT_DIR / SYMCC_HINT_DIR (default empty): Export concrete string
  and byte-sequence tokens observed by memcmp/bcmp/strcmp/strncmp wrappers when
  one side is symbolic and the other is concrete. The adaptive hybrid helper
  can feed these tokens to AFL++ extras/mutators.

- SYMCC_STRING_HINT_MIN / SYMCC_STRING_HINT_MAX (defaults 2 / 256, maximum
  4096): Minimum and maximum concrete token sizes emitted by the string hint
  channel.

- SYMCC_STRING_CONSTRAINT_OUT=PATH (default empty): Append versioned
  `symcc-string-constraint-v1` JSONL records for memcmp/strcmp/strncmp wrappers
  when exactly one side is concrete and the symbolic side consists of direct
  input-byte expressions. Each record contains the operation, site id, concrete
  token, NUL-termination flag, and exact input-offset patches. This is a
  SymCC-str-inspired string/BV bridge: it creates verifiable candidates without
  replacing the existing bit-vector path constraints.

  The same stream may contain `symcc-string-operation-v1` observations from
  bounded strlen/strchr/strstr/atoi wrappers. These rows bind a contiguous direct
  input-byte span through its first NUL, the symbolic operand role, constant
  operand, and observed length/index. They are translated to alternative
  length/indexof predicates in `symcc-string-query-v2`; they are observations,
  not direct patches. Incomplete, non-contiguous, embedded-NUL, over-budget, or
  multi-symbolic observations fail closed.

  The atoi model is deliberately restricted to a non-empty, unsigned ASCII
  decimal string of at most 10 digits whose value fits `int`. It emits a
  decimal-regex plus `str.to_int` alternative and an exact 32-bit BV
  multiply-by-10 fold. Whitespace, sign, locale, base prefixes, trailing
  characters, and overflow retain concrete libc semantics and emit no
  conversion artifact.

  The strtol model is separately restricted to `endptr == NULL`, concrete
  base 10, an optional single `-`, one or more ASCII digits, first-NUL
  termination, and a value fitting the target `long` width. The artifact binds
  `integer_bits`; both atoi and strtol queries assert their exact C type range
  before asking for a different value. Non-null endptr, `+`, whitespace,
  suffixes, base 0/non-10, locale, or ERANGE paths emit no strtol artifact.

- SYMCC_STRING_CONSTRAINT_MAX_BYTES=N (default 256, maximum 4096): Maximum
  concrete token bytes inspected for one string-constraint record. `strcmp`
  records include a NUL patch when the bounded concrete token terminates within
  the limit. It also bounds operation spans; the strstr BV contains summary has
  an additional 16384 byte-comparison product bound.

- SYMCC_STRING_CONSTRAINT_MAX_RECORDS=N (default 4096, maximum 1048576):
  Per-process cap on emitted string-constraint records.

- SYMCC_STRING_CONSTRAINTS=PATH (default empty in the AFL++ mutator): JSONL
  string-constraint artifact consumed by `util.afl_symcc_hint_mutator`. If this
  is unset, the mutator falls back to `SYMCC_STRING_CONSTRAINT_OUT`. The mutator
  applies the recorded offset patches as a separate `symcc_string` mutation
  stage before ordinary havoc fallback.

- SYMCC_STRING_SOLVER_ENABLE=0/1 (default 1 in the MPI helper): Capture a
  per-run hidden string-constraint artifact, translate eligible complete
  memcmp/strcmp/strncmp records into backend-neutral string queries, and write
  materialized `string-solver-*` candidates into the worker output directory.
  These candidates enter the existing AFL showmap and worker coverage triage;
  they are not admitted directly. `symcc-string-query-v2` declares both an SMT
  String and one 8-bit BV per covered input offset, links characters, length,
  and the first NUL exactly, and permits bounded BV byte predicates alongside
  String predicates. Version-1 queries are accepted and normalized to v2.
  A concrete evaluator rechecks both views before a solver candidate is used.

- SYMCC_STRING_SOLVER=COMMAND (default auto-discovered `symcc-query-solver`):
  Solver helper used by `util.string_constraints.SymccJsonStringBackend` and
  `util/symcc_string_solver.py`. The helper is invoked as
  `COMMAND --generic query.smt2 TIMEOUT_MS` and returns the existing JSON model
  protocol. If no helper is available, the MPI helper still applies exact
  offset patches and records the missing backend in metrics.

- SYMCC_STRING_SOLVER_PORTFOLIO=JSON_OR_PATH (default empty): Override the
  single backend with 1..8 bounded entries and optional `parallelism`.
  `kind=symcc-json` commands use the existing
  `COMMAND --generic QUERY TIMEOUT_MS` protocol. `kind=smtlib` commands receive
  an SMT-LIB file by replacing `{query}` (or appending the path) and may replace
  `{timeout_ms}`; the adapter appends `check-sat` and `get-value` for every
  linked 8-bit input symbol. Commands are argument arrays or shell-split strings
  and are never evaluated by a shell.

  Example:
    {"parallelism":2,"backends":[
      {"kind":"symcc-json","name":"z3","command":["symcc-query-solver"]},
      {"kind":"smtlib","name":"cvc5-adapter",
       "command":["cvc5","--lang","smt2","--produce-models","{query}"]}]}

  Optional validation-first online selection:
    {"parallelism":2,
     "selection":{"state_path":"/shared/string-backend-policy.json",
                  "max_backends":1,"warmup":1,"explore_every":16,
                  "context_limit":128,"exploration":0.35},
     "backends":[...]}

  `selection` is opt-in; without it every configured backend still runs.
  `max_backends` bounds calls per query. The policy groups queries by operation
  family, total-capacity bucket, variable count, and presence of linked BV
  constraints. It combines concrete-verified SAT yield, elapsed solver cost,
  global priors, context-local observations, cold-start trials, and periodic
  exploration. UNSAT is only a zero-reward observation and never a proof.
  `state_path` uses atomic replacement plus an advisory file lock so local
  MPI workers can share restart-stable evidence; omit it for process-local
  learning. Backend names must be unique.

  Backend calls run concurrently. Every SAT assignment is rechecked by the
  concrete dual-view evaluator; invalid SAT is rejected, duplicate valid models
  are classified separately, and distinct valid models may all enter the
  candidate budget. SAT/UNSAT disagreement is telemetry only: no portfolio
  UNSAT prunes execution or enters an UNSAT cache. Metrics include backend runs,
  SAT/UNSAT/unknown/error, rejected/duplicate models, and disagreements.

  Before enabling a new SMT-LIB backend, run:
    python3 util/string_backend_conformance.py \
      --backend STRING_PORTFOLIO_JSON_OR_PATH --timeout-ms 5000

  The executable gate submits six portable dual-view probes: binary bytes,
  contains plus a BV predicate, negative indexof, atoi, signed strtol10, and
  unsigned strtoul10.
  Every reported SAT assignment must pass the independent concrete evaluator.
  The command emits `symcc-string-backend-conformance-v1` JSON evidence and
  exits nonzero on an empty result, non-SAT result, incomplete model, or semantic
  mismatch. `--solver COMMAND` checks one symcc-query-solver-compatible backend.
  Conformance always bypasses learned selection and executes every backend.

  Worker metrics additionally record selected/skipped backend calls, policy
  updates, forced explorations, and the current number of bounded contexts.

- SYMCC_STRING_SOLVER_QUERY_LIMIT=N (default 4 in the MPI helper, maximum
  256): Maximum number of string-constraint records scanned for one worker
  execution. This bounds the number of string-theory solver calls on targets
  that emit many libc comparison artifacts.

- SYMCC_STRING_SOLVER_CANDIDATES=N (default 8 in the MPI helper, maximum 256):
  Maximum number of string-derived candidates written for one worker execution.

- SYMCC_STRING_SOLVER_TIMEOUT_MS=N (default 250 in the MPI helper, maximum
  60000): Per-query timeout for the string-theory backend. Offline use through
  `util/symcc_string_solver.py` defaults to 1000 ms.

- SYMCC_FAST_SOLVE=0/1 (default 0, QSYM backend): Try the bounded Fuzzy-Sat
  fast path for simple byte and concatenated integer comparisons before Z3.
  Every successful assignment is checked against the concrete expression
  before it is emitted.

- SYMCC_MULTI_SOLVE=0/1/2 (default 0, QSYM backend): Generate related branch
  models as a group. Level 1 recognizes consecutive-byte comparison patterns;
  level 2 additionally enables experimental switch-case and structure-field
  grouping. The adaptive coordinator normally selects this through a tailored
  executor profile.

- SYMCC_EXPR_CACHE_SIZE=N (default 65536, QSYM backend): Maximum entries in the
  expression hash-cons cache. The cache is synchronized and eviction-safe;
  setting a smaller value trades repeated construction for memory.

- SYMCC_DENSITY_OUT=PATH (default empty, QSYM backend): Run the target as a
  dependency-density profiler and write `input_offset branch_count` rows for
  interesting symbolic branches. MPI density balancing and TACE consume
  bounded variants of this profile.


                 Under-constrained execution options


- SYMCC_UCSAN_CONFIG=<path> (compile-time): Enable UCSan-style
  compilation-based under-constrained execution. The compiler renames any
  existing main, creates a self-contained main harness for the configured
  entry function, materializes entry arguments from structured roots, and
  instruments scoped pointer operations with pseudo-pointer shadow metadata.
  The accepted YAML subset is:

      entry: callee
      scope:
        - helper
      external: pure
      externals:
        api_name: arbitrary
      wrappers:
        api_name: wrapper_name

  `external` may be `pure`, `arbitrary`, or `passthrough`. Pure externals
  return structured root values. Arbitrary externals additionally invalidate
  pointer arguments passed to the stub. Wrappers replace the target call with a
  user-provided function of the same LLVM call type.

- SYMCC_UCSAN_ENTRY=<function> (compile-time): Enable the same mode without a
  config file and use this function as the under-constrained entry. This also
  adds the function to the instrumentation scope.

- SYMCC_UCSAN_SCOPE=<function[,function...]> (compile-time): Comma-separated
  additional functions whose pointer operations and call shadow channels should
  be instrumented.

- SYMCC_UCSAN_EXTERNAL=pure|arbitrary|passthrough (compile-time): Default
  external-call policy when no per-function policy or wrapper is configured.
  Native allocation, memory, process-exit, LLVM intrinsic, and SymCC runtime
  calls are passed through by default.

- SYMCC_UCSAN_INPUT=<path> (run time, default SYMCC_INPUT_FILE when unset):
  Structured seed read by the generated harness. Use util/ucsan_seed.py to
  create or inspect seeds. Root ids are entry argument indices. Pointer-object
  paths use `ROOT[/POINTER_FIELD_OFFSET...][@LOWER]`, where LOWER is the
  object's logical lower bound relative to the pseudo pointer. For example,
  `--root 0=0100000000000000 --object 0@-8=...` seeds argument 0 as pseudo
  pointer value 1 and gives its pointee object bytes starting at logical
  offset -8. `--alias PATH[@LOWER]=OBJECT_ID` maps additional paths to an
  existing object. Reusing an object id expresses pointer aliasing/shared
  subobjects; mapping a nested path back to an ancestor's id expresses a cycle.

- SYMCC_UCSAN_DUMP=<path> (run time): Dump the roots and JIT-provisioned
  objects observed during the execution in the same structured seed format.

- SYMCC_UCSAN_SYMBOLIZE=0/1 (default 1): Mark structured root and object bytes
  symbolic at their original seed-file offsets. Set to 0 for concrete
  reproducibility tests.

- SYMCC_UCSAN_MAX_OBJECT=N (default 1048576): Maximum JIT-provisioned object
  size in bytes. Container-of style negative offsets and upper-bound growth are
  allowed as long as the resulting allocation remains under this cap.


                         Hybrid coordinator options


- SYMCC_ADAPTIVE_SCHEDULER=0/1 (default 1): Enable contextual LinUCB seed
  scheduling, the cost-aware solver-strategy portfolio, and bounded path
  replay in mpi_fuzzing_helper.py. Set to 0 for a legacy-policy ablation.

- SYMCC_SELF_CONFIG=0/1 (default 1 with the adaptive scheduler): Enable
  ParaSuit-style online parameter discovery and posterior sampling. The
  coordinator loads `util/self_config_schema.json`, applies its conditional
  parameter DAG, and attributes reward/cost only to parameters actually sampled
  by the assignment token. State is atomically persisted at
  `$AFL_OUT/<symcc-name>/.self_config_state.json`.

- SYMCC_SELF_CONFIG_SCHEMA=<json-or-path> (default
  `util/self_config_schema.json`): Override the versioned
  `symcc-self-config-parameter-schema-v1` registry. Each parameter declares
  `values`, optional numeric `min`/`max`, and optional `active_when` parent
  values. Unknown-parent and cyclic condition nodes are rejected. The normalized
  registry can be inspected with
  `python3 util/self_config.py --print-schema`.

- SYMCC_SELF_CONFIG_SPACE=<json-or-path>: Add or override bounded candidate
  values in the discovered parameter schema. Existing runtime profiles are
  merged as observations, and productive numeric values may expand by one
  bounded half/double step after sufficient evidence.

- SYMCC_SELF_CONFIG_PARAMETERS=N (default 4, maximum 16): Maximum number of
  active parameters sampled in one assignment after condition-graph filtering.

- SYMCC_SELF_CONFIG_SEED=N (default unset): Deterministic RNG seed for
  reproducible parameter-policy runs.

- SYMCC_SELF_CONFIG_PRIOR=<state-json> (default unset): Import global
  parameter/value posteriors from another campaign as a decaying, read-only
  prior. Imported pulls never enter the target campaign's observation counts,
  context posteriors, interactions, or saved local statistics.

  Target-local posteriors are conditioned on bounded program phase
  (`cold/warm/mature`), targeted/non-targeted work, structural-task presence,
  and input-size bucket. Worker rank is deliberately excluded so changing MPI
  parallelism does not fragment learned contexts. Pairwise interaction
  posteriors are capped at 4096 and context strata at 128.

- SYMCC_SIMIFUZZ=0/1 (default 1 with the adaptive scheduler): Enable
  seed-worker contextual scheduling. The pair context combines the ordinary
  seed vector with worker-local yield, cost, previously observed sites and
  paths, structural-region affinity, cross-learning opportunity, and overlap
  with assignments already in flight. DynamiQ structural ownership remains the
  first eligibility boundary; pair scoring chooses among eligible work.

- SYMCC_SIMIFUZZ_SLICE=SECONDS (default 30): Aggregate pair feedback over this
  interval before updating LinUCB. Slice reward combines exact globally new AFL
  bitmap features with worker-local acquisition of already globally known
  branch sites, accepted corpus entries, cost, and the ordinary scheduler
  reward.

- SYMCC_SIMIFUZZ_CANDIDATES=N (default 64, maximum 512): Maximum queued work
  items evaluated per idle worker. Bounding this window keeps pair scoring off
  the MPI master's asymptotic hot path during large queue bursts.

- SYMCC_PREFIX_DAG=0/1 (default 1): Maintain a bounded prefix execution DAG in
  the coordinator. Shared actual prefixes accumulate subtree reward, open
  opposite branches are scheduled explicitly, and SAT/UNSAT/stale target
  summaries retire completed work. Frontier selection uses a UCT-style score
  combining subtree reward, exploration pressure, ColorGo distance, data
  comparison progress, mutation rarity, and historical solver timeout/cost.

- SYMCC_PREFIX_DAG_NODES (default 4096, minimum 128): Maximum number of prefix
  DAG nodes retained in the adaptive scheduler state. When the cap is reached,
  old low-value terminal nodes are evicted first; active nodes are also bounded
  if a target exposes more open prefixes than the budget.

- SYMCC_SELECTIVE_SAMPLING=0/1 (default 1): Let the prefix DAG restrict the
  solver-strategy portfolio for explicit target jobs. Difficult, high-reward
  branches that mutation is unlikely to cover are allowed to use multi-solution
  profiles; easier branches prefer cheaper profiles.

- SYMCC_S2F_DUAL_EXECUTOR=0/1 (default 1): Use an S2F-style exact/tailored
  executor split in the adaptive scheduler. The first attempt at an explicit
  open-prefix target uses the exact Z3 profile; follow-up attempts on hard or
  low-mutation-probability branches can select high-throughput fast/multi-solve
  tailored profiles.

- SYMCC_S2F_SAMPLING_BUDGET (default 2): Maximum early targeted attempts for
  which each prefix can use the sampling executor action. The action-seed tree
  tracks exact, tailored, and sampling attempts, reward, cost, and consecutive
  failures independently; after this sampling-action budget is consumed, the
  branch falls back to exact/tailored profiles.

- SYMCC_S2F_HIGH_QUEUE_FRACTION (default 0.75): Fraction of replay capacity
  assigned to prefixes with productive action history, directed/data progress,
  or path-cover value. Remaining capacity is reserved for the exploratory low
  queue; single-slot selection visits the low queue every fourth dispatch.

- SYMCC_S2F_ACTIONS_PER_SEED (default 16): Maximum branch actions attached to
  one S2F actionseed dispatch. For a selected seed, the coordinator batches
  high-queue open branches as `solve` or `sample` actions and can mark
  lower-value same-seed branches as `skip`, matching S2F's non-sleeping
  high/low queue split without spawning one MPI job per branch.

- SYMCC_S2F_ACTIONS=<path> (worker run time): QSYM actionseed file consumed by
  one execution. Each non-comment row is `branch_id action`, where action is
  `solve`, `sample`, or `skip`. `solve` and `sample` force the branch to bypass
  normal coverage/directed pruning when its prefix is reached; `sample` uses
  the active sampling executor profile, including Pangolin poly-cache samples
  when enabled. `skip` records the branch but suppresses solving for that
  execution. The MPI helper normally writes this file per worker item.

- SYMCC_OPTIMISTIC_FIRST=0/1 (default 0, normally coordinator-managed): Use a
  SYMCTS-style mutation order for one execution. The solver first checks the
  flipped current constraint without the full path prefix; if that optimistic
  query is UNSAT/timeout, it skips the expensive strict solve, otherwise it runs
  the strict path-constrained solve and keeps optimistic fallback output only if
  strict solving fails. Adaptive MPI exposes this as a tailored profile.

- SYMCC_BACKSOLVER=0/1 (default 1): Enable bounded Backsolver-style recovery
  from implicit-flow constraints. The compiler preserves symbolic `select`
  values as ITE expressions and reconstructs ITEs for two-input PHIs or
  3--8-input PHIs in bounded acyclic conditional regions. Nested two-input
  PHIs are recursively folded into nested ITEs. Multi-arm regions use an
  explicit path worklist (at most 64 paths) to reconstruct predecessor
  relevance predicates and a reverse ITE region-state chain, so internal
  choices remain visible when an outer target is solved. PHI incoming values
  may be constants,
  previously available symbolic values, bounded side-effect-free SSA
  computations cloned from the two branch arms, or read-only load snapshots
  proven safe by MemorySSA/AliasAnalysis; ambiguous loads, calls, stores,
  divisions, loops, and non-canonical control flow remain conservative
  fallbacks. A merge-local simple load may additionally recover a two-arm
  write state when its direct MemorySSA definition is a 2--8-input MemoryPhi,
  all incoming definitions resolve to equal-width simple stores, AA proves
  each store MustAlias the load, and every other region write is proven not to
  Mod that location. Data PHIs and MemoryPhis share the same exact
  branch-region partition (at most 32 total blocks and 64 paths). Each
  MemoryPhi incoming may skip at most 8 preceding
  MemoryDefs when AA proves every skipped definition NoMod for the target
  location. The generated ITE carries `symcc.ifss_memory` metadata with stable
  load/controller/store sites; a def-chain proof additionally includes the
  true/false skip counts and nearest-first skipped sites; a multi-arm proof
  records every incoming block/store plus its path and skip counts. MayAlias,
  partial overlap, a ninth definition, volatile, atomic/fence, undef/poison,
  and unknown ModRef fall back without transformation.
  Within one accepted multi-arm data or memory partition, original LLVM
  condition values are deterministically deduplicated before any predicate is
  built. Every condition that needs symbolic synthesis owns an independent
  short-circuit computation and exit PHI; cached RegionValues deliberately do
  not own those instructions. This preserves dominance when several internal
  conditions are reused across multiple enumerated paths. Such expressions
  carry `symcc.ifss_condition` metadata with schema
  `partition-condition-cache-v1`. A condition with no admissible symbolic
  input, or any later synthesis failure, rejects and rolls back the complete
  partition. The cache is local to one merge and does not claim structural
  hash-consing across partitions.
  When the
  strict query containing the recorded path prefix fails and the target
  expression contains an ITE, QSYM enumerates near-current ITE-controller
  outcomes, tries to invert those controllers directly, and validates every
  candidate by replaying the target plus retained independent prefix
  constraints through the lightweight expression evaluator. Only after this
  verified direct path fails does it retry the target with Z3 after dropping
  prefix constraints whose dependencies overlap an ITE controller. This retry
  also runs after a strict UNSAT-core or poly-cache hit.
  Generated inputs use the `-backsolve` suffix and are concretely triaged by
  the MPI worker before entering the shared corpus.

  Tunables:
    SYMCC_BACKSOLVER_CONTROLLERS (default 8, max 12): maximum ITE controllers
      considered for one target.
    SYMCC_BACKSOLVER_CANDIDATES (default 128, max 4096): maximum direct
      controller-candidate validations per target.
    SYMCC_BACKSOLVER_ENUM_BYTES (default 2, max 8): maximum dependent bytes
      covered by the one-byte truth-table fallback.
    SYMCC_BACKSOLVER_ENUM_BUDGET (default 512, max 4096): total fallback
      enumeration budget.

  Setting this option to 0 disables the ITE-specific prefix adaptation, but it
  does not remove ITE expression propagation from compiler instrumentation.
  This implementation covers compiler-visible `select`, canonical
  two-predecessor PHIs, and branch-only single-exit multi-arm regions bounded
  to 3--8 incoming values, 12 expression levels, 32 acyclic basic blocks and
  64 paths. It also supports bounded read-only load snapshots when
  MemorySSA/AliasAnalysis prove that the region has no interfering write or
  escaping alias, plus the strict multi-arm MustAlias write-state case above.
  Multi-arm and memory synthesis require exact structural proofs, independent
  ownership for every cached symbolic condition, and atomically roll
  speculative IR back on a late rejection. It does not claim
  arbitrary IFSS region discovery, multi-location memory state, multi-exit or
  loop state, general/shared-destination switch-edge splitting, ambiguous
  memory, or
  expression substitution across non-canonical control flow.

- SYMCC_IFSS_SWITCH_STATE=0/1 (compile time, default 0): Enable F255 bounded
  switch-to-branch lowering before return-exit lowering and symbolization.
  Eligible switches have 2--8 logical case/default edges and at least two
  unique successors. Every successor must have only the switch controller as
  its unique predecessor block and all arms must either branch unconditionally
  to one exact-predecessor merge or return normally.
  Cases become a deterministic sequence of equality branches followed by the
  default edge; destination PHIs are updated to the corresponding test block.
  Existing data/MemorySSA IFSS state recovery then consumes the branch region.

  Generated comparisons and branches carry `symcc.ifss_switch` metadata with
  schema `bounded-switch-chain-v1`, original switch site, case ordinal/value,
  and arm count. The last branch also carries `symcc.ifss_switch_default`.
  External predecessors, conditional/mixed arms, a ninth logical edge,
  all-edges-to-one-destination switches, EH/address-taken blocks, and unclosed
  merges are unchanged.
  The compatibility default is linear in source case order. F256/F257 add:

    SYMCC_IFSS_SWITCH_MODE=linear|balanced|profile (default linear)
    SYMCC_IFSS_SWITCH_PROFILE=<path>
    SYMCC_IFSS_SWITCH_MANIFEST_OUT=<path>

  `balanced` sorts cases by unsigned APInt value, emits `ule` range nodes and
  exact-equality leaves, and marks them with `bounded-switch-tree-v1`.
  Every leaf miss enters default; a default destination PHI therefore receives
  one copy of its original edge value per leaf predecessor. For seven cases,
  maximum decision depth is four instead of seven, while total comparisons
  increase from seven to thirteen.

  `profile` expects ASCII-space-separated rows:

    <stable-switch-site> <unsigned-decimal-case|default> <positive-weight>

  Comments begin with `#`. A site must have exactly one row for every case and
  one `default` row. The pass computes a deterministic optimal alphabetic
  range tree over the case weights and marks its root with
  `profile-weighted-switch-v1`, including the full profile fingerprint,
  weights, and objective. Missing, unreadable, malformed, duplicate, stale, or
  incomplete input falls back to `balanced` with
  `profile-switch-fallback-v1` metadata. Since one aggregate default count
  contains no value-gap distribution, it is recorded in the proof but is not
  used to choose splits. Unknown mode text falls back to `linear`.

  If an external profile is not configured, or it contains no entry for an
  otherwise eligible site, profile mode may import a valid LLVM
  `!prof branch_weights` vector. Successor zero is default and the remaining
  weights follow source case order. The vector must contain exactly one
  positive weight per logical edge. An explicitly configured unreadable,
  malformed, duplicate, or incomplete external entry is authoritative and
  falls back to balanced instead of silently using LLVM metadata.

  `SYMCC_IFSS_SWITCH_MANIFEST_OUT` appends one
  `symcc-ifss-switch-tree-v1` JSON record per transformed switch. It records
  normalized profile provenance, fallback, objective, complete preorder tree,
  case/destination mapping, original/lowered edge multiplicity, and
  profile/tree fingerprints. Verify one or more JSONL files offline with:

    python3 util/verify_ifss_switch_manifest.py <manifest.jsonl> [...]

  The verifier recomputes saturated optimal-tree DP, every split and
  multiplicity, and both fingerprints. Remove or rotate a shared output before
  a new compilation campaign; output uses append mode.

  These modes do not redistribute an aggregate default weight into generated
  range-branch `!prof` metadata, split shared switch critical edges with
  external predecessors, compress ranges, model indirect control, or summarize
  loop switches.

  F258 accepts multiple case/default edges sharing a destination when LLVM
  PHI multiplicity is exact and all repeated incoming values from the switch
  controller are identical. Linear lowering preserves original multiplicity;
  balanced/profile lowering may increase a shared default destination's
  multiplicity because every equality leaf has a default miss edge. Root
  metadata `shared-switch-edge-split-v1` records original/lowered totals and
  per-destination multiplicities. Rewritten PHIs carry
  `shared-switch-phi-multiplicity-v1`. Shared two-endpoint data and memory
  states use the full path-partition algorithm rather than the direct
  two-branch shortcut.

- SYMCC_IFSS_EXIT_STATE=0/1 (compile time, default 0): Enable F254 bounded
  normal-return exit-state lowering before Hydra, continuation export, and
  regular symbolic instrumentation. Eligible functions have 2--8 distinct
  scalar return states controlled by one branch-only, single-entry, acyclic
  region with at most 32 non-controller blocks and 64 enumerated paths. Every
  path must end in one of the function's returns and every return must be
  reached by the region. The pass redirects those returns to a synthetic
  dispatch block with one `ifss.exit.state` PHI, allowing the existing
  multi-arm IFSS machinery to propagate a return ITE to callers.

  The state PHI and unified return carry `symcc.ifss_exit` metadata with schema
  `bounded-return-exit-state-v1`; each redirected edge carries
  `symcc.ifss_exit_arm` with its ordinal and original return site. Void,
  aggregate/vector, identical-Value, undef/poison, musttail, switch, loop,
  exception/indirect, ninth-exit, address-taken, and unclosed regions fall back
  without CFG changes. This is an opt-in compile-time transformation; runtime
  `SYMCC_BACKSOLVER` independently controls ITE-specific solving. It does not
  support arbitrary continuation identities, live-out tuples, exception
  exits, or multi-location memory state.

- SYMCC_IFSS_CONTINUATION_STATE=0/1 (compile time, default 0): Enable F260
  bounded multi-continuation exit-id/live-out tuple lowering after switch and
  return-exit lowering, but before Hydra, live-continuation export, and regular
  symbolic instrumentation.

  An eligible controller is a conditional branch whose dominated,
  branch-only, acyclic region has 2--8 distinct CFG exit edges, at least two
  continuation destinations, at most 32 region blocks, and at most 64
  enumerated paths. A boundary is a block outside the controller's dominance
  region or a block beginning with PHIs. The pass accepts at most the first
  fully proven region in each function.

  Every destination PHI becomes one tuple slot; the region normally must have
  1--8 integer, floating-point, or pointer slots. When
  SYMCC_IFSS_CONTINUATION_MEMORY=1, a zero-SSA-slot region may proceed so that
  the analysis-backed memory pass can discover memory state. Incoming edge
  multiplicity must exactly match the CFG, repeated predecessor edges must
  carry the same LLVM value, and direct undef/poison is rejected. All checks
  finish before the CFG is modified.

  Accepted exit edges enter per-edge capture blocks and a common dispatch with
  `i8 ifss.cont.exit_id` plus one PHI per live-out slot. A real conditional
  branch chain consumes the exit ID, then per-edge resume blocks return to the
  original destinations. Destination PHIs are rebuilt one logical edge at a
  time. Metadata schema `bounded-continuation-tuple-v1` records controller,
  source-terminator/successor, destination, slot, original PHI, and bounded
  region counts.

  This flag does not enable runtime Backsolver by itself. It does not summarize
  loops, split aggregates, or model exception/coroutine/indirect exits.
  MemorySSA locations require the separate flag below. Unsupported candidates
  retain their original CFG.

- SYMCC_IFSS_CONTINUATION_MEMORY=0/1 (compile time, default 0): Enable F262/F270
  MemorySSA/AA-proven scalar memory slots for regions already lowered by
  SYMCC_IFSS_CONTINUATION_STATE=1. The automatic Function pass runs immediately
  after F260 and before Hydra or symbolic instrumentation.

  A candidate is a used, simple, non-atomic/non-volatile integer,
  floating-point, or pointer load in a continuation destination. Its MemoryUse
  must be defined by the F260 dispatch MemoryPhi. Dispatch capture edges,
  destination resume predecessors, controller identity, exit count and
  destination ordinals must exactly match F260 metadata; external
  predecessors fail closed.

  For every exit that reaches the load's destination, the pass follows at most
  eight MemoryDef links from the corresponding dispatch incoming state. It may
  skip only definitions that AliasAnalysis proves NoMod for the load location.
  The chain may end in an equal-width simple MustAlias store whose instruction
  and stored value dominate the capture. F269 also permits some relevant exits
  to end exactly at Function MemorySSA LiveOnEntry when the load pointer
  dominates that capture and at least one other relevant exit has a proven
  store. F270 may additionally recurse through a non-dispatch MemoryPhi that
  dominates the downstream edge. Each such phi must have 2--4 unique incoming
  blocks; each relevant exit is bounded to four nested phis and 16 provenance
  nodes. Every edge independently applies the same eight-definition NoMod
  bound and must terminate in a store or LiveOnEntry leaf. A recursion active
  set rejects cycles. MayAlias/Mod effects, atomics, fences, a five-arm phi,
  repeated incoming blocks, direct undef/poison, an all-LiveOnEntry candidate,
  or any exceeded bound reject the whole location.

  Each controller carries at most four accepted memory slots. A fifth
  candidate rejects memory lowering for that controller instead of committing
  a partial tuple. Accepted slots are PHIs in the F260 dispatch. A direct store
  leaf contributes its stored operand. A LiveOnEntry leaf gets a path-local
  snapshot load immediately before its capture or MemoryPhi incoming branch;
  it executes only on a path that reaches the original destination. Nested
  provenance is materialized bottom-up as scalar PHIs in the corresponding
  MemoryPhi blocks. Exits for other destinations carry a typed zero/null that
  is never consumed there. The original destination load is retained and still
  executes, but its data uses consume the proven dispatch PHI. A may-write
  instruction before that load in the destination rejects the slot.

  Metadata schema `must-alias-continuation-memory-tuple-v1` records controller,
  slot, destination, load, exit/store and skipped NoMod site identities. This
  remains the all-store form. A mixed store/initial tuple uses
  `must-alias-or-live-on-entry-continuation-memory-tuple-v2`, records a state
  kind and canonical source for every relevant exit, and binds every snapshot
  to the same proof. A tuple containing a nested phi uses
  `bounded-acyclic-memoryphi-continuation-memory-tuple-v3`. Its canonical
  preorder records each node kind/source/NoMod chain plus every incoming block
  site and child ordinal. Manifest/replay validation checks both nested scalar
  PHIs and the dispatch PHI's actual store/snapshot/neutral incoming values.
  Loop-carried/cyclic MemoryPhi, byte-lane partial overlap, symbolic alias,
  aggregate/vector state, atomics, destination write-after entry, and
  cross-function memory are unsupported.

- SYMCC_IFSS_CONTINUATION_MANIFEST_OUT=<path> (compile time, default empty):
  Append one F263 `symcc-ifss-continuation-manifest-v1` JSON record for every
  F260 continuation whose CFG/tuple proof can be replayed at the F262 analysis
  point. The manifest works with memory lowering on or off.

  Before writing, the compiler rechecks canonical exit ordinals, unique
  original terminator/successor edges, capture/resume equality, destination
  partition, scalar slot identities and all bounded counts. For every F262
  memory slot it uniquely locates the source load and reruns the current
  MemorySSA/AA MustAlias/NoMod proof; metadata store and skipped-definition
  sites must exactly equal the recomputed chain.

  All-store records use analysis label `llvm-memoryssa-aa-revalidated-v1`;
  F269 mixed records use
  `llvm-memoryssa-aa-live-on-entry-revalidated-v2`, add a per-slot
  `state_schema` and per-exit `state_kind`, and include those identities in the
  fingerprint. F270 nested records use
  `llvm-memoryssa-aa-nested-phi-revalidated-v3` and add `root_node` plus
  `provenance_nodes`; each record is a bounded canonical tree obtained by
  unfolding the accepted acyclic MemoryPhi provenance. Scalar/exit-only records
  use `structural-only-v1`. Site IDs and `proof_fingerprint` are canonical
  decimal strings. Verify artifacts with:

      python3 util/verify_ifss_continuation_manifest.py <manifest.jsonl>

  The verifier independently recomputes ordinal/count bounds, edge and
  destination partitions, scalar/memory slot structure, NoMod chain bounds,
  v3 node/edge/tree bounds and the full content fingerprint. It does not
  implement LLVM AliasAnalysis.
  Use a fresh path per build and archive the corresponding pre/post IR and
  compiler identity. Appends are not currently locked or atomically sealed
  across concurrent compiler processes; write per-process files and merge only
  after each verifies.

  F264 can bind this manifest to the actual input/output IR, SymCC pass binary
  and LLVM tool with a write-once atomic SHA-256 envelope:

      python3 util/seal_ifss_continuation_artifact.py seal \
        --manifest continuations.jsonl \
        --input-ir input.ll --lowered-ir lowered.ll \
        --compiler build/libsymcc.so --llvm-tool /path/to/opt \
        --output continuations.seal.json

      python3 util/seal_ifss_continuation_artifact.py verify \
        --manifest continuations.jsonl \
        --input-ir input.ll --lowered-ir lowered.ll \
        --compiler build/libsymcc.so --llvm-tool /path/to/opt \
        --seal continuations.seal.json

  The seal records file sizes/SHA-256, ordered proof fingerprints and bounded
  `opt --version` output, then hashes canonical JSON. It uses an advisory lock,
  refuses an existing output, fsyncs a same-directory temporary file, atomically
  renames it and fsyncs the directory. This is local artifact integrity, not a
  cryptographic signature or remote attestation.

  F265 can additionally reconstruct the continuation proof in an independent
  LLVM process using the exact sealed lowered IR, compiler plugin and `opt`:

      python3 util/replay_ifss_continuation_artifact.py \
        --seal continuations.seal.json \
        --manifest continuations.jsonl \
        --input-ir input.ll --lowered-ir lowered.ll \
        --compiler build/libsymcc.so --llvm-tool /path/to/opt

  Replay first performs the full seal verification, then forces continuation
  lowering off and runs only `ifss-continuation-memory` in a fresh `opt`
  subprocess. The pass must reconstruct a verifier-valid manifest whose JSON
  records exactly equal the sealed records. This rechecks current MemorySSA/AA
  semantics; it is not an independent AliasAnalysis implementation.

- SYMCC_IFSS_LOOP_SUMMARY=0/1 (compile time, default 0): Enable F261/F266/F271
  bounded affine natural-loop summarization after switch lowering and before
  return-exit/continuation lowering.

  Eligible loops have exactly one preheader, conditional header, backedge and
  recurrence update block. Without break exits the canonical form has two loop
  blocks. F271 may add up to three linear post-update check blocks, for at most
  five loop blocks total. The header condition must be unsigned `iv < trip`,
  where `iv` starts at zero and advances by a plain integer add of one. The
  trip value must be loop-invariant and have a proven unsigned maximum no
  greater than 8. Supported bound forms are <=3-bit integers, constants,
  freeze, bounded trunc/zext, select, constant-mask and, and positive-constant
  urem.

  The F261 path accepts 1--8 integer state PHIs whose updates are plain
  `state + constant`. F266 additionally accepts 2--4 same-width states up to
  4096 bits when plain add/sub and constant-multiply update DAGs form a
  unit-diagonal upper-triangular affine recurrence with at least one
  cross-state term. Each row has at most 32 expression instructions. Reverse
  dependencies, non-unit diagonal, cross-width state, `nuw/nsw`, memory,
  call, atomic, fence, extra update instruction, undef/poison source,
  unsupported exits, or unobserved state-only loops remain unchanged.

  Accepted states become `initial + trip * step` in the preheader using the
  same modular integer width. The pass redirects the preheader to the exit and
  deletes the now-unreachable header/latch. Generated arithmetic and the
  redirect carry `bounded-affine-loop-summary-v1` metadata with original
  loop/state sites and bounds.

  F266 writes `x'=Ax+b` as a compact nilpotent closed form using
  `A=I+N`, binomial coefficients for `trip<=8`, and compile-time `N^k`.
  Generated values carry
  `bounded-upper-triangular-loop-summary-v1`. Optional recurrence evidence:

      export SYMCC_IFSS_LOOP_MANIFEST_OUT=loops.jsonl
      python3 util/verify_ifss_loop_recurrence_manifest.py loops.jsonl

  The JSONL records base matrix/offset, sites/initial identities, and all
  derived matrix powers and offsets for trip 0 through the proven bound. The
  verifier recomputes modular matrix algebra and the content fingerprint.
  The path is append-only and currently emits records only for the F266
  triangular form; use a fresh file per compiler process.

  F267 also accepts one post-update equality break: after the recurrence,
  the latch may branch to a distinct break exit on `iv == break_at` and
  otherwise continue to the header. `break_at` must be loop-invariant and use
  the induction width. The summary uses
  `break_taken = break_at < trip` and
  `executions = break_taken ? break_at + 1 : trip`. Normal-exit PHIs must
  consume header state; break-exit PHIs must consume latch updates.

  F271 additionally accepts two or three ordered post-update equality checks.
  The update block completes the recurrence, then each check contains only
  `iv == break_at[i]` and a branch whose true edge reaches its unique break
  exit and whose false edge reaches the next check or the header. Every value
  is loop-invariant, uses the induction width, and is free of undef/poison.
  A fourth check, non-equality predicate, reversed edge, repeated exit,
  non-unique chain predecessor, extra check instruction, or wrong live-out
  phase rejects the loop.

  The priority circuit scans checks in CFG order with
  `better[i] = break_at[i] < winner_at`, initially `winner_at=trip`.
  Strict comparison selects the earliest iteration and preserves the lower
  ordinal on ties. It then uses
  `executions = break_taken ? winner_at + 1 : trip` and emits an ordered
  dispatch chain. Normal PHIs consume header-phase summaries; every selected
  break exit consumes the same post-update summary.

  Optional exit-identity evidence:

      export SYMCC_IFSS_LOOP_EXIT_MANIFEST_OUT=loop-exits.jsonl
      python3 util/verify_ifss_loop_exit_manifest.py loop-exits.jsonl

  F267 records use `post-update-equality-break-v1` and the complete bounded
  trip-by-break table. F271 records use
  `post-update-priority-equality-break-v2`, bind two or three ordered
  condition/exit/value identities and all break live-out sites, and enumerate
  the complete bounded trip-by-break-vector table. The largest accepted
  bound has 9^4=6561 rows. The verifier independently recomputes phase
  mappings, lexicographic `(break_at, ordinal)` winners, executions and the
  content fingerprint. This path is append-only and should be fresh per
  compiler process.

  This changes the instrumented CFG and does not claim source-edge coverage
  equivalence. Use original-binary replay for coverage measurement and compare
  this flag under equal outer CPU budgets.

- SYMCC_HYDRA=0/1 (compile time, default 0): Enable F248/F268/F272/F273
  profile-guided
  Hydra-style control-flow melding before live-continuation export and regular
  SymCC instrumentation. The pass transforms at most one eligible site per
  LLVM module. Production builds should always provide a profile or explicit
  site and should use a fresh shared manifest; the replay driver rejects a
  manifest containing more than one transformed site.

- SYMCC_HYDRA_PROFILE=<path> (compile time): Text profile generated by
  `python3 util/hydra_transform.py profile`. Non-comment rows are:

      site score observations interesting solver_time_us

  The compiler chooses the highest-score eligible site not present in the
  denylist. Stable IDs are initialized before transformation and are the same
  IDs exported in runtime `branch_trace`.

- SYMCC_HYDRA_SITE=<uint64> (compile time): Select one exact stable site and
  override the profile for the current compiler invocation. This is intended
  for replay/bisection and bounded experiments.

- SYMCC_HYDRA_MIN_SCORE=<float> (compile time, default 0): Reject profile
  entries below this score. Invalid/non-finite values become 0.

- SYMCC_HYDRA_DENYLIST=<path> (compile time): Newline-separated stable site IDs
  that must not be transformed. `hydra_transform.py campaign` writes this list
  from transformed-only failures for the next compile/explore iteration.

- SYMCC_HYDRA_MODE=safe|aggressive (compile time, default aggressive):
  `safe` accepts only bounded ALU/compare/cast/select/GEP/freeze arms.
  `aggressive` additionally linearizes simple non-atomic/non-volatile loads and
  implements unmatched stores and guarded tree stores with an immediate
  old-value readback. Aggressive
  output is failure-preserving rather than fully semantics-preserving and must
  never be used as the final failure authority.

- SYMCC_HYDRA_MANIFEST_OUT=<path> (compile time): Append one
  `symcc-hydra-transform-v1` JSON record containing module/function/site,
  profile evidence, mode, aligned/extra/load/store/select counts and
  `requires_original_replay`. F268 equal-arm records additionally contain
  `bounded-multiblock-linear-hydra-v1`, ordered arm block sites, complete
  instruction-site/opcode alignment, output PHI sites, a structure fingerprint,
  and `requires_original_coverage_replay=true`. F272 independently permits one
  to four blocks per arm, with at most 64 flattened instructions in each arm;
  the arm block counts may differ. Its
  `bounded-unequal-linear-hydra-v2` record binds left/right block and instruction
  counts, the deterministic `compatible-lcs-left-tie-v2` algorithm, every edit
  slot's opcode/site/block ordinal, one-sided edit distance, output PHIs and a
  complete structure fingerprint. F273
  `bounded-internal-tree-hydra-v3` records additionally bind each side's
  internal-branch and leaf-edge counts, deterministic DFS-preorder
  parent/incoming-edge/successor topology, branch terminator sites, canonical
  merge-leaf edges, and
  `compatible-lcs-tree-preorder-left-tie-v3`. Use a fresh file per complete
  build. The
  replay campaign requires exactly one record so a transformed-only failure
  has a unique denylist site. New manifests can be checked directly:

      python3 util/verify_hydra_transform_manifest.py hydra-manifest.jsonl

  Eligibility is deliberately bounded. A pure linear arm has one to four
  blocks. An internal-tree region has one to seven blocks, at most three
  conditional branches and four merge-leaf edges per arm; all non-root blocks
  have one parent, tree-local reconvergence is forbidden, and all leaves reach
  one common merge. Arm PHIs, block addresses, escaping arm SSA, call/invoke,
  atomic/volatile or unsupported instructions remain forbidden. Loops,
  exception edges, external arm predecessors, a fourth internal branch, a
  fifth leaf, an empty alignment, or more than 64 flattened instructions per
  arm retain their original CFG.
  Inserted selects carry `!symcc.hydra_select`; they preserve ITE dataflow but
  do not become independent `_sym_push_path_constraint` sites. Ordinary source
  selects are unchanged.

- SYMCC_TACE=0/1 (default 1 in the adaptive MPI worker): Enable a two-stage
  TACE-style concrete fast path for large ordinary inputs. The first encounter
  of an input runs QSYM's bounded no-solve dependency profiler; the worker
  caches a sparse focus set by content digest and only symbolizes those bytes
  in the solving execution. An empty/failed profile falls back to full
  symbolization. Explicit target replay and pre-partitioned work bypass this
  path so their symbolic domain is not narrowed.

- SYMCC_TACE_MIN_BYTES=N (default 4096), SYMCC_TACE_PROFILE_TIMEOUT=N
  (default 5 seconds), SYMCC_TACE_CACHE=N (default 2048): minimum input size,
  dependency-profile deadline, and per-worker content-cache bound for the TACE
  path.

- SYMCC_WORKER_DIVERSITY=0/1 (default 0) and SYMCC_FOCUS_PARTITIONS=N
  (default 8): Split large seed work into disjoint byte-focus partitions and
  assign different bounded solver profiles to workers. Unsent partitions stay
  in the carried-work queue so scanning the same seed does not discard them.

- SYMCC_DENSITY_BALANCE=0/1 (default 0): When worker diversity is enabled,
  perform a bounded no-solve dependency-density profile before partitioning.
  Hot input bytes are isolated into narrower partitions; failures and exhausted
  per-round profiling budgets fall back to equal-width splitting.

- SYMCC_KSCHED=0/1 (default 0): Add a K-Scheduler-style rarity frontier score
  to candidate seeds. The coordinator obtains bounded afl-showmap edge sets,
  weights each observed edge by `1 / (frequency + 1)`, caches the score by input
  digest, and gracefully returns zero when the showmap budget is unavailable.

- SYMCC_BRANCH_SHARE=0/1 (default 0): Enable BSFuzz-style sharing of timed-out
  branch sites. Each worker writes `SYMCC_TIMEOUT_OUT`; the coordinator merges
  these sites into `.skip_sites`, and later workers consume it through
  `SYMCC_SKIP_SITES`. This skips repeated expensive attempts but remains opt-in
  because a site-level timeout summary is coarser than a full constraint
  context.

- SYMCC_TIMEOUT=SECONDS (default 30 in the MPI helper): Per-work-item execution
  deadline. The worker reports timeout/killed and the original signed return
  status in engine-neutral telemetry.

- SYMCC_STATIC_DEPENDENCE_OUT=<path> (compile time): Emit a zero-execution
  LLVM dataflow summary mapping branch/select/switch site ids to statically
  known input-byte intervals. The analysis recognizes common stream/socket
  input APIs and `_sym_make_symbolic`, propagates constant-GEP loads through
  SSA, and omits unknown offsets rather than inventing dependencies.

- SYMCC_STATIC_DEPENDENCE=<path> (MPI master): Load the static summary. Once a
  prefix trace identifies the static site behind an open branch, targeted
  replay receives that site's sparse focus set before another solver attempt.

- SYMCC_STATIC_FOCUS=0/1 (default 0): Aggressively use the union of all bounded
  static dependencies as the initial focus set before execution feedback. This
  is opt-in because indirect input wrappers or unknown offsets can make a
  whole-program static summary incomplete.

- SYMCC_EDGE_DEPENDENCE=0/1 (default 1): Maintain a SYMCTS-style
  edge-dependence coverage matrix for the concolic side. The coordinator tracks
  min/max branch-count cells per branch-pair context and schedules corpus inputs
  from under-explored rows when AFL is not providing enough fresh work.

- SYMCC_EDGE_DEP_BRANCHES / SYMCC_EDGE_DEP_CELLS / SYMCC_EDGE_DEP_TRACE
  (defaults 4096 / 262144 / 128): Bounds for the edge-dependence scheduler:
  retained branch rows, retained branch-pair cells, and maximum telemetry trace
  entries consumed per execution.

- SYMCC_DIRECTED_SITES=ID[,ID...] (default empty): Optional directed hybrid
  mode. Prefix-DAG nodes whose branch site id matches this set get additional
  replay priority, and seeds whose telemetry reaches a target site receive a
  contextual scheduling bonus. Values may be decimal or 0x-prefixed integers.

- SYMCC_DIRECTED_DISTANCE=<path> (default empty): Optional directed hybrid
  distance map. The file may be JSON (`{"distances":{"site":distance}}`) or text
  lines such as `0x401234 3.5`; seeds reaching lower-distance sites receive a
  stronger scheduling bonus. `benchmark/run_benchmark.py --directed-distance`
  sets this variable.

- SYMCC_DYNAMIC_COLORATION=0/1 (default 1): Enable coordinator-side
  ColorGo-style dynamic feasibility. Prefix-DAG nodes keep an online
  color_feasibility estimate, a cost-aware MDP value, target infeasibility
  streaks, and solver-cost pressure derived from branch telemetry. The MPI
  scheduler uses those values to favor prefixes that still appear target
  feasible and to demote expensive/stale prefixes. This is a soft scheduling
  signal by default; QSYM hard pruning still requires SYMCC_DIRECTED_PRUNE.

- SYMCC_COLORGO_GAMMA (default 0.82): Discount used by the PrefixDAG Bellman
  backup when propagating child frontier value to parent prefixes.

- SYMCC_COLORGO_MIN_FEASIBILITY (default 0.04): Reporting threshold for
  snapshot counts of dynamically feasible prefixes.

- SYMCC_TACO=0/1 (default 1): Enable TACO-Fuzz-style target-centric seed
  selection inside the prefix DAG. The coordinator tracks target-path visits,
  target-distance progress, and path reward, then boosts under-explored
  near-target paths instead of ranking only by raw seed freshness.

- SYMCC_TACO_EXTENDED_CONDITIONS=0/1 (default 1): When a seed is selected for
  targeted replay, batch same-seed high-queue open branches into the S2F
  actionseed. This approximates TACO-Fuzz's extended path conditions: the
  runtime receives multiple target-centric branch actions for one execution
  and can solve/sample them as their prefixes are reached.

- SYMCC_MULTIGO=0/1 (default 1): Enable MultiGo-style multi-path optimization.
  PrefixDAG maintains per-site execution frequency and estimates target-path
  difficulty with a Poisson exploration model. Path scheduling combines
  difficulty, under-exploration, target distance, and prior reward so the
  hybrid loop can alternate between easy target-reaching paths and harder
  non-optimal paths that preserve target-directed diversity.

- SYMCC_MULTIGO_POISSON_SCALE (default 3.0): Scale parameter used when
  converting site frequency into Poisson exploration probability for path
  difficulty.

- SYMCC_MULTIGO_EXPLORE_FRACTION (default 0.35): Fraction of PrefixDAG
  selection epochs that emphasize difficult/under-explored target paths rather
  than near-target exploitation.

- SYMCC_DIRECTED_PRUNE=0/1 (default 0): Runtime directed pruning for QSYM.
  When enabled with SYMCC_DIRECTED_DISTANCE, the solver skips Z3 attempts for
  branch sites whose static distance is greater than SYMCC_DIRECTED_MAX_DISTANCE.
  Coverage bookkeeping still runs; only testcase generation for pruned sites is
  suppressed.

- SYMCC_DIRECTED_MAX_DISTANCE (default 32.0): Static distance threshold used by
  SYMCC_DIRECTED_PRUNE. Set it to 0 for target-block-only solving, or increase
  it to keep a wider target frontier.

- SYMCC_DIRECTED_PRUNE_UNREACHABLE=0/1 (default 0): If enabled, QSYM also skips
  branch sites absent from the directed distance map once the map has at least
  one valid row. This is aggressive and is intended for complete whole-program
  coloration maps.

- SYMCC_COLOR_TARGETS=<spec[,spec...]> and SYMCC_COLORATION_OUT=<path>
  (compile-time): Emit a ColorGo-style static distance sidecar while compiling a
  SymCC target. Specs may be function names, `file:line` source locations, or
  numeric site ids. The compiler builds a module-level CFG plus direct-call and
  bounded indirect-call over-approximation, computes reverse distance to the
  targets, and writes `site distance` rows that can be fed to
  SYMCC_DIRECTED_DISTANCE. The sidecar also contains comment-prefixed block,
  call, entry/exit, and site summaries; util/merge_directed_distance.py merges
  multi-module fragments into a whole-program distance map. The benchmark
  wrapper's `--directed-targets` option runs this merger per built-in target and stores
  `<target>.directed_distance` beside the binary.

- SYMCC_CONCURRENCY_OUT=<path> (compile-time): Emit Schfuzz-style
  concurrency guidance. The compiler identifies pthread/C11 thread lifecycle
  calls, mutex/rwlock/condition/barrier/semaphore calls, LLVM atomic loads,
  stores, rmw/cmpxchg, and fences. The sidecar contains `#CONC` annotation rows
  and numeric `site distance` rows for conditional branches that can reach those
  concurrency sites.

- SYMCC_CONCURRENCY_GUIDANCE=<path> (default empty): Load a concurrency
  guidance sidecar in the adaptive coordinator. Prefix-DAG and ordinary seed
  ranking treat lower-distance branch sites as higher priority, complementing
  directed target guidance without requiring a deterministic thread scheduler.
  The coordinator also maintains a hierarchical concurrency replay layer:
  seeds that reach lower-distance concurrency frontiers are replayed first, and
  their open opposite branches are targeted before falling back to ordinary
  edge-dependence replay.

- SYMCC_COLOR_INDIRECT=0/1 (default 1) and SYMCC_COLOR_INDIRECT_LIMIT (default
  64): Control ColorGo-style indirect-call over-approximation. The compiler adds
  address-taken functions with compatible call signatures as possible callees,
  capped per indirect call by the limit.

- SYMCC_TASK_GRAPH_OUT=<path> (compile-time): Emit the block, function, call,
  entry/exit, and branch-site summaries needed for DynamiQ-style structural
  task allocation even when no directed target is configured. Multi-module
  fragments can be merged with util/merge_directed_distance.py.

- SYMCC_TASK_GRAPH=<path> (default SYMCC_DIRECTED_DISTANCE when set): Load a
  compiler task graph in the adaptive coordinator. Mutually recursive functions
  are collapsed into deterministic call-graph regions; branch telemetry maps
  prefix targets and corpus inputs to those regions.

- SYMCC_STRUCTURAL_TASKS=0/1 (default 1): Enable feedback-driven structural
  worker ownership when a task graph is available. Every branch-bearing region
  has an owner, productive and under-explored regions receive more workers, and
  completed-run reward, cost, coverage gain, and stagnation trigger periodic
  reallocation. Unknown tasks remain globally runnable and a heavily backlogged
  queue permits controlled work stealing.

- SYMCC_TASK_REBALANCE_INTERVAL (default 30 seconds): Minimum interval between
  structural ownership recomputations. A change in the active-worker limit
  forces an immediate recomputation.

- SYMCC_TASK_CORPUS_PER_REGION (default 8): Number of recent productive seeds
  retained in each structural region's persistent feedback state.

- SYMCC_PATH_COVER=0/1 (default 1 when a task graph is available): Enable
  Empc-style path prioritization. Function-local CFG loops are collapsed into
  SCC nodes, multiple minimum path covers are computed with maximum bipartite
  matching, and prefix targets receive a score based on active-cover support
  and uncovered components. Runtime traces narrow the covers compatible with a
  seed. UNSAT, timeout, and stale targeted paths retire incompatible covers and
  boost predecessor branch states found by bounded dependence traversal.

- SYMCC_MPC_COVERS=N (default 8): Maximum number of distinct minimum path
  covers retained per function. Alternatives are enumerated with bounded
  matched-edge exclusion, avoiding full path enumeration.

- SYMCC_MPC_FUNCTION_NODES=N (default 4096): Maximum basic blocks analyzed in
  one function for path-cover construction. Larger functions keep the ordinary
  PrefixDAG policy rather than blocking compilation or coordinator startup.

- SYMCC_REPLAY_COOLDOWN (default 30): Minimum seconds before a productive or
  difficult seed can be replayed when no fresh cross-seeds are available.

- SYMCC_DAG_REPLAY_SHARE (default 0.25, range 0.0-0.75): Reserve this fraction
  of active SymCC worker capacity for explicit prefix-DAG targets even while AFL
  is still producing fresh queue entries. This prevents the symbolic side from
  sleeping behind local pruning without letting replay consume all workers.

- SYMCC_TARGET_BRANCH (default empty, normally coordinator-managed): Decimal
  prefix-sensitive open-branch identifier to solve during this execution. The
  QSYM runtime sets target_reached in its telemetry when the exact path prefix
  and opposite branch are encountered. Direct use is intended for experiments;
  mpi_fuzzing_helper.py assigns targets automatically.

- SYMCC_OBJECT_TRANSPORT=0/1 (default 1): Send MPI work inputs as SHA-256
  content-addressed objects. Workers materialize missing objects locally, which
  removes the assumption that every rank can dereference the master's filesystem
  path. If disabled, the helper falls back to path-based transport.

- SYMCC_MAX_TRANSPORT_INPUT (default 16777216): Maximum input size, in bytes,
  sent through the content-addressed MPI object protocol. Oversized inputs fall
  back to path-based dispatch on same-node runs.

- SYMCC_BITMAP_DELTAS=0/1 (default 1): Synchronize AFL coverage from master to
  workers using versioned sparse byte-bit deltas. Workers receive a full bitmap
  snapshot only when they fall behind the bounded delta journal or when this
  option is disabled.

- SYMCC_BITMAP_HISTORY (default 64): Number of bitmap delta versions retained
  by the master before forcing lagging workers to refresh from a full snapshot.

- SYMCC_BITMAP_SHARDS=N (default 1): Partition the master's sparse bitmap delta
  journal by AFL bitmap index. Payloads remain equivalent to the unsharded
  bitmap stream; sharding bounds per-journal state and prepares distributed
  coordinators that own disjoint coverage partitions.

- SYMCC_PERSISTENT_STATE=0/1 (default 1), SYMCC_STATE_SHARDS=N (default
  min(64, worker count)): Persist analyzed input SHA-256 digests in deterministic
  shard logs under the SymCC output directory. Restoring these logs avoids
  immediately re-analyzing the same corpus after helper restarts.

- SYMCC_STATE_PARALLEL=0/1 (default 1), SYMCC_STATE_TASK_SHARDS=N (default
  min(256, 4*worker count)), SYMCC_STATE_STEAL_WINDOW=N (default 64): Enable
  seed-replay task sharding in the MPI master. A work
  item is identified by immutable input digest/path, focus slice, target branch,
  and S2F actionseed; the coordinator hashes that state into deterministic
  shards, assigns shard owners to workers, prefers owner-local dispatch, and
  permits bounded work stealing from the ready queue. State-task reward and
  leases are persisted in `.state_tasks.json`. Future live-state engines may
  attach a canonical `symcc-live-continuation-v1` descriptor containing PC
  frames and content-addressed path/store/memory roots; current MPI replay mode
  still does not suspend a process or transport concrete symbolic-memory pages.

- SYMCC_RESUME=0/1 (default 0): Allow mpi_fuzzing_helper.py to reuse an existing
  SymCC output directory. When enabled, scheduler state, analyzed-hash shards,
  state-task shards, and unfinished work leases are restored instead of aborting.

- SYMCC_WORK_LEASES=0/1 (default 1) and SYMCC_WORK_LEASE_TTL (default
  max(120, 4*SYMCC_TIMEOUT) seconds): Persist dispatched but unfinished MPI work
  items in an append-only recovery journal. On resume, stale leases whose input
  files still exist are requeued before fresh AFL seeds.

- SYMCC_MULTI_MASTER_LEASES=0/1 (default 0): Enable a shared fenced lease table
  for deployments with multiple MPI masters/coordinators writing to the same
  SymCC output tree. Before dispatch, a master must atomically claim the work id
  and receive a fencing token. Worker results complete the shared lease only if
  that token still matches, so a stale master cannot mark work done after another
  master has stolen the expired lease.

- SYMCC_MULTI_MASTER_LEASE_DIR=PATH (default
  "$AFL_OUT/<symcc-name>/.work_lease_table"): Directory for the shared fenced
  lease table. Each work id is stored in a deterministic shard as a small JSON
  record; short-lived per-work lock directories serialize claim/complete
  updates, while long-running worker executions are protected by fencing tokens
  rather than filesystem locks.

- SYMCC_MULTI_MASTER_LEASE_SHARDS=N (default 256), SYMCC_MASTER_ID=ID (default
  hostname:pid), and SYMCC_MULTI_MASTER_LOCK_TTL=SECONDS (default 30): Tune the
  shared lease shard count, owner identifier, and stale update-lock cleanup
  threshold. Active leases are heartbeated by the master at roughly one third of
  SYMCC_WORK_LEASE_TTL, capped at 30 seconds.

- SYMCC_COVERAGE_GOSSIP=0/1 (default 1 when multi-master leases are enabled):
  Use persistent coverage-owner shards for final AFL bitmap novelty decisions.
  Each candidate bit is committed under a short shard lock against one
  authoritative OR-state, making hit-count bucket novelty globally unique even
  when coordinators triage identical candidates concurrently. Coordinators
  periodically pull newer shard epochs into their local bitmap and worker delta
  journals.

- SYMCC_COVERAGE_OWNER_DIR=PATH (default
  "$AFL_OUT/<symcc-name>/.coverage_owner") and
  SYMCC_COVERAGE_OWNER_SHARDS=N (default max(16, SYMCC_BITMAP_SHARDS)):
  Shared location and shard count for authoritative coverage state. The current
  implementation requires a filesystem with atomic mkdir/rename semantics.

- SYMCC_COORDINATOR_INDEX=N (default 0), SYMCC_COORDINATOR_COUNT=N (default 1),
  and SYMCC_COVERAGE_OWNER_TTL=SECONDS (default 30): Identify coordinators and
  control heartbeat failover. Shard modulo coordinator count names the preferred
  live owner; another coordinator may proxy an OR-commit while holding the
  shard lock, preserving progress when the preferred owner is unavailable.

- SYMCC_DPOR=0/1 (default 0): Enable bounded schedule exploration for pthread
  targets in the MPI helper. The master injects util/symcc_schedule_rt.c through
  LD_PRELOAD for worker executions, records synchronization traces, and queues
  logical-thread-id replay prefixes for dependent scheduling points on the same
  mutex/rwlock/condition/join object. This is a fuzzing-oriented bounded-DPOR
  layer: it seeks coverage-diverse interleavings and deliberately bounds depth,
  backtracking window, and pending queue size rather than attempting exhaustive
  model checking. When `SYMCC_DPOR_MEMORY`/`SYMCC_SCHEDULE_MEMORY` are enabled,
  the Python explorer also consumes compiler-emitted `read`/`write` trace rows,
  annotates them with SC vector-clock happens-before and locksets, and can
  generate causal source-set replay prefixes for unprotected memory conflicts.
  Explorer state schema v4 persists bounded sleep sets, ordered wakeup-tree
  leaves, observed Mazurkiewicz-equivalence digests, and ConDPOR-style revisit
  identities. Each schedule artifact contains checked
  `symcc-bounded-source-dpor-v1`, `symcc-bounded-wakeup-tree-v1`, and
  `symcc-bounded-condpor-graph-v1` certificates. This remains a bounded fuzzing
  mode: it does not claim unbounded soundness, completeness, or optimality.

- SYMCC_DPOR_WAKEUP_TREE=0/1 (default 1): Enable ordered bounded wakeup-tree
  insertion. The checker implements the Optimal-DPOR weak-initial recursion
  over deterministic per-thread next events, rejects sleep-set and earlier-leaf
  equivalents, and consumes cooperative runtime-ready snapshots when complete
  evidence exists. This proves only the recorded bounded-tree invariants, not
  whole-program Optimal-DPOR optimality.

- SYMCC_DPOR_CONDPOR_GRAPH=0/1 (default 1): Build the bounded execution graph
  used for ConDPOR-style backward revisits. The graph records stable nodes,
  program order, observed/inferred read-from, per-object coherence, add order,
  causal-successor deletion, deterministic bounded maximal extensions, and
  cross-trace revisit identities. Revisit replay prefixes share the existing
  Source-DPOR queue. Changed read values may alter later control flow, so
  observed suffix restoration is evidence for this bounded trace only and is
  not a complete ConDPOR interpreter.

- SYMCC_SCHEDULE_PRELOAD=PATH (default auto-detect build/libsymcc_schedule_rt.so):
  Path to the native schedule runtime used when SYMCC_DPOR=1. The runtime
  intercepts pthread_create, mutex lock/trylock/unlock, rwlock rd/wr/unlock,
  condition wait/signal/broadcast, join, detach, and cancellation. It writes
  "seq tid op object"
  rows to SYMCC_SCHEDULE_TRACE and consumes one tid per line from
  SYMCC_SCHEDULE_PREFIX. Created threads receive monotonically allocated logical
  ids. The same logical id is used as the object for `create`,
  `create_success/create_fail`, `thread_start/thread_exit`, join/detach/cancel
  outcomes, and `thread_retire`, avoiding process-address or opaque-pthread-
  handle identity in lifecycle constraints. The fixed 4096-entry mapping table
  reserves a logical identity before create, binds the handle after success,
  releases joinable entries after successful join, and releases detached
  entries only after both detach and exit. `join_cancelled` preserves the target
  mapping so another thread can still join it.

- SYMCC_DPOR_MEMORY=0/1 (default 0 at compile time): Ask the SymCC compiler
  pass to insert `_sym_notify_schedule_read/write` calls around non-atomic,
  non-volatile LLVM loads and stores. This is intentionally separate from
  SYMCC_DPOR because memory tracing can be very high overhead.

- SYMCC_SCHEDULE_MEMORY=0/1 (default 0 at runtime): Enable the schedule preload
  runtime to turn compiler-emitted memory notifications into `read`/`write`
  trace rows. `SYMCC_DPOR_MEMORY=1` at runtime is also accepted as a shorthand
  for this switch. Without the preload runtime these notification calls resolve
  to no-op functions in the normal SymCC runtime.

- SYMCC_SCHEDULE_MEMORY_BYTES=N (default 8, maximum 4096): Maximum number of
  byte-granular objects emitted for one load/store notification. Byte-granular
  rows let the Python HB/lockset analyzer identify overlapping memory
  conflicts while bounding trace growth.

- SYMCC_SCHEDULE_MEMORY_FILTER=none|stack|owner|shared|dynamic|all (default
  none): Optional provenance filters for compiler-emitted schedule memory
  notifications. `stack` suppresses accesses whose address falls in the current
  thread's pthread stack range. `owner`, `shared`, and `dynamic` enable a
  bounded dynamic ownership table: first same-thread accesses are remembered but
  not logged; when a different logical thread first touches the same byte, the
  runtime marks it shared and emits a compressed prior-access row plus the
  current row when at least one side is a write. `all` combines stack and owner
  filtering. These filters reduce trace volume for experiments; they are not a
  sound alias/provenance analysis.

- SYMCC_SCHEDULE_MEMORY_STACK=0/1 and SYMCC_SCHEDULE_MEMORY_OWNER=0/1 (default
  0): Explicit aliases for enabling the stack and dynamic-owner filters without
  parsing `SYMCC_SCHEDULE_MEMORY_FILTER`.

- SYMCC_SCHEDULE_MEMORY_PROVENANCE=0/1 (default 0): Append a compatible fifth
  trace-field tag to memory rows, such as `prov=stack`, `prov=heap`,
  `prov=module`, `prov=anonymous`, `prov=system`, or `prov=unknown`. The stack
  classification uses pthread stack bounds; the remaining classes come from a
  bounded `/proc/self/maps` lookup. `SYMCC_SCHEDULE_MEMORY_FILTER=tag`,
  `tags`, or `provenance` is accepted as a shorthand. Python trace parsing keeps
  these tags in `ScheduleEvent.tags`; schedule artifacts expose
  `provenance_counts`, and joint schedule/query validation propagates the same
  counts for benchmark stratification.

- SYMCC_SCHEDULE_MEMORY_OWNERS=N (default 65536, maximum 1048576): Number of
  entries in the dynamic owner table. Collisions beyond the bounded probe window
  fall back to logging the access, preserving evidence rather than silently
  dropping potentially shared memory events.

- SYMCC_SCHEDULE_CONSTRAINT_OUT=PATH (default empty): When SYMCC_DPOR is
  enabled, append one `symcc-schedule-constraint-v1` JSONL artifact per
  observed schedule trace. Each record contains the normalized trace digest,
  target branch, current replay prefix, bounded schedulable-event summary,
  SC/HB conflict summary, the replay prefixes generated from those conflicts,
  and checked Source-DPOR, wakeup-tree, and bounded ConDPOR execution-graph
  certificates. This artifact is for reproducible experiments and later joint
  input/schedule solving; it is not a proof of exhaustive or optimal DPOR.

- SYMCC_SCHEDULE_SMT_OUT=PATH (default empty): When SYMCC_DPOR is enabled,
  append one `symcc-schedule-smt-v7` JSONL artifact per observed schedule
  trace. The artifact stores one shared SMT-LIB2 QF_LIA base context plus a
  delta for each conflict-derived replay prefix and a ready-to-run incremental
  `push/check-sat/pop` script. `materialize_schedule_smt_query()` can combine
  the base and one delta into a standalone query. Hard constraints encode a
  position permutation, memory-model-aware program order, exact next-event bindings for
  the replay thread prefix, reversal of its source conflict, complete
  mutex/rwlock critical-section nonoverlap, and condition-wait mutex
  release/reacquire lifetimes. Complete thread evidence additionally requires
  create before child start and target exit before successful join return.
  Vector-clock happens-before edges and
  signal/broadcast wake explanations are emitted as optional Boolean
  assumptions because those synchronization edges or spurious wakeups may
  change under replay. F58 additionally puts bounded read-from/coherence
  constraints for tagged memory events into the authoritative base formula
  under the selected SC, TSO, or RA subset. General runtime enabledness,
  unobserved aliases, and untagged concrete values remain outside the formula,
  so SAT means bounded model admissibility rather than concrete schedule
  reachability. The reader accepts v1 through v7 artifacts for backward
  materialization compatibility.

- SYMCC_SCHEDULE_SMT_MAX_EVENTS=N (default 128, minimum 2, maximum 512):
  Bound the schedulable events represented by each schedule-SMT query. A replay
  candidate whose source-conflict endpoints fall outside this window is not
  emitted as a partial query; the artifact increments `dropped_query_count`
  and sets its truncation flags instead.

- SYMCC_SCHEDULE_SMT_MAX_QUERIES=N (default 64, minimum 1, maximum 512):
  Bound the conflict-derived SMT query deltas exported for one observed trace.
  Additional source-style replay candidates remain available to the DPOR queue,
  but the SMT artifact increments `dropped_query_limit_count` and sets its
  query truncation flag. The artifact stores one shared base context plus
  bounded per-candidate deltas, so this limit controls evidence volume without
  changing schedule exploration.

- SYMCC_SCHEDULE_MEMORY_MODEL=SC|TSO|RA (default SC): Select the authoritative
  bounded memory consistency constraints embedded in each schedule-SMT
  artifact. SC uses a global order and last-write read-from. TSO relaxes
  store-to-load global program order while enforcing same-thread store
  forwarding and FIFO stores. RA uses per-location modification-order ranks,
  read-from, program-order/happens-before closure, and release-write to
  acquire-read synchronization for events tagged
  `mo=relaxed|release|acquire|acq_rel|seq_cst`. Non-SC certificates cannot be
  materialized as pthread-only replay prefixes because that runtime does not
  control hardware memory propagation. RA is a research subset, not full
  C11/C++ atomics: fences, release sequences, RMW, mixed-size accesses,
  non-atomic race UB, and the global seq_cst order are not encoded.

  Schedule SMT uses the portable SMT-LIB signed-integer form for read-from
  initial-source sentinels: `(- 1)`, never the Z3-tolerated bare token `-1`.
  The same printer is used by SC/TSO domains, RA coherence, RMW/seq_cst
  constraints and Query-IR read-value bridges. Research evidence runs every
  installed backend and treats parse errors as failures; current executable
  gates agree on SC=UNSAT and TSO/RA=SAT under system libz3 and cvc5 1.1.2.

- SYMCC_SCHEDULE_SMT_MAX_MEMORY_EVENTS=N (default 32, minimum 0, maximum 64):
  Bound read/write events receiving read-from and coherence variables. Memory
  events outside this cap are recorded as truncation metadata and cannot
  support a full-memory-semantics claim for that trace. Keeping this bound
  separate from `SYMCC_SCHEDULE_SMT_MAX_EVENTS` makes weak-memory formula growth
  explicit in benchmark artifacts.

- SYMCC_SCHEDULE_SMT_SYNC_STATE=0/1 (default 1): Extend
  `symcc-schedule-smt-v7` with bounded mutex/rwlock, condition-variable, and
  thread lifecycle state. The
  exporter pairs pre-call `lock`/`trylock`/`rdlock`/`wrlock` events with their
  `acquire` or failure outcome and a matching `unlock`/`rwunlock`. Only
  critical sections whose acquire and release both occur inside the bounded
  lifecycle window become hard constraints. Incompatible complete sections on
  the same object must not overlap; two `rdlock` sections may overlap. The
  relative order of controlled lock attempts is linked to schedule `pos_*`
  variables, while lifecycle outcomes and releases use `sync_ord_*` variables.
  A `trylock_fail` busy explanation is emitted as an optional assumption and
  is not asserted by default. Open, unmatched, or truncated lifecycles are
  counted in `sync_state` metadata but do not create hard exclusion constraints,
  avoiding false UNSAT from incomplete evidence.

  `pthread_cond_wait` and `pthread_cond_timedwait` additionally emit
  `wait_mutex_release` before blocking and `wait_mutex_acquire` after a normal
  wake or timeout. The exporter closes the waiter's pre-wait mutex section and
  opens a new reacquired section. A successful `wake` receives an optional
  `cond_wake_signal_*` assumption whose integer witness must select a matching
  `signal` or `broadcast` between release and reacquire. One `signal` witness
  cannot serve two asserted wakes, while a `broadcast` witness may be reused.
  The assumption is not asserted by default, preserving POSIX spurious-wakeup
  behavior; timed-out waits never receive a signal witness. The lifecycle
  model also pairs successful create/start/exit, mapped join/detach/cancel
  outcomes, join cancellation, and explicit identity retirement events.
  A child may start before `pthread_create` returns, but never before the
  pre-call create marker; a join attempt may precede target exit and block, but
  `join_success` must follow `thread_exit`. Create and join failures, unmapped
  handles, missing exits, and truncated lifecycles are counted without adding
  hard completion constraints. A cancelled join does not consume the target or
  merge its exit clock. Complete retirement evidence requires target exit and
  the successful join, successful detach, or detached-create trigger to precede
  `thread_retire`. Vector clocks propagate parent state at `thread_start` and
  child completion only at `join_success`.

  The lifecycle window is five times `SYMCC_SCHEDULE_SMT_MAX_EVENTS`, capped at
  512, to accommodate create/start/exit/join/outcome evidence. Set this option
  to 0 to retain the F45 structural event-order model inside the v7 artifact.

- SYMCC_SCHEDULE_SMT_ORDER_ENCODING=partial|permutation (default partial):
  Select the ordering representation for `sync_ord_*` lifecycle events. The
  default `partial` mode declares unbounded integer ranks and emits only strict
  program-order, schedule-link, ownership, wake, create, and join edges. It
  omits per-event `0..N-1` bounds and the global `distinct` constraint.
  Since v6 each controlled lifecycle rank is linked by one scaled anchor
  `sync_ord_i = (L+1) * pos_j`, replacing the former quadratic pairwise links.
  The scale leaves at least L integer slots between adjacent controlled events,
  enough to embed every bounded non-controlled lifecycle event while preserving
  strict order. Any satisfying rank model therefore defines an acyclic partial
  order that can be topologically extended to a total lifecycle order. The
  schedulable `pos_*` variables remain a bounded permutation because replay
  slots require exact positions.

  `permutation` preserves the v4-style bounded all-different lifecycle model
  and pairwise links for differential validation and ablation. Artifacts record
  `lifecycle_order_encoding`, `linear_extension_semantics`,
  `order_link_encoding`, semantic-pair/actual-link counts, anchor stride, and
  bound/distinct counts. Unknown values conservatively fall back to `partial`.

  Every current artifact also contains `symcc-lifecycle-order-ir-v1` and a checked
  `symcc-lifecycle-linear-extension-v1` certificate for the observed trace.
  `schedule_linear_extension_certificate()` can consume complete `pos_*` and
  `sync_ord_*` model assignments, optionally recheck a query's replay slots and
  conflict reversal, select satisfied nonoverlap directions, construct a
  deterministic topological order, and project it to controlled logical thread
  IDs. `verify_schedule_linear_extension_certificate()` independently checks
  the event-position permutation and program order, source ranks,
  fixed/selected edges, scaled anchors, total-order preservation, query
  bindings, digest, and replay projection.

  To materialize a runtime prefix:

      python3 util/symcc_schedule_linearize.py schedule-smt.jsonl \
        --model schedule-model.json --query-index 0 \
        --prefix-out schedule.prefix \
        --certificate-out schedule-certificate.json

  The model JSON must contain `event_positions` and `lifecycle_ranks`, either
  as arrays or maps keyed by `pos_i` and `sync_ord_i`. Omitting `--model`
  materializes the embedded observed certificate. Certificates cover the hard
  lifecycle/order IR and the selected query only; optional observed-HB,
  trylock-busy, condition-wake assumptions, path feasibility, and concrete
  runtime reachability remain outside this certificate. A query whose replay
  slots or conflict endpoints include memory read/write events is still
  certifiable as an SMT order, but is marked `runtime_replayable=false`;
  the pthread prefix writer and CLI reject it because the preload runtime
  directly controls pthread scheduling points, not memory accesses.

  v7 stores an authoritative exact `base_smt2` and a hashed
  `relaxed_base_smt2` that omits complete-section nonoverlap choices. The
  relaxed base is internal to the direct solver only: after each SAT check,
  model ranks are checked against every structured choice and violated
  disjunctions are asserted as libz3 ASTs before re-checking. Only a model with
  no remaining violation can produce a certificate. External materialization
  and `incremental_smt2` continue to use the exact base.

  To solve directly with system libz3 and avoid text-model conversion:

      python3 util/symcc_schedule_solve.py schedule-smt.jsonl \
        --query-index 0 --result-out schedule-result.json \
        --certificate-out schedule-certificate.json \
        --prefix-out schedule.prefix

  Use `--eager` for the exact-base ablation, `--base-only` for the shared
  context, and `--max-refinement-rounds` to bound refinement. A
  `refinement_limit` result is explicitly non-exact and never carries a
  certificate.

- SYMCC_SCHEDULE_QUERY_VALIDATION_OUT=PATH (default empty): When the MPI helper
  launches `symcc_query_service.py` and `SYMCC_SCHEDULE_CONSTRAINT_OUT` is set,
  ask the query service to consume schedule-constraint rows and append
  `symcc-joint-schedule-query-v1` JSONL records. A record binds schedule trace
  digest/replay prefixes to matching Query IR roots, then conservatively reports
  whether the current witness observed the prefix, whether a solver assignment
  satisfies all Query IR roots, or whether the path side remains unknown/UNSAT.
  This remains the inexpensive replay-validation export path.

  For research runs requiring one solver witness, the programmatic
  `QueryStore.solve_joint_schedule_smt()` API consumes a stored Query IR query
  and a `symcc-schedule-smt-v7` artifact, then solves Query IR QF_BV, schedule
  QF_LIA, and tagged read-from byte bridges in one system-libz3 context. It
  emits `symcc-joint-path-schedule-rf-v1`, reruns the bounded Query IR evaluator,
  and independently rechecks hashes, the schedule certificate, RF selectors,
  and byte bindings. Memory trace tags use `sym-byte=N`, `init=0xNN`, and
  `value=0xNN`. Missing tags are not guessed, and the result remains a bounded
  formula witness rather than a whole-program reachability proof.

- SYMCC_DPOR_MAX_DEPTH=N (default 64), SYMCC_DPOR_WINDOW=N (default 32),
  SYMCC_DPOR_PREFIXES=N (default 256), and SYMCC_DPOR_PENDING=N (default
  4096): Bound replay-prefix length, dependent-pair scan window, per-input
  generated prefixes, and the persistent pending queue under
  "$AFL_OUT/<symcc-name>/.dpor_schedule.json".

- SYMCC_SCHEDULE_WAIT_MS=N (default 100 in the preload runtime): Maximum time a
  worker thread waits for the prefix-selected logical thread before falling back
  and continuing. This prevents replay prefixes from deadlocking when the
  selected thread is not enabled under the current input/path.

- SYMCC_SCHEDULE_ENABLED=0/1 (MPI worker default 1),
  SYMCC_SCHEDULE_ENABLED_SETTLE_US=N (default 1000, maximum 1000000), and
  SYMCC_SCHEDULE_ENABLED_MAX_THREADS=N (default 32, maximum 64): Record
  cooperative ready snapshots for controlled pthread scheduling points. A
  thread registers before entering the replay gate; the gate may wait for the
  bounded settle interval so concurrently arriving threads appear in the same
  snapshot. `complete=1` means complete relative to this bounded registry at
  that decision, not that arbitrary application threads are operationally
  enabled. Setting `SYMCC_SCHEDULE_ENABLED=0` disables these extra rows.

- Content-addressed live-state API: `util.distributed_state.LiveStateStore`
  stores versioned SHA-256 expression nodes, parent-linked solver frames,
  symbolic stores, fixed-size concrete/symbolic pages, and memory roots.
  `fork_memory()` performs page-granular copy-on-write and
  `put_continuation()` returns a checkpoint id equal to the CAS object digest.
  Inspect or compare persisted objects with:

      python3 util/symcc_live_state.py STATE_STORE inspect CHECKPOINT_ID
      python3 util/symcc_live_state.py STATE_STORE memory-diff ROOT_A ROOT_B

  Pass `--page-size N` before the subcommand when a non-default page size was
  used. The CLI verifies every digest/reference and deliberately reports
  `native_resume_supported=false`: this format does not restore a native
  instruction pointer, registers, call stack, or external resources.

- Path-dependent schedule events (enabled with the existing
  `SYMCC_DPOR_MEMORY=1` compiler instrumentation): conditional branches and
  switches emit `constraint` rows, and instrumented basic-block entries emit
  `action` rows. The preload runtime links a constraint to the last schedule
  read and records its byte width. ConDPOR backward revisit withholds a
  read-dependent constraint and its control-flow suffix for regeneration rather
  than restoring an observed suffix whose events may no longer exist.

- Operational enabledness artifacts: cooperative `ready` rows include bounded
  `offers=tid:operation:object:auxiliary` records. The Python explorer restores
  mutex/rwlock/join/wait state and embeds a
  `symcc-operational-enabledness-v1` certificate in wakeup, ConDPOR, and
  schedule-constraint artifacts. Status is three-valued
  (`enabled|blocked|unknown`); unsupported mutex types or truncated lifecycle
  evidence stay unknown. A terminal witness additionally requires an explicit
  runtime stop with no pending offers.

- Native atomic schedule tracing: the compiler instruments atomic load/store,
  `atomicrmw`, `cmpxchg`, and fence before LLVM's LowerAtomic pass. Trace tags
  preserve width, success/failure memory order, RMW operation, group identity,
  and `atomic=0|1`. Under `SYMCC_SCHEDULE_MEMORY_MODEL=RA`, the bounded model
  includes RMW immediate-predecessor atomicity, release sequences,
  release/acquire fences, seq_cst ranks, explicit non-atomic race rejection,
  and interval-aware mixed-size read-from. This remains a bounded research
  model, not a complete ISO C/C++ executable semantics.

- SYMCC_LIVE_PROGRAM=PATH (default empty): Enable executable continuation-IR
  state work in the MPI helper. PATH must contain a `symcc-live-program-v1`
  object with functions, blocks, and bounded CPS-like instructions. The master
  creates one CAS checkpoint per input seed; workers restore, execute, fork, and
  return resumable frontier checkpoints through the normal fenced state leases.

- SYMCC_LIVE_LLVM=PATH (default empty): If `SYMCC_LIVE_PROGRAM` is unset,
  lower one `.ll`, `.bc`, C, or C++ module to continuation IR in the MPI master
  and use the resulting program for live-state work. An explicitly configured
  `SYMCC_LIVE_PROGRAM` takes precedence and is never overwritten.

- SYMCC_LIVE_ENTRY=NAME (default `main`): Entry function for LLVM continuation
  lowering. Integer entry arguments up to 64 bits consume symbolic input bytes
  consecutively in little-endian order. An entry whose exact signature is
  `(address-space-0 pointer, integer size)` instead uses the bounded symbolic
  input-buffer ABI: the pointer names a dedicated memory object and the size is
  the concrete byte length of the current seed.

- SYMCC_LIVE_PLUGIN=PATH (default auto-discovered `build/libsymcc.so`) and
  SYMCC_LIVE_COMPILER_ARGS=STRING (default empty): Compiler pass and additional
  shell-quoted Clang arguments used by MPI `SYMCC_LIVE_LLVM` lowering.

- SYMCC_LIVE_PROGRAM_OUT=PATH (compiler pass, default unset): Run the
  `live-continuation-export` module pass and write either a
  `symcc-live-program-v1` executable artifact or a
  `symcc-llvm-continuation-lowering-v1` rejection report. This is normally set
  by `llvm_to_continuation.py`.

- SYMCC_LIVE_STRICT=0|1 (default 0): Turn an LLVM lowering rejection into a
  compiler fatal error. Without strict mode the rejection report remains
  inspectable and ordinary compilation may continue.

- SYMCC_LIVE_FEASIBILITY=0|1 (default 1): Before committing a symbolic
  branch/assume state, lower its CAS path-condition frames to QF_BV and query
  the configured solver. UNSAT states are pruned. Unknown, timeout,
  unavailable solver, or unsupported expression conservatively keeps the
  state and increments `feasibility_unknown`.

- SYMCC_LIVE_SOLVER_TIMEOUT_MS=N (default 1000, range 1..3600000):
  Per-feasibility-query timeout. `SYMCC_QUERY_SOLVER` selects the helper;
  otherwise the executor searches PATH and the local build tree.

- SYMCC_LIVE_INCREMENTAL_SOLVER=0|1 (default 1): Keep one
  `symcc-query-solver --server` process per live worker and key its QF_BV
  contexts by the immutable CAS solver-frame root. Two alternatives from the
  same state reuse the exact context through Z3 push/pop. When a child root is
  absent but its parent root is cached, the helper copies the parent's asserted
  formulas and parses only the new frame delta. A cold or evicted context is
  reconstructed from the complete CAS path. Server/protocol failure opens a
  per-executor circuit breaker and falls back to one-shot `--generic`; solver
  UNKNOWN remains conservative. The cache is disposable and is never part of
  checkpoint identity or correctness.

- SYMCC_LIVE_INCREMENTAL_CONTEXTS=N (default 128, range 1..65536):
  Maximum QF_BV prefix contexts retained by each live worker's solver helper.
  The helper uses bounded FIFO eviction. The MPI worker retains one
  `LiveContinuationExecutor` across continuation leases so exact and
  parent-root contexts can survive normal scheduling boundaries.

- SYMCC_LIVE_INCREMENTAL_ARTIFACTS=N (default
  `max(512,4*contexts)`, range 16..262144): Maximum temporary prefix, delta,
  and target SMT fragments retained by one executor. CAS frame metadata and
  normalized SMT fragments use related bounded LRUs. All temporary files are
  removed when the executor closes.

- Live execution results expose `feasibility_mode`,
  `incremental_context_exact_hits`, `incremental_context_parent_hits`,
  `incremental_context_rebuilds`, `incremental_context_entries`,
  `incremental_server_starts`, `incremental_server_failures`,
  `feasibility_oneshot_checks`, and SMT/frame-cache counters. These are
  per-`resume()` deltas even though the underlying worker cache persists.

- SYMCC_LIVE_MEMORY_LIMIT=N (compiler lowering default 1048576 bytes, range
  64..4194304): Maximum synthetic static-memory image produced by LLVM
  continuation lowering. Only referenced, initialized, address-space 0,
  non-TLS globals enter the image. Exceeding the bound produces a structured
  lowering rejection rather than a truncated object.

- SYMCC_LIVE_INPUT_BUFFER_LIMIT=N (compiler lowering default 65536 bytes,
  range 1..4194304): Maximum reserved capacity of an automatically recognized
  `(pointer,size)` entry input object. The effective capacity is also clamped
  by `SYMCC_LIVE_MEMORY_LIMIT` and the unsigned range of the LLVM size
  parameter. A concrete seed larger than the resulting capacity is rejected;
  reserved capacity never authorizes access beyond the current seed length.

- SYMCC_LIVE_HEAP_OBJECT_LIMIT=N (compiler lowering default 65536 bytes,
  range 1..4194304): Maximum size accepted for one direct
  `malloc(constant-size)` instance. Every accepted site receives a fixed
  synthetic slot pool and remains subject to `SYMCC_LIVE_MEMORY_LIMIT`. The
  modeled allocation is bounded-infallible; allocation-failure paths are not
  explored.

- SYMCC_LIVE_DYNAMIC_HEAP_LIMIT=N (compiler lowering default 4096 bytes,
  range 1..SYMCC_LIVE_HEAP_OBJECT_LIMIT): Physical capacity reserved for each
  slot of a dynamic-size `malloc` or `calloc` site. The requested symbolic
  size is stored separately as the object's logical bound. Zero, arithmetic
  overflow, a request above this limit, or a full site pool returns null in
  the continuation IR. Dereferences constrain both conditional liveness and
  the logical requested size; reserved backing bytes do not enlarge the
  target-visible object.

- SYMCC_LIVE_HEAP_SITE_CAPACITY=N (compiler lowering default 4, range 1..64):
  Number of simultaneously live synthetic instances reserved for each direct
  allocator call site. Fixed-size `malloc` retains the legacy infallible
  contract and reports pool exhaustion as a model-bound error. Dynamic
  `malloc`/`calloc` uses a nullable contract: a symbolic first-free selector
  returns a stable slot or null, and live/size/init expressions survive
  checkpoint migration. Every reserved slot consumes continuation
  memory-image capacity.

- SYMCC_LIVE_ALIAS_LIMIT=N (compiler lowering default 16, range 1..256):
  Maximum number of candidate addresses emitted for one symbolic memory
  operation. For a pointer PHI/select union this is the total across every
  object case, not a per-case allowance. The compiler accepts one integer
  variable offset term with a fixed nonzero scale in each provenance arm.
  Empty or larger alias sets produce a structured rejection; the address is
  never silently reduced to its concrete witness.

- SYMCC_LIVE_STATE_STORE=PATH (default
  `$AFL_OUT/<symcc-name>/.live_states`): Shared content-addressed object store
  used by executable continuation workers. The current MPI implementation
  requires every participating rank to see the same store. CAS replication for
  a non-shared filesystem is not implemented.

- SYMCC_LIVE_PAGE_SIZE=N (default 4096, minimum 64): Page size for continuation
  concrete/symbolic copy-on-write memory. A store must be reopened with the same
  page size used to create its roots.

- SYMCC_LIVE_STEPS_PER_LEASE=N (default 1000, minimum 1) and
  SYMCC_LIVE_STATES_PER_LEASE=N (default 1, minimum 1): Bound instructions and
  in-lease state expansion before resumable checkpoints return to the MPI
  frontier. Only frontier checkpoints count as generated scheduler work;
  states that halt within the lease do not inflate reward.

- SYMCC_MAX_TRANSPORT_INPUT=N (existing default 16 MiB): Also bounds a seed used
  to create an initial live continuation. Oversized live seeds are rejected
  rather than expanded into an unbounded number of input-expression objects.
  Once created, a checkpoint is self-contained and resumes even if AFL has
  moved the original queue file.

- Executable continuation CLI:

      python3 util/llvm_to_continuation.py target.ll \
        --output program.json --entry main
      python3 util/symcc_live_state.py STORE run-llvm target.c \
        --entry main --input-hex 4142 --max-steps 1000 --max-states 64
      python3 util/symcc_live_state.py STORE run-program PROGRAM.json \
        --input-hex 4142 --max-steps 1000 --max-states 64
      python3 util/symcc_live_state.py STORE resume CHECKPOINT \
        --max-steps 1000 --max-states 64

  Supported operations are `const`, `input`, `input_size`, `binary`, `unary`,
  `pointer_offset`, `load`, `store`, `heap_alloc`, `heap_free`, `assume`,
  `select`, `branch`, `jump`, `call`, `return`, and `halt`.
  Automatic LLVM lowering is intentionally narrower than the hand-authored IR:
  it supports bounded integer SSA, scalar mem2reg, PHI edge copies, select,
  switch, direct non-variadic internal calls with bounded integer/pointer
  arguments and returns, initialized static global objects, constant GEP,
  non-atomic integer load/store up to 8 bytes, and an exact
  `(pointer,size)` entry ABI. Fixed-size entry-block allocas that survive
  mem2reg are lowered as frame-local stack objects when every load has a
  dominating full-width store and all pointer offsets are constant. Direct
  `malloc` declarations with one fixed nonzero size are lowered to bounded
  fixed-capacity call-site heap pools; `free` accepts null or the exact base of
  a currently selected slot.
  A GEP with one symbolic integer offset term can be lowered when its no-wrap
  in-object candidate domain can be enumerated and the candidate count does
  not exceed `SYMCC_LIVE_ALIAS_LIMIT`. Pointer width must equal the
  DataLayout GEP index width. Pointer-valued `select` and acyclic pointer PHI
  nodes may merge supported roots, including different objects and a one-term
  symbolic GEP in each arm. Constant or one-term GEP may also follow such a
  union. The exported lowering advertises `bounded-pointer-union` when this
  path is used.
  Programs carry target endianness, initial `memory_hex`, non-overlapping
  `memory_objects={name,kind,address,size,read_only,logical_size}` metadata, and
  a `symcc-live-input-buffer-v1` descriptor when applicable. Checkpoint
  creation maps every concrete seed byte to the input object's symbolic COW
  memory and stores `@input:length`; the executor independently rechecks
  object bounds/read-only status and uses the actual seed length for input
  accesses. Stack objects additionally carry
  `{kind=stack,function,initialization=runtime-write-tracked}`. Stack stores
  persist per-byte initialization markers in the checkpoint symbolic store;
  loads require those markers and the unique active frame owned by the
  declaring function. This permits a direct callee to access caller-owned
  stack storage. Return removes only the popped depth's stack markers and SSA
  locals, so writes into a still-active caller frame survive.
  Heap objects carry
  `{kind=heap,site,slot,capacity,lifetime=runtime-alloc-free,
  allocation=bounded-pool-infallible}`. The allocator chooses the first free
  slot and persists `@heap:live:<base>`; heap stores persist per-byte
  `@heap:init:<address>` markers. Loads require both liveness and complete
  initialization. Free clears the selected slot's live marker and all of its
  initialization markers, so deterministic slot reuse cannot observe old
  contents. Pool exhaustion, double free, use after free, and uninitialized
  heap reads are rejected during execution. The validator retains backward
  compatibility for the legacy one-object
  `allocation=bounded-infallible` artifact.
  Symbolic-address loads join candidate values with finite nested ITEs.
  Symbolic-address stores perform guarded per-byte read-over-write updates;
  overlapping candidates compose rather than overwrite one another. The OR of
  valid address guards is persisted as a path condition. Each guard also
  includes the signed `alias_index_min <= alias_index <= alias_index_max`
  contract, preventing bit-vector multiplication wrap from admitting an
  `inbounds` poison path. Chained `inbounds` GEPs intersect both dynamic base
  and result intervals so an invalid intermediate pointer cannot be hidden by
  a valid final address. Non-inbounds wrapped-object aliases are conservatively
  outside the current bounded subset. Stack/heap
  initialization markers are also guarded expressions, so conditional writes
  remain correct across checkpoint resume.
  A pointer union memory operation uses `alias_cases` rather than the legacy
  single-object `aliases` list. Each case contains one object's candidate
  addresses, a nonempty list of select/PHI equality guards, and an optional
  signed alias-index interval. The executor recomputes object ownership per
  case and conjoins these guards with the numeric address condition. This
  permits cross-object finite ITE loads and guarded stores without inferring
  provenance from synthetic numeric addresses. Null load arms and read-only
  store arms contribute no valid candidate, so their selection guard becomes
  infeasible under the memory operation's domain.
  A fixed-size malloc site uses `bounded-pool-infallible` heap objects with stable
  `site`, `slot`, and `capacity` fields. Its `heap_alloc` instruction carries
  the same slot-ordered `addresses` list and capacity. Each possible returned
  slot is a guarded pointer-provenance case; therefore multiple live instances
  of one site retain independent bounds, liveness, and initialization.
  Constant or one-term symbolic GEP may be rooted after an acyclic pointer
  select/PHI or heap-pool result; the runtime address still derives from the
  real pointer SSA while the finite object alternatives are transformed in
  parallel.
  Dynamic-size malloc and calloc sites instead use
  `bounded-pool-nullable` plus
  `logical_size=runtime-allocation-size`. Their `heap_alloc` operation carries
  a symbolic size or calloc factor pair, maximum physical capacity and
  nullable contract. Calloc multiplication wrap is rejected in the target
  bit width and selected logical bytes receive conditional zero writes.
  `heap_realloc` implements a bounded in-place allocator strategy for
  non-null supported heap bases: it preserves `min(old,new)` initialization,
  invalidates newly exposed bytes, frees on zero size, and returns null while
  preserving the old object when the new size exceeds physical capacity.
  Pointer `eq`/`ne` lowering exposes allocator failure branches.
  A non-entry function with pointer arguments records
  `pointer_params=[{index,bits}]` and appends one 1-bit hidden parameter per
  pointer in `pointer_domains=[{index,parameter}]`. Every direct call carries
  matching `pointer_args` and `pointer_domains=[{index,argument}]`. The domain
  operand is a real BV expression: it ORs the actual pointer's finite
  provenance arms and ANDs each arm's select/PHI guards and signed dynamic-index
  bounds. A callee therefore requires both `formal==candidate-address` and the
  corresponding hidden domain value to be true before a memory operation.
  Pointer-returning functions additionally record `pointer_return_bits` and
  `pointer_return_domain=true`; return instructions carry `pointer_bits` plus
  `pointer_domain`, and call sites bind it through `pointer_domain_dst`.
  Generated artifacts advertise `caller-domain-pointer-certificate`.
  Caller-owned stack objects remain attached to their original active frame
  depth across callee checkpoints. Returning a callee-owned stack object is
  rejected before artifact emission.
  A function pointer formed locally from internal function constants, pointer
  casts, `select`, or an acyclic pointer PHI can be lowered to bounded
  `indirect_call` dispatch. Address-taken targets receive stable nonzero
  `function_id` values; the instruction records a BV `target`, its width, and
  up to 64 `{function,id,guards}` cases. The executor conjoins selector
  equality with select/PHI guards, checks feasibility, and forks one ordinary
  continuation frame per feasible target. Functions additionally carry
  `param_bits` and `return_bits`, while calls carry `result_bits`; validator
  and runtime both recheck this typed ABI. Generated artifacts advertise
  `bounded-indirect-call-dispatch`.
  Pointer-returning indirect targets use the same bounded dispatch. The
  compiler unions each target's finite object-return summary, transports the
  selected callee's 1-bit return-domain certificate through
  `pointer_domain_dst`, and also includes indirect call sites when summarizing
  pointer formal parameters. Every target must share the exact pointer
  parameter/domain and pointer-return typed contract.
  Direct declarations of `memcmp` and `bcmp` have a deterministic read-only
  effect summary when the length is a compile-time constant from 0 through 64.
  The compiler expands the call to ordinary byte `load`, equality, unsigned
  ordering and `select` instructions. The result is canonicalized to
  `-1`, `0`, or `1` in the declared integer width; C only specifies its sign.
  Zero length returns zero without resolving either pointer. Since the summary
  uses core continuation IR, all existing object bounds, logical input/heap
  size, liveness, initialization, pointer-union guards and solver checks remain
  active. Generated artifacts advertise
  `bounded-external-effect-summary`.
  Direct declarations and LLVM intrinsics for `memcpy`, `memmove`, and
  `memset` are also summarized when the length is a compile-time constant from
  0 through 64. They lower to ordinary byte loads/stores, so page-COW memory,
  object bounds, logical input/heap size, liveness, initialization, stack
  ownership, pointer-union guards, and caller-domain certificates retain their
  normal semantics. `memmove` snapshots every source byte before the first
  destination write. `memcpy` is accepted only when every finite
  source/destination candidate interval is statically proven disjoint.
  `memset` writes the low 8 bits of its value operand, including a symbolic
  value. Zero length performs no memory access; a declaration call still
  returns the original destination pointer. Volatile intrinsics fail closed.
  Direct declarations of `strlen`, `strcmp`, and `strncmp` use bounded
  NUL-aware summaries. A generated byte load may carry a 1-bit `guard`; its
  definedness obligation is `!guard || access_defined`, and its value is zero
  when inactive. This prevents bytes after NUL from requiring object,
  logical-length, liveness, or initialization validity. `strlen` and `strcmp`
  require termination/difference within the finite object extent and global
  64-byte bound. `strncmp` requires a compile-time `0..64` length and need not
  observe NUL when the bound is reached; zero length does not resolve either
  pointer. Generated artifacts advertise `guarded-memory-access` and
  `bounded-nul-string-summary`.
  Direct declarations of `memchr` and `strchr` produce bounded
  pointer-returning search summaries. `memchr` requires a compile-time
  `0..64` length and reads the complete declared region; `strchr` stops
  guarded reads after the first match or NUL. Both select the first match and
  attach finite source-object/offset provenance to every non-null result.
  Generated artifacts advertise `bounded-pointer-search-summary`.
  Direct declarations of `strcpy` and `strncpy` produce bounded string-copy
  summaries only when every finite source/destination object pair is proven
  distinct. All possible source bytes are snapshot before the first write.
  `strcpy` uses 1-bit guarded stores to write through the first NUL while
  preserving the inactive destination suffix. `strncpy` requires a
  compile-time `0..64` length, writes exactly that many bytes, and pads with
  zero after source termination. A guarded store requires
  `!guard || access_defined`, performs byte-wise `ITE(guard,new,old)`, and
  conditionally updates stack/heap initialization markers. Zero-length
  `strncpy` resolves neither pointer. Both calls return destination with its
  finite pointer provenance. Generated artifacts advertise
  `guarded-memory-write` when required and
  `bounded-string-copy-summary`.
  Integer `udiv`, `sdiv`, `urem`, and `srem` lower with explicit nonzero
  divisor assumptions; signed division also excludes `INT_MIN / -1`.
  Symbolic shifts lower with an unsigned `amount < bitwidth` assumption.
  `nuw` and `nsw` on add/sub/mul/shl, plus `exact` on division/right shift,
  lower to ordinary BV proof instructions followed by 1-bit assumptions.
  These assumptions are part of the content-addressed solver prefix and are
  rechecked after migration. Artifacts using them advertise
  `llvm-defined-value-guards`. Freeze of an already-defined bounded integer is
  an identity; freeze of direct undef/poison is rejected because the current
  portable IR has no stable nondeterministic-choice primitive.
  Pointer-valued loads and stores are accepted for a bounded provenance
  subset. A scalar global pointer may be initialized directly with another
  bounded data global or null. A dynamic stack/heap pointer cell must use one
  exact storage SSA value and have one pointer store that dominates its load;
  path-conditional reaching stores and non-pointer overwrites fail closed.
  Pointer-width bytes use ordinary page-COW memory, while the compiler attaches
  loaded-value equality guards to the stored pointer's finite provenance.
  Loaded data pointers can therefore continue through GEP, memory access, and
  pointer argument/return contracts. Artifacts advertise
  `bounded-pointer-memory`.

  Function-pointer cells use the same pointer-width bytes but encode the
  exporter's stable internal function ID. Scalar global initializers and exact
  stack/heap stores may therefore be loaded and dispatched through the existing
  typed `indirect_call` contract. Artifacts advertise
  `bounded-function-pointer-memory`.

  Fixed one-dimensional global pointer arrays are accepted as bounded pointer
  tables. A symbolic GEP index is first constrained by the existing finite
  alias domain; a subsequent load reconstructs all data or function candidates
  and filters them with loaded-address/function-ID equality. Artifacts advertise
  `bounded-pointer-table`.

  A pointer cell at a join may also be recovered when every direct predecessor
  contains exactly one full-width pointer store to the exact same storage value
  and there are no other stores or non-pointer overwrites to that cell. This
  bounded reaching-definition proof works for both data and function pointers
  and advertises `bounded-pointer-memory-merge`.

  LLVM `invoke` is accepted only when its call site is `nounwind`, its direct
  internal target is `nounwind`, or every target in a complete bounded indirect
  target set is `nounwind`. The call artifact carries `normal_target`; return
  transfers there through any PHI edge-copy block. Proven-dead unwind blocks
  are omitted. Artifacts advertise `bounded-nounwind-invoke`. Potentially
  throwing invokes and all executable landingpad/catch/cleanup semantics remain
  unsupported.

  Direct integer `freeze undef` and `freeze poison` lower to a typed
  nondeterministic choice. The executor persists a global dynamic-instance
  counter in the continuation symbolic store, so loop executions receive
  distinct SMT symbols and checkpoint resume preserves their identity. All
  uses of one SSA result share its expression. Artifacts advertise
  `stable-nondeterministic-freeze`. This does not yet replace the
  defined-value assumptions used for poison-producing arithmetic flags.

  Pointer-cell reaching definitions use a bounded CFG fixed point, not only
  direct predecessors. Each block carries a last-writer set and an
  uninitialized-path bit; a full exact-slot store kills the incoming version,
  while writer-free blocks union all live predecessors. This supports
  dominating defaults, nested overwrites, forwarding blocks, loop-invariant
  cells, and loop-carried full pointer stores. Acyclic and cyclic artifacts
  advertise `acyclic-pointer-memory-ssa` or
  `bounded-cyclic-pointer-memory-ssa`. Uninitialized paths,
  non-pointer/atomic/volatile reaching writers, partial writes, and storage
  expressions without exact SSA identity fail closed.

  Constant GEP chains used as pointer-cell addresses are canonicalized to a
  target-DataLayout `(base, modular-offset)` identity. Equivalent nonzero GEP
  instructions therefore share reaching definitions and advertise
  `canonical-pointer-cell-identity`; distinct offsets stay independent.
  Symbolic GEPs and alias-equivalent different bases still require exact SSA
  identity.

  Deterministic scalar external summaries cover `abs`, `labs`, `llabs`,
  `htons`, `ntohs`, `htonl`, and `ntohl` with exact integer ABIs. Absolute
  value excludes the unrepresentable signed minimum through a solver
  assumption. Network-order conversion follows the target DataLayout, not the
  host; LLVM `bswap` 16/32/64 uses the same core BV permutation. Artifacts
  advertise `bounded-scalar-external-summary`. Locale, errno, FP/libm, time,
  randomness, I/O, and user-defined external state remain unsupported.

  Scalar LLVM `ctpop`, `ctlz`, and `cttz` overloads from 1 through 64 bits are
  expanded to bounded core-BV DAGs. Artifacts advertise
  `bounded-bitcount-intrinsic`. For `ctlz`/`cttz`, the `is_zero_poison` immarg
  must be a constant i1: false defines zero as the source bit width, while true
  emits a nonzero solver assumption. Vector, VP, target-specific, and wider
  overloads remain unsupported.

  Scalar LLVM `bitreverse`, `fshl`, and `fshr` overloads from 1 through 64
  bits are expanded to core-BV permutations and advertise
  `bounded-bit-permutation-intrinsic`. Funnel shift amounts are reduced modulo
  the source width as required by LLVM. Vector/VP and target-specific bit
  manipulation intrinsics remain unsupported.

  Scalar LLVM `sadd.sat`, `uadd.sat`, `ssub.sat`, `usub.sat`, `sshl.sat`,
  and `ushl.sat` overloads from 1 through 64 bits are lowered to core-BV
  overflow predicates and min/max clamps. Artifacts advertise
  `bounded-saturating-arithmetic-intrinsic`. Saturating shifts additionally
  require `amount < bitwidth`; violation is an infeasible defined-value path.
  Fixed-point and vector/VP saturation remain unsupported.

  Scalar LLVM signed/unsigned `add/sub/mul.with.overflow` overloads from 1
  through 64 bits expose their `{wrapped-value,i1}` result through bounded
  `extractvalue` indices 0 and 1. Artifacts advertise
  `bounded-overflow-arithmetic-intrinsic`; this does not enable general
  aggregate IR.

  Integer and address-space-0 pointer `llvm.ssa.copy` preserve the operand
  value and advertise `bounded-ssa-copy-intrinsic`. Data-pointer provenance
  and typed function-pointer target sets are forwarded through the copy.
  Floating, vector, token, metadata, and nonzero-address-space overloads remain
  unsupported.

  Scalar LLVM `abs`, `smax`, `smin`, `umax`, and `umin` overloads from 1
  through 64 bits advertise `bounded-scalar-selection-intrinsic`. The
  `llvm.abs` INT_MIN flag must be a constant i1; true emits a definedness
  assumption, while false preserves INT_MIN as required by LLVM.

  Integer `llvm.expect` and `llvm.expect.with.probability` are lowered to their
  first value and advertise `llvm-optimization-hint-identity`. The probability
  form requires a constant double in [0,1]. Expected values are hints, never
  solver assumptions.

  Global, stack, heap, null, input-buffer, and finite-union pointers may be
  queried through scalar `llvm.objectsize`. Fixed objects return the exact
  remaining size from the current constant offset and artifacts advertise
  `bounded-objectsize-intrinsic`. With a constant true dynamic flag,
  pointer-size input buffers and nullable malloc/calloc objects use their
  runtime logical size, subtract the target-width pointer offset, and advertise
  `bounded-dynamic-objectsize-intrinsic`. A runtime-sized object queried with
  dynamic=false returns the minimum/maximum unknown sentinel, never allocation
  capacity. Bounded in-place realloc provenance is retained per finite pointer
  alternative through GEP/cast/select/PHI, so mixed realloc/fixed-object unions
  use each alternative's own request size on success and the configured null
  semantics on failure. All
  three control flags must be constant i1. Moving realloc, unknown
  external/custom allocations, vectors, and widths above 64 remain unsupported.

  A scalar integer `freeze` may defer poison along bounded use chains of
  bounded casts, core integer binary operations, `icmp`, and integer
  `ssa.copy`. Sources include division/remainder definedness, shift range,
  `exact`, and `nuw`/`nsw`. The compiler emits
  `ite(defined, wrapped-result, nondet)` and advertises
  `bounded-deferred-poison-freeze`; transitive chains additionally advertise
  `bounded-transitive-deferred-poison`. Deferred division uses a safe selected
  divisor so an unselected poison result cannot trigger a host divide-by-zero.
  Integer selects use path-sensitive arm definedness and advertise
  `bounded-select-deferred-poison`; acyclic PHI merges stage/commit defined bits
  on CFG edges and advertise `bounded-phi-deferred-poison`. One exact
  same-block scalar store/load pair with no other memory operation may carry a
  definedness sidecar and advertise `bounded-memory-deferred-poison`.
  Distinct pointer SSA values are accepted only when DataLayout proves the
  same stripped base and exact constant byte offset; this stronger proof
  advertises `canonical-address-memory-deferred-poison`.
  The exact store/load pair may cross at most 64 memory-effect-free CFG edges
  when every traversed block has a unique successor and its successor has a
  unique predecessor. This advertises
  `bounded-cross-block-memory-deferred-poison`; joins and cycles fail closed.
  A bounded integer poison value may cross a direct-call return:
  the function, return, and call carry `return_defined`, `defined`, and
  `defined_dst`, respectively, and the executor transports the bit while
  popping the callee frame. Artifacts advertise
  `bounded-cross-function-deferred-poison`. Indirect calls and non-integer
  returns remain defined-only. In the opposite direction, a direct-call
  integer argument may append a one-bit
  parameter described by matching `defined_params`/`defined_args` mappings;
  this advertises `bounded-cross-function-argument-poison`. The typed call
  validator checks mapping equality and one-bit widths before execution.
  These return/argument channels may cover up to 64 exact direct callsites.
  Return poison requires every call result to reach freeze; an argument channel
  passes constant true at callsites whose actual argument is known defined.
  Multi-callsite artifacts advertise
  `bounded-multicallsite-deferred-poison`.
  When a deferred-poison formal parameter reaches the callee return through a
  bounded transparent integer slice, the argument and return channels compose
  and advertise `bounded-transitive-call-deferred-poison`. This slice covers
  core integer binary operations, casts, comparisons, selects, acyclic PHIs,
  and integer `ssa.copy`; cyclic, aggregate, vector, memory-mediated, indirect,
  and mixed-use transfer still fail closed.
  A deferred-poison value may have multiple consumers when an all-use proof,
  bounded to 256 value visits, shows that every use reaches a supported freeze
  sink through the same transparent operations and direct-call/memory
  contracts. Such artifacts advertise
  `bounded-multiconsumer-deferred-poison`. Each freeze receives its own stable
  nondeterministic choice. Any ordinary consumer, cycle, unsupported use, or
  exhausted analysis budget restores the defined-only approximation.
  One exact scalar store may feed up to 64 same-address, same-type loads along
  a linear, memory-effect-free CFG version. A same-address full-width store or
  function exit terminates the version; reverse scans bind every load to its
  nearest store while allowing earlier exact loads. All loaded values must
  satisfy the all-use freeze proof. Successful artifacts advertise
  `bounded-multiaccess-memory-deferred-poison`. Unknown memory effects,
  different addresses, cycles, partial writes, and atomic/volatile accesses
  fail closed. Acyclic branches and joins are accepted within a 64-block
  budget only when a reverse all-predecessor proof resolves every load to the
  same exact store; these artifacts advertise
  `bounded-branch-memory-deferred-poison`. Path-dependent clobbers fail closed.
  A direct-predecessor merge may instead carry path-dependent definedness when
  every incoming block has one successor and its last memory effect is an
  exact full-width store. The compiler writes each store's one-bit condition
  in the corresponding edge block and advertises
  `bounded-memory-definedness-phi`. Function metadata records the load,
  destination, merge block, and incoming endpoints; the validator requires
  exactly one i1 assignment per edge followed by a jump to the declared merge.
  Incoming store values may use a validator-checked direct-call argument or
  return defined bit. This composes the F117/F118 call ABI with the edge
  contract and advertises
  `bounded-interprocedural-memory-definedness-phi`; unproven parameters,
  indirect calls, and mixed call uses are not inferred.
  Each incoming edge may traverse a bounded predecessor subgraph of up to 64
  memory-free blocks when all paths in that subgraph resolve to one exact
  store, advertising `bounded-multilevel-memory-definedness-phi`. A loop
  header may use the same contract when every entry/backedge incoming state
  has an exact full store; the header-dominating-backedge form advertises
  `bounded-cyclic-memory-definedness-phi`. A bounded backedge subgraph with
  no writer may instead carry the previous iteration's one-bit sidecar by
  assigning the defined destination to itself. Such contracts advertise
  `bounded-cyclic-memory-definedness-carry`, mark both `cyclic` and `carry`,
  and identify carry endpoints. The validator requires an exact i1
  self-identity assignment and enforces `carry => cyclic`. A store/carry
  mixture may be transferred through one final backedge only for a canonical
  direct-arm diamond: one arm ends in an exact store, the other resolves to
  carry, and both have the same conditional-branch predecessor. The edge
  emits an i1 select between store-defined and prior-defined, advertises
  `bounded-conditional-memory-definedness-carry`, and marks the endpoint
  `conditional_carry`. The validator requires exactly one self-referencing
  select arm. Store/carry arms may cross bounded unique-predecessor,
  memory-compatible forwarding chains when both chains resolve to distinct
  successors of the same conditional branch and the store chain contains the
  proven exact writer. This advertises
  `bounded-forwarded-conditional-memory-definedness-carry` and marks
  `forwarded_conditional_carry`. Multi-way joins, nested conditions, and
  multiple stores normally fail closed. A multi-way join is accepted when
  complete reaching-source tuples form exactly Store and Carry groups and
  every endpoint in each group independently maps to the same outer branch
  arm. This advertises
  `bounded-multiarm-conditional-memory-definedness-carry` and marks
  `multiarm_conditional_carry`. Distinct StoreInst sources may be coalesced
  only in the one-bit definedness domain when bounded source analysis proves
  every stored value cannot create or receive deferred poison. Each endpoint
  is still checked against its own writer, while numeric memory retains the
  actual values. This advertises
  `bounded-equivalent-defined-store-memory-carry` and marks
  `equivalent_defined_stores`. Mixed defined/poison writers are not
  coalesced. Distinct writers of the exact same poison-capable LLVM SSA value
  may also share a definedness source. The reaching source records every
  writer member so each store can independently prove its sink and propagate
  the shared condition; this advertises
  `bounded-shared-poison-store-memory-carry` and marks
  `shared_poison_stores`. Different SSA producers are never inferred
  equivalent. A strict two-level Store/Store/Carry tree may keep the two
  writer conditions distinct: exactly three singleton source groups must
  resolve to an inner two-store split and an outer store-versus-carry split.
  Because continuation selects eagerly resolve operands, the inner condition
  and both stored values must dominate the final incoming edge. The edge
  emits an inner writer-defined select followed by the outer carry select,
  advertises `bounded-nested-conditional-memory-definedness-carry`, and marks
  `nested_conditional_carry`. Four to eight singleton Store/Carry sources may
  form a deeper bounded tree when unique-predecessor ancestor analysis can
  recursively partition every leaf by a common conditional branch. Exactly
  one leaf must be Carry, the reconstructed depth must be 3--6, and every
  predicate and stored value must dominate the final incoming edge. The edge
  emits postorder i1 selects, advertises
  `bounded-recursive-memory-definedness-condition-tree`, and records
  `recursive_conditional_carry`, `condition_tree_depth`, and
  `condition_tree_leaves`. The validator reconstructs the tree from the root
  assignment and requires exact metadata, one carry leaf, no cycles, no
  unreachable recursive temporaries, and the full-binary node count.
  Non-singleton source groups without the proof below, more than eight leaves,
  greater depth, path-local eager operands, and incomplete branch partitions
  fail closed.
  F139 admits a non-singleton source group when complete source identity has
  already proved all of its endpoints equivalent and every endpoint maps each
  selected ancestor branch to the same successor. The group remains one tree
  leaf while numeric stores and post-store control paths remain distinct.
  Such artifacts advertise
  `bounded-grouped-recursive-memory-definedness-condition-tree` and mark
  `grouped_recursive_conditional_carry`; the validator requires this marker to
  imply the recursive-tree contract. A source repeated at different structural
  positions in the tree still requires a shared-leaf DAG or condition
  reduction in F139. F140 accepts the bounded Store-only case by detecting a
  source group's conflicting `branch -> successor` positions and expanding
  those endpoints into separate tree leaves that reference the same proven
  definedness condition. Expanded trees retain the 4--8 leaf and depth 3--6
  limits and still require exactly one Carry leaf. They advertise
  `bounded-repeated-source-recursive-memory-definedness-condition-tree` and
  mark `repeated_source_recursive_conditional_carry`. Repeated Carry positions,
  Boolean minimization, and unbounded/shared-node DAGs fail closed in F140.
  F141 also expands a position-conflicting no-write Carry group. Recursive
  artifacts record `condition_tree_carry_leaves`; the validator reconstructs
  the select tree and requires the actual self-reference count to match this
  field. Ordinary recursive trees require exactly one Carry leaf, while
  `bounded-multicarry-recursive-memory-definedness-condition-tree` artifacts
  mark `multicarry_recursive_conditional_carry` and require 2--8. The fixed
  depth-two F137 contract continues to require one direct root self arm.
  Multiple independent scalar cells may carry separate definedness PHIs in the
  same merge block. Header and backward scans skip another non-atomic,
  non-volatile scalar access only when target-DataLayout constant base/offset
  regions prove it disjoint: non-overlapping intervals of one base, or distinct
  static global objects. Every cell retains its own reaching-source and edge
  assignment. Participating contracts mark `multicell`, artifacts advertise
  `bounded-multicell-memory-definedness-phi`, and the validator requires at
  least two marked contracts for one merge block. Symbolic offsets, overlap,
  calls, partial writes, and unknown object identity still fail closed.
  F143 also proves two different lowerable static storage objects disjoint
  when each base is a `GlobalVariable` or entry-block static `AllocaInst`.
  These contracts additionally mark `identified_objects`, advertise
  `bounded-identified-object-multicell-memory-definedness-phi`, and require at
  least two such markers in one merge block. The marker always implies
  `multicell`. Dynamic allocas, ordinary pointer arguments, heap identities,
  noalias call results, symbolic bases, and escaping cross-function objects
  remain outside this bounded proof.
  F144 additionally recognizes two different fixed `malloc` sites when each
  call is direct, external, address-space zero, has one nonzero constant size,
  and fits `SYMCC_CONTINUATION_MAX_HEAP_OBJECT`. At least one side of the
  pair must be such a heap object; the other may be another fixed heap site or
  an F143 static object. Contracts mark `fixed_heap_objects`, advertise
  `bounded-fixed-heap-object-multicell-memory-definedness-phi`, imply
  `multicell`, and require a same-block group of at least two. Zero or dynamic
  malloc, calloc, realloc, custom allocators, repeated dynamic instances of
  one site, noalias arguments/returns, and unknown lifetime effects fail
  closed.
  F145 expands pointer `select` and acyclic pointer `phi` values into finite
  constant regions rooted in F143/F144 objects. Constant GEP offsets are
  accumulated with signed-overflow checks; each domain is limited by
  `SYMCC_LIVE_ALIAS_LIMIT` (default 16), and every region pair across the two
  domains must be disjoint. Contracts mark `finite_pointer_domains`, advertise
  `bounded-finite-pointer-domain-multicell-memory-definedness-phi`, imply
  `multicell`, and require at least two same-block markers. Cyclic PHIs,
  symbolic GEP offsets, null/unknown bases, overlapping alternatives, and
  guard-correlated overlap fail closed.
  F146 retains literal `(i1 condition, polarity)` guards for select
  alternatives. A spatially overlapping pair is excluded only when the two
  conjunctions require opposite values of the exact same LLVM condition SSA
  value. Any compatible overlap rejects the proof. Contracts mark
  `guard_correlated_pointer_domains`, advertise
  `bounded-guard-correlated-pointer-domain-multicell-memory-definedness-phi`,
  imply `multicell`, and require at least two same-block markers. PHI-edge
  correlation, equivalent-but-distinct predicates, arbitrary path
  constraints, and SMT guard reasoning remain unsupported.
  F147 also records `(PHI merge block, incoming predecessor)` guards. Two
  alternatives from different predecessors of the same merge are mutually
  exclusive; alternatives from the same predecessor remain compatible.
  Contracts mark `phi_correlated_pointer_domains`, advertise
  `bounded-phi-correlated-pointer-domain-multicell-memory-definedness-phi`,
  imply `multicell`, and require two same-block markers. Cyclic PHIs and
  inferred cross-block edge equivalence remain unsupported.
  F148 accepts one-term symbolic GEP offsets when LLVM `ConstantRange` yields
  a bounded signed index interval. Constant and scale are applied with
  overflow checks, and every possible start offset plus access width must
  remain separated. Contracts mark `symbolic_index_intervals`, advertise
  `bounded-symbolic-index-interval-multicell-memory-definedness-phi`, imply
  `multicell`, and require two same-block markers. Multi-term affine offsets
  and relational index constraints remain unsupported.
  F149 adds bounded byte-lane definedness composition for byte-aligned integer
  loads of 2--8 bytes. A reverse walk through at most 64 acyclic
  single-predecessor blocks assigns each address-order byte lane to its nearest
  non-atomic scalar store; a typed constant global initializer may supply
  lanes that no runtime store covers. Unique poison-capable store sidecars are
  combined with a one-bit AND immediately after the load. Overlapping writes
  therefore retain the older writer only for bytes not replaced by the newer
  store. Functions advertise `bounded-byte-lane-memory-definedness` and emit
  `byte_lane_memory_definedness` contracts containing `load`, `defined`,
  `block`, `bytes`, optional `initial`/`cross_block`, and an exact `lanes`
  vector. Participating stores carry `byte_lane_store` and, when needed,
  `byte_lane_defined`. The production validator checks store IDs and widths,
  adjacent sidecar definitions, complete lane coverage, the post-load AND
  dataflow, and capability/contract consistency. Branch/loop lane PHIs,
  symbolic overlap, region-copy sources, atomic/volatile accesses, unknown
  calls, non-byte-aligned scalars, and accesses wider than eight bytes remain
  unsupported.
  F150 extends the same lane schema across a direct CFG merge. Each 2--64-way
  predecessor is analyzed independently and must provide a complete lane
  vector through an acyclic unique-predecessor corridor. Its synthetic edge
  block reduces only that path's poison-capable store sidecars into the shared
  load defined destination; an edge with only defined/initial sources writes
  true. Functions advertise
  `bounded-byte-lane-memory-definedness-phi` and emit
  `byte_lane_memory_definedness_phis` contracts with `incoming` edge blocks
  and lane vectors. The validator requires each endpoint block to end in a
  jump to the declared merge, reconstructs its local AND/true transfer, and
  rejects missing lanes, cross-edge source substitution, unreferenced stores,
  or capability/contract mismatch. An uncovered lane may not cross an
  upstream multi-predecessor join; loop/backedge lane carry and recursive
  conditional lane trees remain unsupported.
  F151 adds a bounded per-lane fixed point for a single loop header. A
  2--8-byte load owns one stable one-bit state variable per address-order byte.
  Entry edges initialize each lane from a complete writer or typed constant
  global state; backedges write a new store sidecar for overwritten lanes and
  self-carry untouched lanes. The header ANDs all lane variables after the
  numeric load. This advertises
  `bounded-cyclic-byte-lane-memory-definedness-phi` and emits
  `cyclic_byte_lane_memory_definedness_phis` with `lane_defined` and complete
  per-edge `store`/`initial`/`carry` vectors. The proof is enabled only when a
  function-wide memory-effect scan shows that the modeled stores and target
  load form an alias-closed region; any additional potentially aliasing access
  or unknown memory effect fails closed. The production validator reconstructs
  every edge transfer, requires carry to read the same lane variable, checks
  store sidecars, and proves by dependency sets that the aggregate AND consumes
  every lane. Conditional partial stores, irreducible/multi-header loops,
  symbolic overlap, region copies, cross-call effects, atomics, volatile
  accesses, and widths above eight bytes remain unsupported.
  F152 recognizes one strict conditional write/carry diamond on the backedge.
  The two direct branch arms must merge at one join; exactly one arm contains
  one constant-offset partial scalar writer and the other has no aliasing
  writer. Synthetic arm-to-join edge blocks update every lane: the store edge
  writes the matching sidecar/true for overwritten lanes and self-carries the
  rest, while the carry edge self-carries all lanes. This advertises
  `bounded-conditional-cyclic-byte-lane-memory-definedness-phi` and emits
  `conditional_cyclic_byte_lane_memory_definedness_phis` with explicit branch,
  arm, join, edge, polarity, and lane-transfer metadata. The validator
  reconstructs the branch topology, both edge transfers, the join-to-header
  all-carry path, a complete non-carry seed endpoint, and the header AND.
  Forwarded arms, switches, multiple writers, nested/recursive conditions,
  multiple conditional updates, symbolic overlap, region copies, calls,
  atomics, and volatile accesses fail closed.
  F172 permits bounded forwarding corridors in the F171 double-composed tree.
  This advertises
  `bounded-forwarded-double-composed-multigroup-recursive-conditional-cyclic-byte-lane-memory-definedness-phi`
  and emits
  `forwarded_double_composed_multigroup_recursive_conditional_cyclic_byte_lane_memory_definedness_phis`
  with `forwarded=true` plus the F171 group/composition markers. Validation
  reconstructs the actual tree before rechecking both per-group source
  differences. Branching/shared corridors, three-group composition, more than
  one override per group, symbolic overlap, region copies, calls, atomics, and
  volatile accesses fail closed.
  F153 permits up to 16 unconditional unique-predecessor forwarding blocks on
  each conditional arm. Both corridors must originate at different successors
  of the same nearest branch, remain disjoint, and terminate at the two
  predecessors of one join. Writer analysis covers the complete corridor.
  This advertises
  `bounded-forwarded-conditional-cyclic-byte-lane-memory-definedness-phi` and
  emits `forwarded_conditional_cyclic_byte_lane_memory_definedness_phis`;
  transfer metadata distinguishes branch `store_successor`/`carry_successor`
  from arm endpoints and sets `forwarded`. Validation reconstructs every jump
  and exact predecessor set for the header, corridors, and join before checking
  lane updates. Nested branches, multi-predecessor corridors, switches, cycles,
  more than 16 forwarded blocks, multiple writers, and multiarm updates fail
  closed.
  F154 recognizes one strict two-level, three-leaf conditional update tree.
  The root branch selects either one direct arm or a uniquely reached inner
  branch; the inner true/false successors form the other two direct arms. All
  three arms must merge at one join with exact predecessor/successor sets.
  Exactly two arms each contain one constant-offset partial scalar writer and
  the remaining arm is a pure carry. Each arm-to-join synthetic edge updates a
  complete lane vector, so no path evaluates another arm's writer sidecar.
  This advertises
  `bounded-multiarm-conditional-cyclic-byte-lane-memory-definedness-phi` and
  emits `multiarm_conditional_cyclic_byte_lane_memory_definedness_phis` with
  root/inner branches, route-labelled arms, exact edges, and per-lane
  store/carry sources. Validation reconstructs the complete two-level CFG,
  exact predecessor sets, two distinct writer sidecars, one all-carry arm,
  join-to-header carry, the non-carry seed, and the header AND. Forwarded
  multiarm arms, deeper or wider trees, switches, sequential updates,
  symbolic overlap, region copies, calls, atomics, and volatile accesses fail
  closed.
  F168 permits bounded corridors in the F163 mixed two-group tree. This
  advertises
  `bounded-forwarded-mixed-multigroup-recursive-conditional-cyclic-byte-lane-memory-definedness-phi`
  and emits
  `forwarded_mixed_multigroup_recursive_conditional_cyclic_byte_lane_memory_definedness_phis`
  with `forwarded=true`, `multiple_groups=true`, `group_count=2`,
  `mixed_groups=true`, and `composed_group_count=1`. Validation reconstructs
  both complete group partitions and proves the unique leaf-local override's
  nonempty internal-set difference. Two composed groups, forwarded
  multi-carry, nested or third groups, shared or branching corridors, symbolic
  overlap, region copies, calls, atomics, and volatile accesses fail closed.
  F170 permits exactly three direct, pure, pairwise-disjoint internal groups
  in the existing 4--8-leaf tree budget. Each group has at least two leaves
  and the tree retains at least one carry leaf. This advertises
  `bounded-trigroup-recursive-conditional-cyclic-byte-lane-memory-definedness-phi`
  and emits
  `trigroup_recursive_conditional_cyclic_byte_lane_memory_definedness_phis`
  with `multiple_groups=true`, `triple_groups=true`, and `group_count=3`.
  Validation rebuilds all three complete descendant/reference partitions and
  checks every pair for disjointness. Forwarding, local overrides, nested or
  four-or-more groups, symbolic overlap, region copies, calls, atomics, and
  volatile accesses fail closed.
  F173 permits bounded unique-predecessor forwarding corridors in the F170
  three-group tree. This advertises
  `bounded-forwarded-trigroup-recursive-conditional-cyclic-byte-lane-memory-definedness-phi`
  and emits
  `forwarded_trigroup_recursive_conditional_cyclic_byte_lane_memory_definedness_phis`
  with `forwarded=true`, `multiple_groups=true`, `triple_groups=true`, and
  `group_count=3`. Validation reconstructs every corridor and the actual tree
  before rebuilding all three complete source partitions and checking every
  pair for disjointness. Local overrides, nested or four-or-more groups,
  shared/branching corridors, symbolic overlap, region copies, calls, atomics,
  and volatile accesses fail closed.
  F174 permits exactly one partially overlapping leaf-local override in one
  of three direct groups. All groups retain at least two pure leaves and the
  eight-leaf tree retains one carry leaf. This advertises
  `bounded-composed-trigroup-recursive-conditional-cyclic-byte-lane-memory-definedness-phi`
  and emits
  `composed_trigroup_recursive_conditional_cyclic_byte_lane_memory_definedness_phis`
  with `multiple_groups=true`, `triple_groups=true`, `mixed_groups=true`,
  `composed_triple_groups=true`, `group_count=3`, and
  `composed_group_count=1`. Validation checks all pairwise-disjoint group
  partitions and the unique local source's nonempty internal-lane difference.
  Forwarding, exact/full overrides, a second composed group, nested or
  four-or-more groups, symbolic overlap, region copies, calls, atomics, and
  volatile accesses fail closed.
  F175 permits bounded unique-predecessor forwarding corridors in the F174
  composed three-group tree. This advertises
  `bounded-forwarded-composed-trigroup-recursive-conditional-cyclic-byte-lane-memory-definedness-phi`
  and emits
  `forwarded_composed_trigroup_recursive_conditional_cyclic_byte_lane_memory_definedness_phis`
  with `forwarded=true` plus all F174 group/composition markers. Validation
  reconstructs the actual tree before rechecking all three complete
  partitions, every pairwise-disjoint relation, and the unique local source's
  nonempty internal-lane difference. Shared/branching corridors, a second
  composed group, nested or four-or-more groups, symbolic overlap, region
  copies, calls, atomics, and volatile accesses fail closed.
  F171 permits exactly one partially overlapping leaf-local override in each
  of two direct groups. Both groups retain at least two pure leaves and the
  tree retains a carry leaf. This advertises
  `bounded-double-composed-multigroup-recursive-conditional-cyclic-byte-lane-memory-definedness-phi`
  and emits
  `double_composed_multigroup_recursive_conditional_cyclic_byte_lane_memory_definedness_phis`
  with `multiple_groups=true`, `group_count=2`, `mixed_groups=true`,
  `double_composed_groups=true`, and `composed_group_count=2`. Validation
  requires the two local writers to belong to different groups and proves
  both nonempty internal-set differences. Forwarding, more than one override
  per group, three-group composition, symbolic overlap, region copies, calls,
  atomics, and volatile accesses fail closed.
  F169 permits 2--8 distinct all-carry leaves in the forwarded F166 composed
  tree. This advertises
  `bounded-forwarded-multicarry-composed-repeated-source-recursive-conditional-cyclic-byte-lane-memory-definedness-phi`
  and emits
  `forwarded_multicarry_composed_repeated_source_recursive_conditional_cyclic_byte_lane_memory_definedness_phis`
  with `forwarded=true`, `composed_repeated_source=true`, `multicarry=true`,
  and the exact `carry_leaves` count. Validation reconstructs the corridor
  tree, recomputes all-carry vectors, and rechecks the composed internal-set
  difference. Multiple groups, shared or branching corridors, symbolic
  overlap, region copies, calls, atomics, and volatile accesses fail closed.
  F167 permits bounded corridors in the pure two-group F162 tree. This
  advertises
  `bounded-forwarded-multigroup-recursive-conditional-cyclic-byte-lane-memory-definedness-phi`
  and emits
  `forwarded_multigroup_recursive_conditional_cyclic_byte_lane_memory_definedness_phis`
  with `forwarded=true`, `multiple_groups=true`, and `group_count=2`.
  Validation reconstructs the tree first and then proves two disjoint complete
  descendant/reference partitions with identical lane sets inside each group.
  Mixed overrides, nested or third groups, shared or branching corridors,
  symbolic overlap, region copies, calls, atomics, and volatile accesses fail
  closed.
  F166 permits those corridors in one F160 per-lane composed tree with exactly
  one all-carry leaf. This advertises
  `bounded-forwarded-composed-repeated-source-recursive-conditional-cyclic-byte-lane-memory-definedness-phi`
  and emits
  `forwarded_composed_repeated_source_recursive_conditional_cyclic_byte_lane_memory_definedness_phis`
  with `forwarded=true` and `composed_repeated_source=true`. Validation
  reconstructs the actual tree before proving the pure group lane set, the
  leaf-local partial writer, and the nonempty internal-set difference.
  Forwarded multi-carry, multiple groups, shared or branching corridors,
  symbolic overlap, region copies, calls, atomics, and volatile accesses fail
  closed.
  F155 permits up to 16 unconditional unique-predecessor forwarding blocks on
  each of F154's three arms. Reverse corridor discovery must reach the nearest
  root or inner conditional branch, the three corridors must be disjoint, and
  the root's other successor must still enter the inner branch directly.
  Writer analysis covers every corridor block while lane state updates remain
  on the three endpoint-to-join synthetic edges. This advertises
  `bounded-forwarded-multiarm-conditional-cyclic-byte-lane-memory-definedness-phi`
  and emits
  `forwarded_multiarm_conditional_cyclic_byte_lane_memory_definedness_phis`.
  Each arm distinguishes its branch `successor` from its join endpoint and the
  transfer sets `forwarded`. Validation reconstructs each bounded jump chain,
  exact predecessor sets, corridor disjointness, writer membership, the
  two-writer/one-carry partition, join, seed, and header AND. A forwarded
  root-to-inner decision path, nested branches, multi-predecessor corridors,
  deeper trees, switches, and more than 16 arm blocks fail closed.
  F156 generalizes direct conditional lane updates to one strict binary source
  tree with 4--8 leaf predecessors, maximum depth 6, and at most 64 branch plus
  leaf blocks. Recursive traversal must cover the join's exact predecessor set;
  every child has its branch as the only predecessor, shared leaves and cycles
  are rejected, and only one complete root is permitted. At least two leaves
  each contain one distinct partial scalar writer and at least one leaf is a
  pure carry. Every leaf updates the full lane vector on its own synthetic
  edge. This advertises
  `bounded-recursive-conditional-cyclic-byte-lane-memory-definedness-phi` and
  emits `recursive_conditional_cyclic_byte_lane_memory_definedness_phis` with
  root, join, depth, explicit branch nodes, and lane-bearing leaf nodes. The
  validator recursively rebuilds the exact tree and actual depth before
  checking leaf edges, writer sidecars, lane assignments, join, seed, and
  header AND. Forwarded recursive leaves, repeated/grouped writers, sequential
  updates, trees outside the bounds, symbolic overlap, region copies, calls,
  atomics, and volatile accesses fail closed.
  F157 permits up to 16 unconditional unique-predecessor blocks on every
  recursive branch-to-child edge, including both decision and leaf corridors.
  The complete tree remains bounded to 64 branch, leaf, and corridor blocks.
  Intermediate blocks may not be reused by another tree edge. Leaf writer
  discovery spans its terminal corridor while state updates remain on the
  actual leaf endpoint edge. This advertises
  `bounded-forwarded-recursive-conditional-cyclic-byte-lane-memory-definedness-phi`
  and emits
  `forwarded_recursive_conditional_cyclic_byte_lane_memory_definedness_phis`;
  branch targets retain actual corridor entries, each leaf records its
  `successor`, and the transfer sets `forwarded`. Validation follows real
  jumps to the next declared branch or leaf, reconstructs unique predecessor
  and corridor membership sets, recalculates tree depth, and checks writer
  membership plus all F156 lane invariants. Nested conditional corridors,
  shared or multi-predecessor blocks, more than 16 blocks per edge, and
  repeated/grouped writer sources fail closed.
  F158 accepts one grouped partial writer in an internal branch block of an
  otherwise direct F156 tree. The strict unique-parent structure must prove
  that the writer block is the ancestor of at least two leaves; exactly that
  complete descendant-leaf set references the shared writer sidecar. Group
  leaves may not contain an overriding alias writer. At least one additional
  leaf-local writer and one carry leaf remain mandatory. This advertises
  `bounded-grouped-recursive-conditional-cyclic-byte-lane-memory-definedness-phi`
  and emits
  `grouped_recursive_conditional_cyclic_byte_lane_memory_definedness_phis`
  with `grouped=true`. Validation reconstructs branch children, derives the
  internal writer's complete descendant set, compares it to all leaves that
  reference the repeated store ID, and requires every other store to be
  leaf-local and unique. Multiple groups, nested overrides, forwarding in a
  grouped tree, repeated leaf positions, symbolic overlap, region copies,
  calls, atomics, and volatile accesses fail closed.
  F159 permits leaves inside the single F158 group to override the internal
  source with a nearer leaf-local writer. Every override must have the same
  canonical base, constant offset, and byte width as the internal writer, so
  it completely replaces the same lane set; at least two other descendant
  leaves continue to reference the internal source. This advertises
  `bounded-repeated-source-recursive-conditional-cyclic-byte-lane-memory-definedness-phi`
  and emits
  `repeated_source_recursive_conditional_cyclic_byte_lane_memory_definedness_phis`
  with `repeated_source=true`. Validation derives override positions as the
  internal branch's descendants minus repeated-source leaves, requires each
  override to have one unique leaf-local store, and compares its exact store
  lane set with the repeated source. Different-range partial composition,
  multiple groups, forwarding in a repeated-source tree, non-dominating
  repetition, region copies, symbolic overlap, calls, atomics, and volatile
  accesses fail closed.
  F160 permits one partially overlapping leaf-local writer inside that group.
  Lane transfer follows nearest-source order: the leaf-local writer wins for
  covered bytes, the internal writer supplies its remaining covered bytes,
  and all other bytes carry the prior loop state. At least two pure group
  leaves must retain the same complete internal lane set, while every composed
  leaf must retain at least one internal lane and use exactly one local writer.
  This advertises
  `bounded-composed-repeated-source-recursive-conditional-cyclic-byte-lane-memory-definedness-phi`
  and emits
  `composed_repeated_source_recursive_conditional_cyclic_byte_lane_memory_definedness_phis`
  with `composed_repeated_source=true`. Validation reconstructs per-store,
  per-leaf lane sets and requires the composed internal set to equal the
  complete group set minus the local override lanes. Complete shadowing,
  mixed exact and partial overrides, multiple internal groups, forwarding,
  symbolic overlap, region copies, calls, atomics, and volatile accesses fail
  closed.
  F161 permits 2--8 distinct pure all-carry leaves in an F160 composed tree.
  This advertises
  `bounded-multicarry-composed-repeated-source-recursive-conditional-cyclic-byte-lane-memory-definedness-phi`
  and emits
  `multicarry_composed_repeated_source_recursive_conditional_cyclic_byte_lane_memory_definedness_phis`
  with `multicarry=true` and the exact `carry_leaves` count. Validation
  reconstructs every leaf and independently counts vectors whose lanes are
  all carry; the count must match the declaration and every carry leaf must
  retain the recursive tree's unique-parent and independent-edge invariants.
  Shared carry nodes, one or more than eight carry leaves, forwarding,
  multiple internal groups, symbolic overlap, region copies, calls, atomics,
  and volatile accesses fail closed.
  F162 permits exactly two direct, disjoint internal writer groups. Each
  internal writer must have at least two descendants, and its complete
  descendant-leaf set must exactly equal the leaves that reference that store
  ID. No leaf may belong to both groups or contain a local override; no third
  store source is admitted. This advertises
  `bounded-multigroup-recursive-conditional-cyclic-byte-lane-memory-definedness-phi`
  and emits
  `multigroup_recursive_conditional_cyclic_byte_lane_memory_definedness_phis`
  with `multiple_groups=true` and `group_count=2`. Validation independently
  rebuilds both descendant partitions and their lane sets. Nested, overlapping,
  forwarded, or three-or-more groups, group-local overrides, symbolic overlap,
  region copies, calls, atomics, and volatile accesses fail closed.
  F163 permits exactly one of the two F162 groups to contain one partially
  overlapping leaf-local override. Both groups still require at least two pure
  leaves. This advertises
  `bounded-mixed-multigroup-recursive-conditional-cyclic-byte-lane-memory-definedness-phi`
  and emits
  `mixed_multigroup_recursive_conditional_cyclic_byte_lane_memory_definedness_phis`
  with `mixed_groups=true` and `composed_group_count=1`. Validation reconstructs
  each complete group lane set, requires the one local source to be leaf-local,
  and proves that the composed leaf retains exactly the internal lanes not
  covered by the local writer. Complete shadowing, overrides in both groups,
  exact/partial mixing, forwarding, nested or third groups, symbolic overlap,
  region copies, calls, atomics, and volatile accesses fail closed.
  F164 permits bounded forwarding corridors in the pure single-group F158
  tree. Every branch-to-child edge may contain at most 16 unconditional
  unique-predecessor blocks, with at most 64 reconstructed tree/corridor
  nodes overall. This advertises
  `bounded-forwarded-grouped-recursive-conditional-cyclic-byte-lane-memory-definedness-phi`
  and emits
  `forwarded_grouped_recursive_conditional_cyclic_byte_lane_memory_definedness_phis`
  with both `forwarded=true` and `grouped=true`. Validation first reconstructs
  every actual jump, predecessor set, leaf corridor, and the exact recursive
  depth, then independently proves that the internal writer's descendant set
  equals its repeated store-ID references. Repeated/composed overrides,
  multiple groups, shared or branching corridors, symbolic overlap, region
  copies, calls, atomics, and volatile accesses fail closed.
  F165 permits those bounded corridors in the F159 same-range override tree.
  This advertises
  `bounded-forwarded-repeated-source-recursive-conditional-cyclic-byte-lane-memory-definedness-phi`
  and emits
  `forwarded_repeated_source_recursive_conditional_cyclic_byte_lane_memory_definedness_phis`
  with both `forwarded=true` and `repeated_source=true`. Validation reconstructs
  the complete corridor tree before deriving the unique internal writer,
  pure descendant lane set, and exact same-range override partition. Partial
  overlap, multi-carry, multiple groups, shared or branching corridors,
  symbolic overlap, region copies, calls, atomics, and volatile accesses fail
  closed.
  A no-store path reaching the continuation entry may contribute a defined
  state for a direct scalar global with a same-type constant integer
  initializer. Internal callees do not assume that globals are reinitialized. The
  edge writes true while runtime numeric memory reads the initial image; this
  advertises `bounded-initial-memory-definedness-merge`. A constant-offset
  global aggregate subcell is also accepted when target-DataLayout address
  normalization and LLVM `ConstantFoldLoadFromConst` prove a typed
  `ConstantInt` initial value. Independently recomputed equivalent GEPs use
  the canonical-address proof; the artifact advertises
  `bounded-initial-subobject-definedness-merge` and marks both `initial` and
  `initial_subobject`. The production validator requires
  `initial_subobject => initial`. Symbolic-index subcells, stack/heap initial
  state, and undef/poison initializers are not inferred.

  Pointer-memory provenance merges a global cell's static initializer with
  all exact runtime reaching stores. Finite symbolic GEP pointer values are
  enumerated within their proven object/index domain and selected by the
  actual loaded address, advertising `bounded-symbolic-pointer-memory`.
  Artifacts containing both initial and runtime definitions advertise
  `pointer-initial-definition-merge`; data provenance and function-target
  discovery consume the same merged definition set.
  Nondeterministic identity follows the persisted F93 instance counter.
  Poison through symbolic aliasing/cyclic/multi-access memory, arbitrary
  cross-function operations, self-dependent PHIs, or multiple consumers
  remains in the defined-only subset.

  Other pointer entry signatures, a second symbolic GEP term or multi-term GEP,
  pointer/index-width-mismatched DataLayout,
  symbolic alias sets larger than the configured bound, dynamic/scalable alloca,
  stack loads without a dominating initializer, fixed-size malloc pool
  exhaustion as a target-visible failure path,
  moving realloc, realloc-null, custom allocators, arbitrary symbolic-union free,
  cyclic pointer PHI, multi-term caller-side symbolic GEP, callee-stack pointer
  escape, function pointers loaded from arguments/global/heap memory,
  recursive indirect calls, heap-graph escape through
  memory/external context,
  nested/runtime-mutated pointer tables, loop or multi-level memory merges,
  escaped pointer cells, ordered pointer comparison, vector/FP, recursion,
  exceptions, symbolic or over-64-byte memory/string/region length,
  region copies whose disjointness cannot be proven, other external calls,
  TLS/nonzero address spaces,
  atomic/volatile access, nonlinear poison propagation,
  and poison-sensitive vector/FP operations produce a rejection report or an
  explicit bounded-runtime error. Symbolic addresses outside the finite
  contract are rejected instead of concretized.
  Therefore
  `continuation_ir_resume_supported=true` does not imply arbitrary native
  instruction resume.

- Research-grade benchmark protocol:

      python3 benchmark/research_protocol.py plan SPEC.json \
        --output protocol.json
      python3 benchmark/research_protocol.py verify protocol.json
      python3 benchmark/research_protocol.py run protocol.json \
        --output-dir research_results --resume
      python3 benchmark/research_protocol.py verify protocol.json \
        --results-dir research_results

  A spec defines `targets`, named `configurations` (argv, environment,
  `cpu_cores`), `repeats`, equal `cpu_budget_seconds`, `random_seed`, and
  `phase=tuning|confirmatory`. Confirmatory plans require at least 20 repeats.
  The executor sets `SYMCC_EXPERIMENT_ID`, `SYMCC_RUN_ID`, `SYMCC_PAIR_ID`,
  `SYMCC_RESEARCH_PHASE`, `SYMCC_RESEARCH_CONFIGURATION`,
  `SYMCC_RANDOM_SEED`, and
  `SYMCC_CPU_BUDGET_SECONDS` plus `SYMCC_CPU_CORES` for child commands,
  enforces CPU affinity and per-cell wall budget, retains failures/timeouts,
  and hashes all raw artifacts. The inner benchmark uses the declared core
  count, rather than inferring it from mode/np, when recording CPU and wall
  budgets.
  Provenance includes tracked and untracked worktree content, recursive dirty
  submodules, and file or directory corpus trees; a dirty checkout is therefore
  identified by content rather than by commit id alone.
  A configuration may set `wall_grace_seconds` (default 0, maximum 3600) for
  MPI/fuzzer teardown and artifact collection after the campaign wall budget.
  It is recorded separately as `wall_timeout_seconds` and is not added to the
  campaign coverage/CPU denominator. The child command must enforce its target
  timeout at `cpu_budget_seconds / cpu_cores`; the outer executor kills the
  process group only after campaign budget plus grace.

- benchmark/run_benchmark.py --bin-dir DIR (default `OUTPUT/bin`): Build into
  or, with `--skip-build`, reuse binaries from a directory independent of the
  per-run result directory. Confirmatory protocol cells should share one
  immutable prebuilt directory and list it in the protocol `inputs`, so compile
  time is outside the run budget and the exact binaries are tree-hashed.

- benchmark/run_benchmark.py --timeseries SECONDS: Sample authoritative AFL
  edge coverage for serial, MPI, hybrid, and AFL-only runs. Every tick snapshots
  the initial corpus and all live output queues; hybrid additionally includes
  unfiltered SymCC, GRIMOIRE, and honggfuzz corpora. During the campaign it only
  creates hard links. Content de-duplication and showmap replay are deferred
  until the child campaign has stopped, so measurement does not steal its
  assigned CPUs. Target `.args` are forwarded to both execution and every
  replay. Empty/unavailable measurements are omitted instead of encoded as
  genuine zero coverage, and a final corpus point is recorded when the run
  stops between ticks. Keep snapshots on the same filesystem as the work
  directory and provision equal `wall_grace_seconds` for post-run replay.
  Nested MPI wall/per-execution/idle timeouts and AFL/hybrid initialization
  waits are capped by the runner's `--timeout`; short campaigns are never
  silently extended to historical 10s or 30s minimums.

- Paired analysis:

      python3 benchmark/analyze_ablation.py results/benchmark_data.csv \
        --timeseries results/coverage_timeseries.csv \
        --metric coverage_auc --metric edge_cov_pct \
        --baseline-mode baseline --strict-confirmatory \
        --output-dir results/analysis

  The analyzer reports total/success/failure/timeout/censored counts, paired
  median-difference bootstrap intervals, paired sign-flip randomization,
  direction-aware A12/Cliff's delta, and Holm correction. `--time-to-target N`
  adds right-censored target time from the supplied time series.

- Executable research evidence: generate and verify a versioned v2 bundle
  covering bounded Source-DPOR equivalence, joint path/schedule/RF solving,
  SC/TSO/RA litmus obligations, live-state COW/restore, weak-initial
  wakeup/ready evidence, and bounded ConDPOR graph/revisit:

      python3 util/research_evidence.py --output evidence.json
      python3 util/research_evidence.py --verify evidence.json

  The artifact records formula/input hashes, bounds, exact backend capabilities,
  expected oracles, environment, and explicit claim exclusions. A single
  available libz3 backend is recorded as such and is not called independent
  cross-solver consensus. This evidence is functional I/T evidence, not a
  replacement for equal-CPU repeated benchmark results.

- SYMCC_AFL_DATA_COVERAGE=0/1 (default 1 for --hybrid-adaptive, 0 otherwise in
  the benchmark harness): Build and inject util/afl_data_coverage_rt.c through
  AFL_PRELOAD. The preload runtime intercepts memcmp/strcmp-family calls in the
  target process and writes matched-prefix progress directly into AFL's native
  shared coverage bitmap, resolving either exported __afl_area_ptr or the
  __AFL_SHM_ID SysV shared-memory map. AFL's normal queue retention logic can
  then keep inputs that improve constant/data comparisons even when edge
  coverage is unchanged. For AFL++ PCGUARD targets the preload reserves the
  first 65536 map IDs before forkserver negotiation, so instrumented edge IDs
  start after the data namespace. Comparison sites use module-relative
  identities and therefore remain stable across PIE/ASLR processes.

- AFL_DATA_COVERAGE=0/1 (default 1 inside the preload runtime): Emergency
  runtime switch for disabling the native AFL data-coverage preload when it is
  already present in AFL_PRELOAD.

- SYMCC_AFL_DATA_MAP_SIZE=N (default 65536, range 1--65536): Narrow the hash
  range used inside the reserved native data namespace. This does not resize
  the AFL map. In particular, AFL++'s internal __AFL_MAP_SIZE is an allocation
  bound and is intentionally not used as the data hash range.

- SYMCC_AFL_HINT_MUTATOR=0/1 (default 1 for --hybrid-adaptive, 0 otherwise in
  the benchmark harness): Enable an AFL++ Python custom mutator that consumes
  SymCC hint tokens and poly-cache entries. The benchmark harness auto-detects
  AFL++ Python mutator support, sets AFL_PYTHON_MODULE to
  util.afl_symcc_hint_mutator by default, and leaves existing user settings
  untouched.

- SYMCC_HINT_DIR=PATH (default "$AFL_OUT/symcc01/extras" in adaptive hybrid
  runs): Directory watched by the AFL++ mutator for SymCC changed-byte hint
  tokens.

- SYMCC_POLY_CACHE_MUTATOR=PATH (default "$AFL_OUT/symcc01/.poly_cache" in
  adaptive hybrid runs): Poly-cache file read by the AFL++ mutator. If unset,
  the mutator falls back to SYMCC_POLY_CACHE. Rows may include a sixth
  full-matrix field in the form `lower:upper:offset=coefficient,...;...`; when
  present, the mutator samples inside the correlated linear constraints rather
  than treating byte ranges independently.

- SYMCC_HINT_MUTATOR_RESCAN=SECONDS (default 1.0): Minimum interval between
  hint/poly-cache rescans inside afl-fuzz.

- SYMCC_HINT_MUTATOR_COUNT=N (default 4, maximum 32): Number of custom-mutator
  outputs AFL++ should request for an input when hints or cache entries exist.

- SYMCC_HINT_MUTATOR_TOKENS=N / SYMCC_HINT_MUTATOR_TOKEN_MAX=N: Bound the
  number and maximum size of hint tokens scanned by the AFL++ mutator.

- SYMCC_HINT_MUTATOR_CACHE_LINES=N (default 4096): Maximum number of recent
  poly-cache lines scanned by the AFL++ mutator.

- SYMCC_HINT_MUTATOR_POLY_ATTEMPTS=N (default 128, range 8..4096): Number of
  bounded attempts used by the AFL++ mutator to recover a feasible full-matrix
  polytope point when applying a cached abstraction to an unrelated AFL seed.

- SYMCC_HINT_MUTATOR_STRING_LINES=N (default 4096): Maximum number of recent
  `symcc-string-constraint-v1` JSONL rows scanned by the AFL++ mutator when
  `SYMCC_STRING_CONSTRAINTS` or `SYMCC_STRING_CONSTRAINT_OUT` is set.

- SYMCC_AFL_PROFILES=0/1 (default 1 in adaptive hybrid when --aflpp-profiles is
  not off): Enable xFUZZ/KRAKEN-style AFL++ runtime profile orchestration. The
  runner can distribute AFL instances across power schedules, MOpt, CmpLog, and
  available AFL++ compile-time variants such as LAF/CompCov, CTX, Ngram, and
  LAF+CTX.

- SYMCC_AGENTIC_OUT=PATH (default empty): Experimental agentic-concolic hook.
  When set, the MPI master appends JSONL summaries for high-value solver tasks
  and open-prefix work. The core fuzzer does not call an LLM; this is an
  offline/export interface.

- SYMCC_AGENTIC_HINTS=PATH (default empty): Experimental JSON hints consumed by
  the MPI master. Hints are keyed by input sha256 or path and may override
  focus_bytes, focus_set, target_branch, strategy, s2f_actions, and route for a
  dispatched work item.

- SYMCC_AGENTIC_CMD=COMMAND (default empty): Optional online agentic hook. For
  each completed concolic execution with telemetry, an asynchronous backend
  sends the exported task JSON to COMMAND on stdin and expects one hint JSON
  object on stdout. Invalid JSON, non-zero exits, and timeouts are ignored.

- SYMCC_AGENTIC_BACKENDS=<JSON-or-path>: Provider portfolio for real external
  agent backends. Each entry has `type: command` plus `command`, or `type:
  http`/`chat-completions` plus `url`, optional `headers`, `protocol`, `model`,
  and `system_prompt`. Header values of the form `env:NAME` read credentials
  from the environment. Direct hint JSON, `{hint: ...}`, chat-completion
  `choices[].message.content`, and text-content envelopes are accepted. All
  outputs are reduced to the bounded scheduling-field whitelist before use.

- SYMCC_AGENTIC_TIMEOUT=SECONDS (default 2.0): Per-query backend timeout.
  Queries run outside the MPI scheduling loop and are applied on a later visit
  to the same content digest/path.

- SYMCC_AGENTIC_WORKERS (default 2), SYMCC_AGENTIC_FAILURE_THRESHOLD (default
  3), SYMCC_AGENTIC_COOLDOWN (default 30 seconds), SYMCC_AGENTIC_CACHE (default
  2048): Bound asynchronous concurrency, open a per-provider circuit breaker
  after repeated failures, and cache validated hints by canonical task digest.

- SYMCC_AGENTIC_BUILTIN=0/1 (default 1 in adaptive mode): Enable the built-in
  deterministic agentic planner. It keeps a persistent bandit-style state over
  solver strategies, target branches, and per-input route memories, then emits
  the same strategy, focus_bytes, target_branch, and s2f_actions hints as the
  external hook.

- SYMCC_AGENTIC_ROUTE=hybrid|cottontail|concollmic|gordian|off (default
  hybrid): Select the built-in planner's LLM-inspired routing policy.
  Cottontail route learns structure-local comparison-taint focus slices;
  ConcoLLMic route learns actionseed-style target solving; Gordian route sends
  solver-hostile tasks to sampling/ghost-code-style exploration. This policy is
  deterministic and does not call a model by itself.

- SYMCC_AGENTIC_STATE=PATH (default "$AFL_OUT/<symcc-name>/.agentic_planner.json"):
  State file for the built-in planner.

- SYMCC_VERIFIED_PROPOSALS=PATH (default empty): Incrementally consume JSONL
  semantic candidate proposals. Accepted kinds are inverse, surrogate,
  heap_partition, solve_complete, query_hole_completion,
  history_acquisition, targeted_transform, and semantic. A record supplies
  either `candidate: {"hex": ...}` / `{"text": ...}`, or a source_path plus
  bounded offset patches, append, and/or truncate operations. Proposals are data
  only; executable code and commands are not accepted.

  Example:
    {"kind":"inverse","source_path":"/tmp/seed","target_branch":123,
     "patches":[{"offset":4,"hex":"504b0304"}]}

  The worker executes the materialized candidate against the real target. For
  a nonzero target_branch, telemetry must report the same target id and
  target_reached=true. A verified candidate then enters normal AFL bitmap
  triage and is marked retained only if it owns globally novel coverage bits.
  Proposal state and content-addressed candidates are persisted below
  `.verified_proposals` in the SymCC output directory.

- SYMCC_PROPOSAL_PARSER=COMMAND (default empty): Optional independent parser
  validity oracle applied only after the real target/branch gate succeeds.
  `{input}` in the shell-split command is replaced with the candidate path; if
  absent, the path is appended. Exit status zero accepts syntax, any other
  status, launch error, or timeout rejects the proposal. Stdout/stderr are
  discarded. Parser acceptance never substitutes for target replay or AFL
  novelty.

  If COMMAND contains `{trace}`, it is replaced with a fresh output path and
  the parser must atomically or directly write either the v1 tree format:
    {"schema":"symcc-parser-structural-trace-v1",
     "parser":"tree-sitter-json-0.25","accepted":true,
     "nodes":[
       {"symbol":"document","state":"root","start":0,"end":12,"parent":-1},
       {"symbol":"string","state":"object-value","start":5,"end":10,
        "parent":0}]}

  `accepted` must agree with the process exit status. Nodes use half-open byte
  spans, parents must precede and contain children, labels are bounded printable
  ASCII, and the whole trace is capped at 4096 nodes/1 MiB. A malformed trace,
  an exit-status mismatch, or no node enclosing a grammar replacement span
  rejects the proposal. The smallest enclosing node contributes parser
  implementation, nonterminal/state, and ancestor chain to a stable structural
  context ID. Every node on the selected ancestry is additionally normalized as
  `symcc-parser-production-v1`: the LHS/state, ordered RHS child labels, and
  terminal-gap digests form a stable production ID. Repeated nonterminals on
  the ancestry produce mutual-recursion cycle paths; every same-symbol direct
  child produces a separate recursive slot, including multi-slot productions.
  The resulting `symcc-parser-cfg-fragment-v2` contains at most 32 productions,
  16 cycles, and 32 bounded subtree instances. Direct siblings must be
  disjoint and ancestry is capped at 32.
  At most 128 concrete bytes surrounding each descendant are retained as a
  bounded derivation template; empty, overlapping, or oversized recursion is
  not induced. Each production also has a shape ID that excludes terminal-gap
  contents. A subtree instance binds that shape and production to its complete
  yield, terminal-gap bytes, and ancestry path. Instance yields and total
  terminal gaps are independently capped at 256 bytes. If instance evidence
  would exceed the 64 KiB fragment limit, non-selected instances are
  deterministically removed first; CFG/cycle evidence is preserved whenever
  it still fits. Trace files are removed after validation; their SHA-256,
  selected symbol/state, context/production/shape/instance IDs, canonical CFG
  fragment, and bounded recursion evidence remain in proposal-state schema 12.

  F227 provides an executable persistent Tree-sitter implementation of this
  command contract. Start one service per parser/experiment:

    python3 util/tree_sitter_incremental_parser.py serve \
      --socket /tmp/symcc-tree-sitter-json.sock \
      --language-module tree_sitter_json \
      --parser-name tree-sitter-json-0.24

  Then configure the MPI master:

    SYMCC_PROPOSAL_PARSER='python3 util/tree_sitter_incremental_parser.py parse --socket /tmp/symcc-tree-sitter-json.sock --input {input} --trace {trace} --cache {cache}'

  The service requires `tree-sitter>=0.25,<0.27` and a language provider such
  as `tree-sitter-json`; the executable JSON conformance provider is listed in
  `requirements.txt`. `serve` retains at most 256 native TSTree objects and
  serializes access through a mode-0600 Unix socket. Options `--max-trees`,
  `--max-nodes`, and `--max-input-bytes` set hard bounds. Use `ping` to obtain
  cold/incremental/reused-node telemetry and `shutdown` for a clean stop.
  `SYMCC_PROPOSAL_PARSER_TIMEOUT` must cover the client RPC and parse time.

  For an incremental manifest, the service reconstructs the exact edit,
  copies the accepted base TSTree, calls `Tree.edit`, and passes that old tree
  to `Parser.parse`. A reuse receipt contains only offered base nodes whose
  native Tree-sitter node ID occurs in the new tree. Tree-sitter defines equal
  IDs across old/new incremental trees as actual node reuse. The proposal
  manager then independently rechecks each mapping's symbol, parse state,
  mapped span, epsilon flag, and candidate-yield SHA-256. A missing in-memory
  base tree is a valid cold-parse fallback; an invalid manifest, trace, or
  receipt cannot authorize a proposal.

  This adapter exports Tree-sitter's concrete syntax tree as structural trace
  v2. It is a real native incremental parser integration, but Tree-sitter does
  not expose a complete ambiguous GLR/SPPF forest; packed alternatives still
  require a parser that emits structural trace v3/v4.

- SYMCC_PROPOSAL_PARSER_CACHE=0/1 (default 1): Cost-faithfully enable the
  `{cache}` manifest path. When disabled, every parser validation is cold:
  the manager does not create a manifest, retain a trace-cache entry, or count
  a cache request even if COMMAND contains `{cache}`. This is the F228 cold
  ablation control; parser acceptance and structural trace validation remain
  enabled.

- SYMCC_PARSER_RESEARCH_ARTIFACT=PATH (default
  `$SYMCC_RESEARCH_RUN_DIR/parser_research_artifact.json` when a sealed run
  directory exists): Atomically write
  `symcc-parser-research-artifact-v1` at MPI initialization, periodic state
  saves, and graceful/finally shutdown. The canonical SHA-256 binds proposal
  state schema 12, cache mode, protocol/run/pair/configuration/seed/CPU
  metadata, manager-observed parser wall time, parser-reported native parse
  time, trace bytes, request/offer/receipt/zero-reuse counts, verified
  Tree-sitter node-ID proofs, reused/invalidated nodes, acceptance, and cache
  capacity. These metrics are audit evidence and never authorize a proposal.

  `benchmark/research_protocol.py` recognizes
  `parser_incremental_ablation`, expands `parser-cold` and
  `parser-incremental` with identical command/core/grace settings, and sets
  `SYMCC_PARSER_REQUIRE_ARTIFACT=1`. A successful run with a missing,
  corrupted, or cross-run artifact is retained as failed. Analyze verified
  scalars with:

    python3 benchmark/analyze_ablation.py benchmark_data.csv \
      --parser-artifact RESULTS_DIR \
      --metric proposal_parser_mean_wall_time_us

  Proposal state schema 12 persists cumulative counters and accepts states
  v1--v11. Restore rejects impossible request/offer/receipt/proof nesting,
  totals below their latest value, or counters above signed 64-bit bounds.

  F229 provides a real complete ambiguous-forest provider for this contract.
  A persistent Lark 1.3 generalized Earley service constructs the SPPF
  directly (`ambiguity="forest"`) instead of enumerating parse trees:

    python3 util/lark_sppf_parser.py serve \
      --socket /tmp/symcc-lark.sock \
      --grammar benchmark/grammars/target.lark \
      --start start \
      --parser-name target-lark-earley

  Configure the proposal manager with:

    SYMCC_PROPOSAL_PARSER='python3 util/lark_sppf_parser.py parse --socket /tmp/symcc-lark.sock --input {input} --trace {trace}'

  The adapter requires `lark>=1.3,<1.4`, uses byte mode and the
  `dynamic_complete` lexer so trace spans are exact candidate byte offsets and
  lexical ambiguity is retained. Symbol nodes, LR(0) intermediate items,
  packed productions, and token nodes are encoded as a forward shared DAG.
  Packed-production wrapper nodes preserve two derivations even when their
  child lists are identical. Lark's priority-stable first packed derivation is
  alternative zero; any SPPF sharing that would give this selected derivation
  multiple primary parents is cloned only along that primary projection.
  Non-primary sharing remains shared.

  Zero-width Lark subforests cannot be written directly because structural
  trace v3 requires epsilon nodes to be leaves. The adapter collapses those
  subforests, promotes the trace to v4, and emits every distinct observed
  nullable dependency as a rule for the manager's independently recomputed
  SCC/least-fixed-point certificate. More than 32 nullable rules, a cyclic
  (infinitely ambiguous) SPPF, more than 4096 encoded nodes, more than 16384
  edges, more than eight alternatives per symbol, or a trace over 1 MiB fails
  closed. These bounds guarantee that an accepted trace is complete within
  the declared representation; no partial forest is silently labeled
  complete.

  `--max-nodes`, `--max-edges`, and `--max-input-bytes` may lower the hard
  limits. The mode-0600 Unix service compiles one immutable grammar once and
  serializes requests. `ping` reports grammar digest, Lark version, accepted/
  rejected/failure counts and Earley time; `shutdown` removes the socket.
  Syntax rejection emits a valid negative trace and returns one. Internal,
  cyclic, or resource-bound failures return two and cannot authorize a
  proposal. This service is generalized Earley/SPPF in Python; it is not
  described as a native-C GLR/GLL or incremental-forest implementation.

  F233 adds an independent generalized LR provider:

    python3 util/parglare_sppf_parser.py serve \
      --socket /tmp/symcc-parglare.sock \
      --grammar benchmark/grammars/target.pg \
      --parser-name target-parglare-glr

    SYMCC_PROPOSAL_PARSER='python3 util/parglare_sppf_parser.py parse --socket /tmp/symcc-parglare.sock --input {input} --trace {trace}'

  The adapter requires `parglare>=0.21,<0.22`. `GLRParser` runs with shift,
  empty-shift, and lexical preference disabled and `build_tree=true`; its
  `Forest.result` Parent/possibility graph is encoded directly, without
  reading `Forest.solutions` or enumerating trees. Parent nodes become grammar
  symbols, each NodeNonTerm production becomes an `@packed` wrapper, terminal
  possibilities become `@token` wrappers, and shared child Parent objects
  remain shared. The manager accepts proof
  `parglare-glr-complete-sppf-v1` only with the parglare telemetry schema,
  grammar SHA-256, bounded version, and the same independently recomputed
  node/alternative/edge/nullable/cost relationships as Lark.

  Candidate bytes are decoded one-to-one with Latin-1 before GLR parsing, so
  parglare character positions remain byte offsets. Grammar authors must
  therefore express non-ASCII terminals in that byte-oriented alphabet; this
  is not Unicode-codepoint parsing. The same 4096-node, 16384-edge,
  eight-alternative, 64-child, 32-nullable-rule, and 1 MiB bounds apply.
  Cyclic SPPFs, including infinite nullable ambiguity, fail closed. This is an
  independent pure-Python GLR/SPPF oracle for differential validation, not a
  native or incremental implementation.

  F230 makes the F229 provider proof-carrying at the manager boundary.
  `forest_telemetry` must use proof `lark-earley-complete-sppf-v1` and bind a
  valid grammar SHA-256 and bounded Lark version. The manager recomputes the
  encoded node, alternative, edge, and nullable-rule counts from the validated
  trace; it also checks accepted/complete equivalence, raw/clone/encoded
  relationships, elapsed bounds, v3/v4 consistency, and rejects simultaneous
  Tree-sitter incremental and Lark forest telemetry.

  Proposal state schema 12 accumulates forest traces, complete traces, proofs,
  raw/encoded nodes, primary-only clones, packed alternatives, edges, nullable
  rules, and Earley parse time. It accepts state v1--v11; restore checks
  `complete <= proof <= forest trace <= parser validation`, size/cost bounds,
  and forest time no greater than total parser-reported time. The existing
  sealed parser artifact includes all `proposal_parser_forest_*` scalars and
  derived complete rate/mean size/mean time. The artifact also seals the
  normalized parser-command SHA-256 and the sorted set of observed grammar
  SHA-256 values; state restoration rejects forest records whose grammar
  identity is missing or changed.

- SYMCC_PARSER_FOREST_MODE=off|selected|complete: Experiment binding used by
  F230's `parser_forest_ablation`. The MPI master copies this value into parser
  artifact metadata. It does not select a parser by itself; the protocol also
  sets `SYMCC_PROPOSAL_PARSER`. The artifact verifier requires off/selected
  cells to have zero complete-forest traces and requires the metadata mode to
  match the sealed configuration.

  `benchmark/research_protocol.py` accepts `parser_forest_ablation` with one
  `base_configuration`, `selected_parser_command`, `forest_parser_command`,
  and the precomputed `forest_grammar_sha256`. It expands equal-CPU
  `parser-forest-off/selected/complete` cells, disables the F212 cache in all
  three, and requires `parser_research_artifact.json`. This is a semantic and
  cost calibration, not an incremental-parser speedup test.

- SYMCC_PARSER_CROSS_MODE=off|paired: Experiment binding for F231's
  candidate-identical dual-oracle calibration. `off` forbids paired evidence.
  `paired` requires `cross_parser_telemetry` on every observed complete-forest
  trace and copies the mode into the sealed parser artifact. The variable does
  not select either parser; `SYMCC_PROPOSAL_PARSER` must invoke
  `util/cross_parser_oracle.py`.

- SYMCC_PARSER_CROSS_PRIMARY_SHA256 and
  SYMCC_PARSER_CROSS_SECONDARY_SHA256: Protocol-generated SHA-256 identities
  of the child parser argv. The primary is normally the Lark complete-SPPF
  command and remains the proposal admission oracle. The secondary is normally
  the Tree-sitter selected-CST command and contributes calibration evidence
  only. The artifact verifier requires the observed ordered command pair to
  match these values.

  `cross_parser_oracle.py` requires exact `{input}` and `{trace}` argv tokens
  in each child command, rejects shell execution and `{cache}`, and runs the
  two child processes concurrently under independent timeouts. Return codes
  zero and one mean accepted and rejected; any other code, timeout, malformed
  trace, nested cross receipt, or output over 1 MiB fails closed. The wrapper
  binds the candidate SHA-256, canonical primary/secondary trace digests,
  parser names, acceptance bits, return codes, child command digests, and
  elapsed times.

  Proposal state schema 13 accepts v1--v12 and adds the four candidate-paired
  outcomes: both-accept, primary-only, secondary-only, and both-reject. The
  manager independently runs the ordinary v1--v4 validator on the embedded
  secondary trace, checks that the four cells sum to paired traces and that
  agreement equals both-accept plus both-reject, and persists the ordered
  command pair. The sealed artifact repeats these identities and invariants.

  `benchmark/research_protocol.py` accepts `parser_cross_calibration` with one
  base configuration plus `selected_parser_command`, `forest_parser_command`,
  `paired_parser_command`, and `forest_grammar_sha256`. It generates equal-CPU
  `selected/complete/paired` cells with parser cache disabled. The paired cell
  additionally requires one complete-forest trace per cross-parser trace.
  Aggregate acceptance rates from separate cells are not a substitute for
  this same-candidate confusion matrix.

  F232 extends proposal state to schema 14 and derives parser-neutral
  structural correspondence after both child traces have passed validation.
  For the primary it records unique non-epsilon byte spans from both the
  alternative-zero projection and the complete encoded forest. For the
  secondary it records the selected-tree spans. Repeated Symbol, intermediate,
  and packed nodes with the same yield count once; the full-input root span is
  removed when a non-root span exists. Internal byte boundaries are compared
  separately.

  The state and sealed artifact accumulate primary-selected, primary-forest,
  secondary, shared, and union span counts plus primary/secondary/shared/union
  boundary counts. Restore and artifact verification require the exact set
  identities `union = left + right - intersection`, selected spans to be a
  subset of forest spans, and structural pairs to equal both-accept pairs.
  Research metrics expose micro-averaged selected-span precision/recall/
  Jaccard, forest-span precision/recall/Jaccard, and boundary Jaccard.
  Schema-13 states migrate with their acceptance quadrants intact and zero
  historical span evidence; no unobserved correspondence is reconstructed.

  F234 extends proposal state to schema 15 with proof-carrying grammar
  correspondence. This is derived only for both-accepted child traces. The
  manager takes each validated alternative-zero projection, transparently
  removes provider-only symbols whose names start with `@`, and computes a
  recursive parser-neutral shape from `(start,end,epsilon)` plus ordered
  relative child extents. The implementation uses an explicit stack and
  remains bounded by the existing 4096-node trace limit.

  A symbol observation is retained only when one `span+shape` bucket has
  exactly one grammar node on each side. A bucket with unresolved multiplicity
  increments `parser_cross_ambiguous_symbol_spans` and contributes no guessed
  mapping. A production observation additionally requires equal, non-empty
  ordered direct-child partitions after transparent wrappers are removed.
  Consequently these counters are sample-conditioned structural evidence,
  not a declaration that two symbol names or CFG languages are equivalent.

  Every record persists canonical
  `symcc-parser-correspondence-v1` JSON and its SHA-256. Restore recomputes the
  canonical encoding, label and shape bounds, sorted unique mapping keys,
  observation sums, and
  `production_correspondences <= symbol_correspondences
   <= min(primary_symbols, secondary_symbols)`.
  Schema-1 through schema-14 states remain readable and receive zero
  historical correspondence fields.

  The sealed parser research artifact adds
  `parser_cross_symbol_correspondence` and
  `parser_cross_production_correspondence`. Entries bind both parser names,
  both symbols, production states where applicable, a production shape digest,
  and the support count. Manager and benchmark verifiers independently check
  sorting, uniqueness and sums. Metrics include primary/secondary symbol
  alignment rates and production-to-symbol alignment rate. These maps are
  observational diagnostics only; the primary child remains the sole parser
  admission oracle.

  Before interpreting a zero-disagreement paired calibration as grammar
  agreement, run a bounded exhaustive audit where the input alphabet permits:

    python3 util/parser_equivalence_audit.py \
      --primary-command "PRIMARY ... {input} ... {trace}" \
      --secondary-command "SECONDARY ... {input} ... {trace}" \
      --alphabet-hex 002c3a6162 \
      --max-length 4 \
      --counterexample-limit 32 \
      --output parser_equivalence_artifact.json

  Enumeration is shortlex and includes the empty input. The alphabet contains
  1--16 distinct bytes and is canonicalized into ascending byte order. The
  exact domain `sum(|alphabet|^i, i=0..max_length)` cannot exceed 65536.
  Every case uses the ordinary paired wrapper and manager structural validator.
  Any timeout, child internal return code, malformed trace, invalid provider
  proof, or incomplete enumeration exits 2 and no complete artifact is
  published.

  Add `--require-equivalent` to return 1 after writing the artifact when a
  primary-only or secondary-only counterexample exists. Without that flag,
  disagreement is a successful research observation. Verify a stored artifact
  independently with:

    python3 util/parser_equivalence_audit.py \
      --verify parser_equivalence_artifact.json

  `symcc-parser-bounded-equivalence-v1` binds the exhaustive-domain proof,
  command digests, four acceptance quadrants, full transcript digest, elapsed
  time, and a bounded shortlex counterexample prefix. Its `equivalent` field
  means only equivalence over the declared finite byte domain.

  A parser that can expose epsilon reductions or a bounded packed parse forest
  may instead emit `symcc-parser-structural-trace-v2`. Every node then has
  `epsilon: true|false`; epsilon is true exactly for a zero-width span, and an
  epsilon node cannot have children. A node may additionally name up to eight
  alternatives as direct-child index lists:
    {"schema":"symcc-parser-structural-trace-v2",
     "parser":"glr-json-1","accepted":true,
     "nodes":[
       {"symbol":"choice","state":"value","start":0,"end":1,"parent":-1,
        "alternatives":[[1],[2]]},
       {"symbol":"empty","state":"epsilon","start":0,"end":0,"parent":0,
        "epsilon":true},
       {"symbol":"token","state":"atom","start":0,"end":1,"parent":0}]}

  Alternatives must be unique, ordered, internally non-overlapping child lists
  whose union is exactly the node's direct children. Alternative zero is the
  concrete parser-selected tree used for replacement-context localization;
  other alternatives contribute evidence but cannot hijack the selected
  ancestry. The manager canonicalizes each retained family as
  `symcc-parser-production-v2`, with epsilon included in both production and
  shape identities, and emits `symcc-parser-cfg-fragment-v3`. Primary ancestry
  productions are retained first; distinct packed alternatives fill the
  remaining deterministic 32-production budget. Instances remain capped at 32
  and the complete fragment at 64 KiB.

  A zero-width selected instance is executable evidence only when its
  production is an empty-RHS epsilon production with one empty terminal gap.
  After target replay and independent parser acceptance, semantic state schema
  v16 may learn a context/shape-restricted `epsilon` rule that deletes the
  matched source token. It is subject to the same target, parser, ECT-shape,
  Pareto scheduling, and AFL-retention gates as a nonempty subtree
  substitution. V1 traces, v2 CFG fragments, proposal states v1--v10, and
  semantic states v1--v18 remain load-compatible.

  A parser with an actual shared packed parse forest may emit
  `symcc-parser-structural-trace-v3`. V3 nodes omit `parent`; `roots` names one
  to eight node indexes, and every alternative contains forward child indexes
  only. Forward edges make the graph acyclic. Child spans must remain inside
  the parent and be ordered/non-overlapping within one alternative. All nodes
  must be reachable from a root. Root zero plus recursively chosen alternative
  zero must form the concrete selected tree: a selected node cannot have two
  primary parents. Shared nodes remain legal across non-primary alternatives.

  The complete input trace remains capped at 4096 nodes, 16384 edge
  occurrences, and 1 MiB. Extraction first reserves the selected ancestry,
  then expands a deterministic breadth-first packed closure of at most 32
  nodes and 128 edges. `symcc-parser-cfg-fragment-v4` binds
  `symcc-parser-packed-node-v1` IDs to parser/order/symbol/state/span/epsilon/
  yield hash and `packed-edge-v1` IDs to parent/child/alternative/slot.
  Every deep instance uses `symcc-parser-subtree-instance-v2`, whose identity
  includes the shared node and complete root-to-node edge path. A `truncated`
  marker distinguishes a bounded projection from a complete forest.

  Semantic state v16 introduced, and current v19 retains, an ordered local
  `child_edge_ids` binding for every packed instance's concrete production
  alternative. On restore, these
  edges must form an exact slot 0..RHS-arity-1 bijection and match the parent,
  alternative, and child symbol/state. A missing, reordered, partial, or
  cross-parent binding rejects that instance and its derived rules. V15
  migration infers the list only when the accumulated legacy edge set is
  unique and complete. This prevents a content-addressed node reused by
  multiple forests from accidentally mixing their child-edge sequences.

  Semantic ingestion independently recomputes the node, edge, production,
  shape, instance, gap, and yield identities; checks DAG order, containment,
  roots, selected path, alternative slots, and path connectivity; and rejects
  the whole fragment on mismatch. Non-primary deep instances may join an ECT
  shape class, but cannot generate until an independently accepted selected
  tree maps the source lexical context to that same shape. Semantic state
  retains at most 8192 packed nodes and 32768 edges. Node/edge eviction
  cascades through every dependent instance and rule-shape link.

  A parser that also exposes grammar-level nullability may emit
  `symcc-parser-structural-trace-v4`. It retains the v3 forward packed DAG and
  adds one to 32 rules of the form:
    {"lhs":["A","state"],"rhs":[["B","state"],["C","state"]]}
  Each RHS has at most eight `(nonterminal,state)` dependencies; an empty RHS
  is a base nullable rule. Rules are canonicalized as
  `symcc-parser-nullable-rule-v1`. The manager computes dependency SCCs and the
  least fixed point: base proofs have depth zero, and a rule proves its LHS at
  depth `1 + max(child depths)` only after every RHS symbol is proved. Ties use
  `(depth, rule ID)`, so the certificate is deterministic. A pure recursive
  SCC such as `A -> B, B -> A` has no nullable proof; adding `B -> epsilon`
  proves `B` at depth zero and `A` at depth one.

  The resulting `symcc-parser-cfg-fragment-v5` includes the canonical rules,
  cyclic SCC identities, and exact least-fixed-point proofs. Semantic
  ingestion recomputes the entire certificate before changing state, then
  unions accepted rules by parser under a 4096-rule hard bound and recomputes
  the global fixed point. Derived proofs and SCCs in a state file are never
  trusted on restore. A production shape becomes deletion-capable only when
  its own parser/LHS/state is globally proved nullable and the source lexical
  context was independently mapped to that selected shape. Thus grammar-level
  cycles do not relax the forward-DAG requirement and cannot create an
  unscoped empty mutation. Nullable source rules first appeared in proposal
  state v8 and semantic state v13. Current proposal state v11 and semantic
  state v25 retain them and recompute all derived authorization after restart
  or reference eviction.

  Shared-DAG fragments with a primary production of two to eight child slots
  can additionally induce synchronized multi-nonterminal transactions. No new
  parser assertion is trusted for this step. The semantic layer requires a
  complete alternative-zero edge sequence, one independently verified primary
  child instance per slot, and exact reconstruction of the accepted parent
  yield from its terminal gaps and child yields. It indexes each child shape's
  distinct accepted yields and searches a bounded combination space: two to
  four slots must change together, at most two canonical alternatives are
  considered per slot, at most four transactions are retained per parent
  instance, and the global hard limit is 4096.

  `symcc-parser-sync-transaction-v2` binds the parser, parent shape,
  production, and instance; every ordered slot edge; source and target
  instances; unchanged terminal gaps; the changed-slot bitmap; and the
  reconstructed yield hash. It additionally binds each inferred slot-relation
  ID and whether the proposed assignment satisfies it. Results already
  observed as accepted instances of
  the parent shape are skipped. A `synchronized` grammar rule is eligible only
  when the current source bytes exactly equal its transaction's source parent
  yield and the lexical context is certified with the same parent shape. It
  then performs one splice of the complete reconstructed parent subtree; no
  parser-invalid single-slot intermediate is emitted. The proposal carries
  `grammar_sync_transaction_id` for audit and still requires target replay,
  independent parser acceptance, and AFL novelty.

  Sync transactions and rule links are derived data. Semantic state v22 writes
  them for inspection but ignores them as authority on load, rebuilding them
  from revalidated productions, nodes, edges, and instances. Instance, edge,
  production, or grammar-rule eviction recomputes or withdraws every dependent
  transaction. Proposal state v10 persists the transaction provenance digest.

  Relation-aware scheduling is derived from those reconstructed accepted
  parents. A parent production shape needs at least two concrete observations,
  and every current observation must satisfy a relation before it is retained.
  For each ordered slot pair, the strongest matching predicate is selected in
  this order:

    1. exact byte equality;
    2. ASCII uint64 decimal equality;
    3. left decimal value equals right byte length;
    4. right decimal value equals left byte length;
    5. byte-length equality.

  Decimal operands contain 1--20 ASCII digits and must fit uint64. Relation
  IDs bind parser, parent shape, slot pair, and predicate. A newly accepted
  counterexample therefore weakens or removes a relation on the next rebuild;
  persisted relation/support fields are audit data and are not trusted.

  The per-parent product examines at most 256 combinations and globally stores
  at most 4096 relations and 4096 transactions. Up to four transactions are
  retained per parent: three highest-ranked relation-compatible candidates
  plus, when available, one relation-breaking exploration reserve. Relations
  are scheduling evidence only. They never reject a candidate, authorize a
  shape, or replace target replay, independent parser acceptance, or AFL
  novelty. Snapshot fields are `slot_relations`, `slot_relation_support`,
  `slot_relation_kinds`, `sync_relation_conforming`, and
  `sync_relation_exploration`.

  If COMMAND contains both `{trace}` and `{cache}`, the latter is replaced by
  a fresh read-only incremental-cache manifest path. The first parse is
  `mode: cold`. After a complete trace passes all ordinary checks, the manager
  stores its exact bytes and input in a content-addressed cache of at most 256
  entries. For a later proposal whose `source_path` content has a valid cached
  trace from the identical parser command, the manifest becomes
  `mode: incremental`.

  `symcc-parser-incremental-cache-v1` contains the base input/trace paths and
  SHA-256 values, a longest-common-prefix/suffix edit script, and a conservative
  invalidation frontier. Edits whose deleted plus inserted region exceeds
  `SYMCC_PROPOSAL_PATCH_BYTES` use cold mode. Nodes touching the edit or its
  16-byte guard are invalidated; at most 512 nodes fully inside the unchanged
  prefix/suffix are offered with mapped spans and yield hashes. The parser may
  use the base trace and offered nodes internally, but must still emit a full
  v1--v4 structural trace for the candidate.

  A cache-aware parser may add:
    {"incremental_cache":{
      "schema":"symcc-parser-incremental-reuse-v1",
      "manifest_sha256":"...",
      "reused_nodes":[{"base_index":1,"candidate_index":1}]}}
  The manager checks the manifest digest, unique mapping, offered base index,
  candidate symbol/state/span/epsilon, and candidate yield hash. A missing
  receipt means the parser performed a full fallback and remains valid. A
  malformed or false receipt rejects the trace. A corrupt/missing cache entry
  is deleted and automatically falls back to cold parsing. Cache reuse never
  substitutes for process exit status, target replay, full trace validation,
  parser acceptance, or AFL novelty.

  Proposal state v10 persists bounded cache metadata and per-record manifest,
  base, invalidated/reused-node, and hit counters. Trace and input contents
  remain separate content-addressed files and are rehashed lazily before every
  reuse. These counters establish functional use, not a parser speedup claim;
  wall-time improvement requires an external parser that actually consumes the
  manifest and an equal-CPU benchmark.

  Independently accepted v4/v5 CFG fragments also update an accepted-forest
  PCFG scheduler. Only the complete concrete derivation rooted at `roots[0]`
  and following alternative zero is counted. The canonical fragment SHA-256
  deduplicates observations; after 8192 retained digests, learning saturates
  instead of evicting a digest and risking double counting. Production
  families are keyed by `(parser,LHS,state)` and use symmetric
  Dirichlet/Jeffreys smoothing with alpha 0.5:
    P(shape | family) =
      (selected_count + 0.5) /
      (family_selected_count + 0.5 * known_shapes)

  Alternative ordinals are local to one parser forest and are stored on the
  concrete subtree instance. Global probability hyperedges are instead
  canonicalized by node, production, and ordered child-node IDs. Semantic
  state v15 introduced validated family counts, at most 8192 fragment
  observations, and explicit packed-root membership. Each
  `symcc-parser-packed-root-evidence-v1` identity binds the accepted fragment
  digest, parser, and root node; v15 restores roots only from revalidated
  evidence, while v14 migration labels its inferred graph frontier separately.
  Semantic state v16 retained the same evidence and added exact packed
  instance child-edge provenance. Current v19 also stores bounded conditional
  evidence described below.
  Inside masses are
  recomputed in reverse topological order and outside masses in forward order
  after every load or graph/reference eviction; derived probability tables
  are never trusted from disk.

  Posterior likelihood and an information/reachability score derived from
  count uncertainty plus outside mass are scheduling objectives only. They
  cannot reject a low-probability production, authorize an ECT mutation, or
  replace target replay, independent parser acceptance, and AFL novelty.
  Snapshot fields include `pcfg_families`, `pcfg_observations`,
  `pcfg_selected_productions`, `pcfg_inside_nodes`, `pcfg_outside_nodes`,
  `pcfg_packed_alternatives`, normalized entropy, maximum posterior, and
  observation-capacity saturation.

  Semantic state v17 introduced a hierarchical production context:
    `symcc-parser-production-context-v1` =
      (parser, child family, parent production shape, RHS slot)
  Roots use an empty parent shape and slot -1. A complete accepted concrete
  tree atomically contributes both unconditional and context selections.
  Every selected node must have a primary instance whose exact local
  `child_edge_ids` cover all RHS slots. Missing instances, duplicate primary
  ancestry, partial slots, or edge mismatch leave only an empty fragment
  deduplication record and update no counts.

  For a non-root context c, the posterior is shrunk toward the unconditional
  family posterior P0 with beta 2.0:
    P(shape | c) =
      (context_count(shape) + 2.0 * P0(shape)) /
      (context_selected_count + 2.0)
  Root contexts use P0 directly. With no context evidence, this formula
  exactly falls back to P0 and preserves nonzero mass for known unobserved
  shapes.

  Because a shared packed node can occur below different parent shapes,
  contextual inference uses `(node, context)` states rather than overwriting
  the unconditional node mass. At most 32768 states run reverse-topological
  inside and forward-topological outside propagation. Contextual alternative
  posterior/reachability joins the existing PCFG Pareto objectives but remains
  scheduling evidence only. At most 8192 observed contexts and 8192 fragment
  witnesses are retained.

  V17 and current v19 restore recompute every context identity, verify that the
  parent shape/slot can produce the named child family, and require context fragment
  digests to belong to the accepted PCFG observation set. Counts and complete
  fragment selection lists are reconciled to an atomic fixed point, so a
  tampered selection withdraws all evidence from that fragment and any
  dependent mismatched counts in one load. V16 and older states have no
  conditional evidence and use the unconditional fallback. Derived context
  inside/outside tables are never persisted. Snapshot fields are
  `pcfg_contexts`, `pcfg_context_observations`,
  `pcfg_context_selected_productions`, `pcfg_context_inside_states`,
  `pcfg_context_outside_states`, `pcfg_context_alternatives`, and
  `pcfg_context_mean_nll_bits`. The NLL field is an online training-evidence
  diagnostic, not held-out perplexity.

  Semantic state v18 adds update-before prequential calibration. Before any
  count from an accepted fragment is applied, each selected node records a
  `symcc-parser-pcfg-prequential-v1` receipt with the fragment/node/context/
  shape identity and these sufficient statistics:

    global selected count before the fragment;
    global family total before the fragment;
    number of known family shapes at prediction time;
    context selected count before the fragment;
    context total before the fragment.

  All selections in one fragment use batch-before-update semantics. The
  receipt stores no probability: restore recomputes global and context
  predictions with alpha 0.5 and beta 2.0. At most 32768 receipts are retained;
  the evidence saturates without eviction, while ordinary PCFG/context
  learning continues under its independent 8192-fragment bound.

  Per context, deterministic receipt-ID order produces prequential global and
  context NLL bits, prediction wins, and
    gain_bits = global_nll_bits - context_nll_bits.
  A context receives nonzero scheduling weight only after two observations and
  positive cumulative gain:
    weight =
      min(1, observations / 8) *
      min(1, max(0, gain_bits) / 2)
    effective_posterior =
      global_posterior +
      weight * (raw_context_posterior - global_posterior)

  Negative gain, absent receipts, or later prediction drift therefore restores
  the global posterior exactly. Context-state alternative artifacts expose
  `raw_posterior`, `posterior` (the effective value), and
  `calibration_weight`. V17 migration retains raw context counts but uses zero
  weight because training-fit evidence is not a substitute for update-before
  prediction evidence.

  V18 restore checks canonical receipt identity, unique
  `(fragment,node,context,shape)` events, context-fragment membership, matching
  family/parent/slot, bounded integer sufficient statistics, and before-counts
  strictly earlier than final revalidated counts. Invalid receipts withdraw
  calibration only; they do not alter grammar counts or authorize mutations.
  Derived calibration tables are never persisted. Snapshot fields are
  `pcfg_prequential_receipts`, `pcfg_prequential_capacity`,
  `pcfg_prequential_saturated`, `pcfg_prequential_observations`,
  `pcfg_prequential_global_nll_bits`,
  `pcfg_prequential_context_nll_bits`,
  `pcfg_prequential_context_gain_bits`,
  `pcfg_prequential_context_wins`, `pcfg_calibrated_contexts`, and
  `pcfg_mean_context_weight`.

  Semantic state v19 adds ordered recency calibration. New
  `symcc-parser-pcfg-prequential-v2` receipts bind an
  `observation_index`: the number of accepted PCFG fragment records before the
  current fragment. All selected nodes from one fragment share an index, and
  distinct fragments cannot share one. Receipt v1 remains valid migration
  evidence but has no inferred time order.

  The current window covers the latest 16 accepted fragment indexes and
  advances from the full PCFG observation stream, not merely from receipts.
  Thus empty accepted-tree evidence, an absent context, or saturated receipt
  storage still ages old calibration. Each context exposes recent global/
  context NLL, gain, wins, and selection count. Once a context has any v2
  evidence, its scheduling weight uses only recent statistics:

    fewer than 2 recent selections -> weight 0;
    recent gain <= 0              -> weight 0;
    no event in the window        -> weight 0 and stale = 1;
    otherwise                     -> the F216 gain/sample formula.

  This lets recent adverse evidence override positive lifetime gain and lets
  later positive evidence recover from historical loss. V18 v1-only contexts
  retain the cumulative F216 gate. Mixed v1/v2 state is allowed after migration;
  the first v2 evidence switches that context to recency mode.

  V19 restore additionally checks observation-index range, one index per
  fragment, one fragment per index, and the v2 canonical digest. Removing an
  index from a v2 receipt changes its schema identity and cannot silently
  downgrade it to v1. Snapshot fields are
  `pcfg_calibration_recent_fragments`, `pcfg_recency_contexts`,
  `pcfg_stale_contexts`, `pcfg_recent_observations`,
  `pcfg_recent_global_nll_bits`, `pcfg_recent_context_nll_bits`,
  `pcfg_recent_context_gain_bits`, and `pcfg_recent_context_wins`.
  The fixed window is a reproducible policy baseline, not an adaptive-window
  change detector with statistical false-alarm guarantees.

  Semantic state v20 adds a bounded adaptive calibration window over v2
  receipts. Receipts for the same context and accepted-fragment index are one
  detection unit: their log-loss gains
    d = log2(context_probability / global_probability)
  are averaged after clipping each value to [-4, 4] bits. At most the latest
  64 context-bearing fragments are replayed, and every candidate cut retains
  at least eight fragments on each side.

  For a scan with m legal cuts, the detector assigns
    adjusted_delta = 0.05 / m
  and uses the bounded two-sample Hoeffding threshold
    epsilon =
      4 * sqrt(
        2 * ln(2 / adjusted_delta) *
        (1 / left_fragments + 1 / right_fragments))
  A cut is accepted only when the absolute difference between the clipped
  left/right means exceeds epsilon. The positive-margin cut with the largest
  margin is selected, its left prefix is discarded, and detection resumes as
  later fragments arrive.

  Scheduling uses the retained suffix but not the clipped detector values.
  Global and context NLL are averaged within each accepted fragment and then
  summed across retained fragments. The F216 gain/sample formula uses this
  unmodified adaptive gain and the retained fragment count. This prevents one
  large tree from masquerading as many independent calibration samples. The
  F217 fixed-16 metrics remain available, and no context evidence in that
  recent window still forces `stale = 1` and zero weight.

  Every accepted cut emits a
  `symcc-parser-pcfg-adaptive-cut-v1` certificate containing the context,
  window and cut indexes, both sample/receipt counts, clipped means,
  difference, epsilon, margin, clip bound, delta allocation, and a digest of
  the ordered receipt IDs. `verify_pcfg_adaptive_certificate` reconstructs
  these values and the certificate ID from canonical receipts. Certificates
  are serialized only as audit output; restore ignores them and recomputes all
  adaptive state. They never authorize a grammar proposal.

  Snapshot fields are `pcfg_adaptive_max_fragments`,
  `pcfg_adaptive_min_fragments`, `pcfg_adaptive_clip_bits`,
  `pcfg_adaptive_delta`, `pcfg_adaptive_certificates`,
  `pcfg_adaptive_contexts`, `pcfg_adaptive_fragments`,
  `pcfg_adaptive_receipts`, `pcfg_adaptive_truncated_fragments`,
  `pcfg_adaptive_global_nll_bits`, `pcfg_adaptive_context_nll_bits`,
  `pcfg_adaptive_context_gain_bits`, and `pcfg_adaptive_context_wins`.
  The 0.05 bound is a per-scan union bound over candidate cuts, not an
  anytime-valid false-alarm guarantee across an unbounded execution.

  Semantic state v21 adds a bounded grandparent probabilistic-circuit expert.
  Its canonical context is
    (parser, child family,
     parent production shape and RHS slot,
     grandparent production shape and RHS slot).
  Only complete accepted alternative-zero trees contribute evidence. At most
  8192 circuit contexts and 32768 circuit receipts are stored.

  The raw circuit posterior is hierarchical:
    parent_raw =
      (parent_selected + 2 * global) / (parent_total + 2)
    circuit_raw =
      (circuit_selected + 2 * parent_raw) / (circuit_total + 2)
  so an unseen circuit context is exactly the parent distribution. Before
  applying one fragment's counts,
  `symcc-parser-pcfg-circuit-prequential-v1` records all three selected/total
  sufficient-stat layers, the known-shape count, the two-level context path,
  and the accepted-fragment index.

  Circuit calibration compares the finer expert with both coarser models:
    robust_gain =
      min(global_nll - circuit_nll,
          parent_nll - circuit_nll)
  The circuit receives positive weight only when this robust gain is positive
  with sufficient retained evidence. Receipts from one fragment are one
  adaptive sample; the same 64-fragment, minimum-8+8 bounded detector is
  applied to clipped robust gain. Cuts use
  `symcc-parser-pcfg-circuit-cut-v1` and can be checked with
  `verify_pcfg_circuit_certificate`.

  A packed context-state v2 carries the immediate parent context and optional
  circuit context. The alternative mass is still
    posterior * product(child inside mass)
  and alternatives still sum within a state. When the circuit gate is active:
    final_posterior =
      (1 - circuit_weight) * parent_effective_posterior +
      circuit_weight * circuit_raw_posterior
  This convex mixture remains normalized. Zero, negative, stale, absent, or
  legacy evidence recovers `parent_effective_posterior` exactly.

  V21 restore validates both production/RHS levels, reconciles circuit counts
  against complete fragment witnesses, checks circuit receipts against final
  global/parent/circuit counts and the shared fragment-index bijection, and
  recomputes every weight, certificate, and packed mass. Persisted
  `pcfg_circuit_certificates` are audit output only. V20 and older states do
  not synthesize circuit evidence.

  Snapshot fields are `pcfg_circuit_contexts`,
  `pcfg_circuit_observations`, `pcfg_circuit_selected_productions`,
  `pcfg_circuit_mean_nll_bits`, `pcfg_circuit_receipts`,
  `pcfg_circuit_receipt_capacity`, `pcfg_circuit_receipts_saturated`,
  `pcfg_circuit_calibrated_contexts`, `pcfg_circuit_mean_weight`,
  `pcfg_circuit_stale_contexts`,
  `pcfg_circuit_adaptive_certificates`,
  `pcfg_circuit_adaptive_fragments`,
  `pcfg_circuit_adaptive_truncated_fragments`,
  `pcfg_circuit_adaptive_global_nll_bits`,
  `pcfg_circuit_adaptive_parent_nll_bits`,
  `pcfg_circuit_adaptive_nll_bits`, and
  `pcfg_circuit_adaptive_robust_gain_bits`.

  Semantic state v22 adds a bounded ordered-sibling autoregressive factor.
  For every non-first child in a complete accepted alternative-zero parent,
  its canonical context is
    (parser, child family, parent production shape, current RHS slot,
     immediately preceding child's selected production shape).
  At most 8192 sibling contexts and 32768 sibling receipts are retained.

  The sibling raw posterior uses the finest available ancestor raw posterior
  as its beta-2 prior:
    sibling_raw =
      (sibling_selected + 2 * ancestor_raw) / (sibling_total + 2)
  where `ancestor_raw` is circuit raw when a grandparent context exists and
  parent raw otherwise. Before any count from the accepted fragment is
  applied, `symcc-parser-pcfg-sibling-prequential-v1` records global, parent,
  optional circuit, and sibling sufficient statistics plus the shared
  fragment index.

  Calibration requires the sibling expert to beat every coarser baseline:
    robust_gain =
      min(global_nll - sibling_nll,
          parent_nll - sibling_nll,
          circuit_nll - sibling_nll)
  Without a circuit context, `circuit_nll` equals `parent_nll`. The retained
  fragment count and robust gain determine `sibling_weight`; stale, absent,
  non-positive, or insufficient evidence yields zero. The same bounded
  per-fragment adaptive detector emits
  `symcc-parser-pcfg-sibling-cut-v1`, independently verifiable with
  `verify_pcfg_sibling_certificate`.

  Packed context-state v3 includes the optional sibling context. Within one
  parent alternative, child inside masses are combined by a left-to-right
  shape-indexed forward message, not an independence product. Artifact-level
  outside coefficients use the matching forward prefix and backward suffix,
  so right-sibling dependencies remain distinct on a shared packed DAG.
  `child_factor_steps` records each previous/selected shape and referenced
  child state/artifact for audit. The final child posterior is
    final_posterior =
      (1 - sibling_weight) * ancestor_effective_posterior +
      sibling_weight * sibling_raw_posterior
  and remains normalized.

  V22 restore validates the parent current/left RHS path, reconciles sibling
  counts with complete fragment witnesses, checks receipts against final
  global/parent/optional-circuit/sibling counts and all shared fragment-index
  bijections, then recomputes weights, certificates and messages. Persisted
  sibling certificates are audit output only. V21 and older states do not
  synthesize sibling evidence.

  Snapshot fields are `pcfg_sibling_contexts`,
  `pcfg_sibling_observations`, `pcfg_sibling_selected_productions`,
  `pcfg_sibling_mean_prequential_nll_bits`, `pcfg_sibling_receipts`,
  `pcfg_sibling_receipt_capacity`, `pcfg_sibling_receipts_saturated`,
  `pcfg_sibling_calibrated_contexts`, `pcfg_sibling_mean_weight`,
  `pcfg_sibling_stale_contexts`,
  `pcfg_sibling_adaptive_certificates`,
  `pcfg_sibling_adaptive_fragments`,
  `pcfg_sibling_adaptive_truncated_fragments`,
  `pcfg_sibling_adaptive_global_nll_bits`,
  `pcfg_sibling_adaptive_parent_nll_bits`,
  `pcfg_sibling_adaptive_circuit_nll_bits`,
  `pcfg_sibling_adaptive_nll_bits`,
  `pcfg_sibling_adaptive_robust_gain_bits`,
  `pcfg_sibling_factor_steps`, and
  `pcfg_sibling_factor_transitions`.

  Semantic state v23 adds a separate anytime-valid audit tier for the parent,
  grandparent-circuit, and ordered-sibling prequential gain streams. It does
  not replace the responsive v20 per-scan cut used by the scheduling gate.
  Each fragment-level gain is clipped to [-4, 4] bits and normalized to
  x = (gain + 4) / 8 in [0, 1].

  A forward confidence sequence is launched at each context-local fragment
  ordinal j. Its launch budget and the budget for its kth look are
    alpha_j = 0.05 * 6 / (pi^2 * j^2)
    alpha_jk = alpha_j * 6 / (pi^2 * k^2)
  The kth two-sided Hoeffding interval has radius
    sqrt(ln(2 / alpha_jk) / (2 * k))
  and the confidence sequence is the running intersection of these intervals.
  At most the latest 64 launches are active. A certificate is emitted only
  when two sequences launched at least eight fragments apart, each with at
  least eight observations, have disjoint running intervals.

  Under the explicit context-wise null that normalized gains are bounded and
  have one constant conditional mean,
    E[x_t | F_(t-1)] = mu,
  the double inverse-square allocation satisfies
    sum_j sum_k alpha_jk <= 0.05.
  Hence the probability of any certified false alarm over arbitrarily many
  scans is at most 0.05 for that context. This is not a simultaneous guarantee
  over every learned context, and nonstationary/adversarial conditional means
  are outside the null. The finite 64-launch implementation only removes
  rejection opportunities, so it does not weaken that bound.

  The certificate schemas are
  `symcc-parser-pcfg-anytime-cut-v1`,
  `symcc-parser-pcfg-circuit-anytime-cut-v1`, and
  `symcc-parser-pcfg-sibling-anytime-cut-v1`. They bind the guarantee and null
  names, both spending rules, launch ordinals and observation indexes, sample
  means, running intervals, tightening ages, final radii, separation gap,
  clipping range, and the ordered receipt digest. Verification reconstructs
  the complete artifact from canonical update-before receipts. Serialized
  certificates remain derived audit output; v23 restore ignores them and
  recomputes them. V22 input is accepted and gains the new audit tier only
  from receipts that pass the existing fixed-point validation.

  Snapshot fields are `pcfg_anytime_construction`,
  `pcfg_anytime_guarantee`, `pcfg_anytime_spending_scale`,
  `pcfg_anytime_certificates`, `pcfg_anytime_certified_contexts`,
  `pcfg_circuit_anytime_certificates`,
  `pcfg_circuit_anytime_certified_contexts`,
  `pcfg_sibling_anytime_certificates`, and
  `pcfg_sibling_anytime_certified_contexts`.

  Semantic state v24 adds a bounded second-order sibling-history factor for
  children at RHS slot two or later. Its canonical context is
    (parser, child family, parent production shape, current RHS slot,
     selected shape at slot - 2, selected shape at slot - 1).
  This models a non-adjacent dependency after controlling the immediately
  preceding sibling. The history table is capped at 8192 contexts and 32768
  update-before receipts.

  The raw history posterior is a beta-2 shrinkage estimator whose prior is the
  immediate-sibling raw posterior:
    history_raw =
      (history_selected + 2 * sibling_raw) / (history_total + 2)
  and the effective distribution is the normalized convex mixture
    final_posterior =
      (1 - history_weight) * sibling_effective_posterior +
      history_weight * history_raw_posterior.
  Missing, stale, adverse, insufficient, saturated, or legacy history evidence
  therefore recovers the v22 sibling model exactly.

  `symcc-parser-pcfg-history-prequential-v1` records all five update-before
  sufficient-stat layers. Calibration uses
    robust_gain =
      min(global_nll - history_nll,
          parent_nll - history_nll,
          circuit_nll - history_nll,
          sibling_nll - history_nll),
  so the second-order factor must improve on every available coarser expert.
  Responsive cuts use `symcc-parser-pcfg-history-cut-v1`; the independent
  F223 audit uses `symcc-parser-pcfg-history-anytime-cut-v1`. Both public
  verifiers reconstruct probabilities, fragment aggregation, evidence
  digests, thresholds or confidence sequences, and IDs from canonical
  receipts.

  Packed context-state v4 retains the last two selected child shapes.
  Forward messages transition over bounded tuple histories and suffix messages
  propagate exact artifact-level outside coefficients for this order-two
  chain. `previous_sibling_shape_ids` and `next_sibling_shape_ids` expose the
  tuple transition while the legacy singular previous-shape field remains
  available. This is exact for the bounded second-order factor represented in
  the packed forest; it is not an arbitrary-order, bidirectional, cross-parent,
  symbol-table, checksum, or query-conditioned probabilistic circuit.

  V24 restore recomputes context IDs, validates both preceding RHS production
  shapes, reconciles count/fragment witnesses to a fixed point, checks all five
  count layers and shared fragment-index bijections, and rebuilds calibration,
  certificates, and factor messages. Stored derived artifacts are never
  trusted. V23 and older states cannot synthesize history evidence.

  Snapshot fields are `pcfg_history_contexts`,
  `pcfg_history_observations`, `pcfg_history_selected_productions`,
  `pcfg_history_receipts`, `pcfg_history_receipt_capacity`,
  `pcfg_history_receipts_saturated`,
  `pcfg_history_calibrated_contexts`, `pcfg_history_mean_weight`,
  `pcfg_history_stale_contexts`,
  `pcfg_history_adaptive_certificates`,
  `pcfg_history_anytime_certificates`,
  `pcfg_history_anytime_certified_contexts`, and
  `pcfg_history_factor_states`.

  Semantic state v25 adds an append-only online allocation ledger and a
  separate cross-context FWER audit. It does not change the v20 responsive
  scheduling cuts or the v23 context-wise certificates. When a parent,
  grandparent circuit, immediate-sibling, or second-order history context is
  first registered, it receives the next global ordinal c and
    context_delta_c =
      0.05 * 6 / (pi^2 * c^2).
  Ordinals and spent alpha are never recycled after a context becomes inactive.
  The ledger is capped at 32768 entries; saturation disables global
  certification for later contexts instead of reusing old budget.
  The registration observation itself is excluded from the global test stream,
  so the outer allocation is fixed before any observation used by that test.

  Inside context c, the v23 repeated-forward construction spends
    launch_alpha_cj =
      context_delta_c * 6 / (pi^2 * j^2)
    look_alpha_cjk =
      launch_alpha_cj * 6 / (pi^2 * k^2).
  Therefore the sum over every registered context, launch, and look is at most
  0.05. Under the stated null for each true-null context that normalized gains
  are bounded and have a constant conditional mean, the union bound controls
  the probability of one or more false certified changes across all four
  context kinds and arbitrary stopping times. No independence between context
  streams is assumed.

  Global certificates use
  `symcc-parser-pcfg-global-anytime-cut-v1`. In addition to the v23 confidence
  sequence evidence they bind the context kind, allocation ID and ordinal,
  context/global alpha, outer spending rule, append-only contract, and the
  digest of the allocation-ledger prefix through that ordinal.
  `registration_observation_excluded=true` records the predictability guard.
  `verify_pcfg_global_anytime_certificate` reconstructs the allocation prefix,
  model-specific robust-gain units, all three spending levels, confidence
  intervals, and certificate ID.

  V25 restore validates a contiguous ordinal sequence, canonical allocation
  IDs, first-observation indexes, exact alpha values, uniqueness, and the
  presence and first index of every context with retained receipts. A missing,
  reordered, altered, or incomplete v25 ledger disables the entire global
  audit tier; it does not discard grammar evidence or weaken ordinary
  scheduling fallback. V24 and older states deterministically construct an
  initial ledger from fully validated ordered receipts. Persisted global
  certificates are derived output and are ignored on restore.

  Snapshot fields are `pcfg_anytime_global_guarantee`,
  `pcfg_anytime_global_delta`, `pcfg_anytime_context_allocations`,
  `pcfg_anytime_context_allocation_capacity`,
  `pcfg_anytime_context_allocations_saturated`,
  `pcfg_anytime_allocation_ledger_valid`,
  `pcfg_anytime_allocated_delta`,
  `pcfg_global_anytime_certificates`, and
  `pcfg_global_anytime_certified_contexts`.

- SYMCC_PCFG_CONTEXT_ORDER=global|parent|circuit|sibling|history|0..4
  (default history/4): Select the finest enabled probabilistic grammar
  context for a controlled ablation. The levels are nested:
    0 global production family,
    1 parent production/slot,
    2 grandparent circuit,
    3 immediate ordered sibling,
    4 second-order sibling history.
  Disabled levels do not collect their contexts, update-before receipts,
  calibration state, responsive/anytime certificates, or packed factor
  states. Sibling frontiers retain one selected shape at level 3 and two at
  level 4. Level 0 skips contextual inside/outside completely. This is
  therefore a mechanism-and-cost ablation, not a scalar-score switch. An
  invalid value is reported by the MPI master and falls back to history.
  The selected order and level are included in semantic mappings and grammar
  snapshots; the semantic evidence schema remains v25. Restoring a state
  written at another order fail-closes by clearing all PCFG counts, receipts,
  certificates, allocations and derived masses before rebuilding neutral
  forest structure; `pcfg_state_order_mismatch_reset=1` records this event.
  Validated CFG/ECT grammar structure is retained.

- SYMCC_PCFG_RESEARCH_ARTIFACT=PATH (default
  `$SYMCC_RESEARCH_RUN_DIR/pcfg_research_artifact.json` when a sealed research
  run is active): Atomically write `symcc-pcfg-research-artifact-v1`. The
  artifact binds semantic schema, selected context order, protocol
  experiment/run/pair/configuration, seed and CPU budget to the complete
  scalar grammar snapshot and a canonical SHA-256. Metrics include
  prequential/adaptive NLL, robust gain, calibrated/fallback state,
  certificate count/detection delay, allocated alpha, ledger saturation,
  context/receipt/state/transition counts, and grammar yield.
  `benchmark/research_protocol.py` verifies the semantic digest and protocol
  binding in addition to hashing the complete run artifact tree.

- SYMCC_PCFG_REQUIRE_ARTIFACT=0|1 (normally set automatically by
  `pcfg_context_ablation`): A successful sealed PCFG ablation without a valid
  final artifact is recorded as failed. Timeout and other failed runs remain
  retained as failures rather than being discarded.

- SYMCC_PROPOSAL_PARSER_TIMEOUT=SECONDS (default 1.0, range 0.01--60):
  Wall-clock limit for one parser oracle invocation. Grammar proposals carry a
  stable context ID derived from branch, input-size bucket, and bounded
  left/right token neighborhoods. When a structural trace is available,
  semantic state schema v25 persists `(rule, lexical context) -> structural
  context/production` aliases and lexical-context-to-production-shape
  correspondence.
  Two parser rejections suppress that rule only in the selected structural
  context; parser acceptance clears the local suppression. Rule-level parser
  counts, aliases, and at most 256 rejected contexts per rule persist. When a
  verified proposal survives AFL novelty triage, its feature delta is also
  accumulated for that rule/structural-context pair. Candidate ordering adds a
  bounded inverse-square-root bonus to unseen or low-coverage pairs; retention
  feedback without an unused verified observation is rejected.

  Parser validation also updates a separate logical 64K grammar-coverage
  count bitmap keyed by `(rule, structural path, production)`. It is stored
  sparsely with saturating 8-bit counters, stable owner digests, event counts,
  and collision telemetry. This bitmap does not consume AFL edge/data coverage
  and therefore measures parser-production exercise independently. Its
  diminishing novelty bonus is combined with, but does not replace, target
  validity, parser acceptance, or AFL-retained feature yield.

  Parser-accepted v2 fragments also populate a bounded incremental ECT
  correspondence graph. Shape IDs retain parser, LHS/state, and ordered RHS
  labels while deliberately excluding concrete terminal bytes; instance IDs
  bind a shape to a production, concrete subtree yield, terminal gaps, and
  full selected ancestry. The semantic layer recomputes every hash before
  learning. Concrete yields from the same shape become `subtree` grammar
  alternatives, but are proposed only for lexical contexts previously
  certified with that shape. Candidate-local contexts are recorded after
  replacement so retained outputs can continue the correspondence chain.
  The graph is capped at 4096 shapes and 8192 instances, uses reference-safe
  cascading eviction, and is restored only after all production/yield/path
  invariants pass. This is bounded observed-subtree substitution, not complete
  parser grammar inference or a claim that two different parser
  implementations use equivalent nonterminals.

- SYMCC_PROPOSAL_MAX_BYTES=N (default 16777216) and
  SYMCC_PROPOSAL_PATCH_BYTES=N (default 65536): Bound the materialized candidate
  and total data introduced by transformations.

- SYMCC_SEMANTIC_FALLBACK=0/1 (default 1 when the adaptive scheduler is
  enabled): Enable a local semantic-constraint fallback planner in the MPI
  master. The planner summarizes telemetry into branch classes such as
  byte-local, token-progress, wide/nonlinear, timeout-prone, and opaque. It then
  emits the same validated hints as the agentic hook: S2F actionseed rows,
  strategy selection, target_branch for targeted work, and compact focus ranges.
  This gives the executor portfolio a deterministic fallback policy before
  spending expensive exact Z3 effort on solver-hostile branches.

- SYMCC_SEMANTIC_ACTIONS=N (default 8), SYMCC_SEMANTIC_EXACT_BYTES=N (default
  16), and SYMCC_SEMANTIC_FOCUS_SPAN=N (default 128): Bound the number of
  semantic actionseed rows per dispatch, the taint span considered byte-local
  enough for exact solving, and the maximum focus range emitted by the semantic
  planner. State is persisted in
  "$AFL_OUT/<symcc-name>/.semantic_fallback.json".

- SYMCC_SMT_ALGORITHM_SCHEDULER=0/1 (default 1 when adaptive scheduling is
  enabled): Enable SMTgazer-style clustered Bayesian scheduling over bounded
  solver-algorithm sequences. The default space includes exact Z3,
  fast-then-exact, optimistic-layered, and polyhedral-then-exact sequences. Each
  dispatch records SYMCC_ALGORITHM_SEQUENCE, SYMCC_ALGORITHM_TOKEN, and
  SYMCC_ALGORITHM_PROPENSITY so benchmark trajectories can be evaluated
  off-policy.

- SYMCC_SMT_ALGORITHM_SPACE=<json-or-path>: Override the default algorithm
  sequence space. The JSON format is {"sequences":[{"name":"...",
  "stages":[{"name":"...","overrides":{"ENV":"VALUE"}}]}]}. Overrides are
  sanitized with the same allowlist as the self-configuring parameter portfolio.

- SYMCC_SMT_ALGORITHM_PRIOR=<path>: Load an offline
  `symcc-smt-sequence-policy-v1` artifact produced by
  `util/smt_sequence_training.py`, or a
  `symcc-smt-sequence-ensemble-policy-v1` artifact produced by
  `util/smt_sequence_optimizer.py`. The loader verifies the canonical SHA-256,
  feature/objective/training schemas, all bounded X-means split BIC values,
  final cluster geometry, IPS effective sample sizes, censored PAR-2 moments,
  empirical-Bayes shrinkage, confidence lower bounds, support decisions, and
  recommendations. An invalid artifact or an action absent from the current
  algorithm space is ignored. A valid recommendation is not forced: it uses the
  existing 90% preference / 10% exploration path, and an explicit recommendation
  from the online conservative policy takes precedence. Multi-stage sequences
  already active for a seed are not interrupted. Assignments export
  `SYMCC_ALGORITHM_PRIOR_SHA256`, `SYMCC_ALGORITHM_PRIOR_CLUSTER`, and
  `SYMCC_ALGORITHM_PRIOR_SEQUENCE`; scheduler state records recommendation and
  match counts. An F240 ensemble artifact can recommend multiple actions with
  integer-second stage budgets. Matching assignments additionally export
  `SYMCC_ALGORITHM_PRIOR_SCHEDULE_INDEX`,
  `SYMCC_ALGORITHM_PRIOR_SCHEDULE_LENGTH`, and
  `SYMCC_ALGORITHM_BUDGET_SEC`. The worker clamps the budget to
  `[1, SYMCC_TIMEOUT]` before resolving the executor's real process timeout.

- SYMCC_OFFLINE_POLICY=0/1 (default 1 when the SMT algorithm scheduler is
  enabled) and SYMCC_OFFLINE_TRAJECTORY=<path>: Record interference-aware
  trajectory events for each completed solver-sequence assignment. Rewards
  include coverage gain, timeout/cost, duplicate generated cases, and current
  worker concurrency. The online coordinator only promotes a sequence prior when
  conservative SNIPS/doubly-robust estimates have enough effective samples and a
  lower-bound improvement over the behavior policy. Offline reports can be
  reproduced with:

      python3 util/offline_policy.py "$AFL_OUT/<symcc-name>/.offline_trajectory.jsonl"

  F239 context-specific training uses the same trajectory:

      python3 util/smt_sequence_training.py \
        "$AFL_OUT/<symcc-name>/.offline_trajectory.jsonl" \
        --output "$AFL_OUT/<symcc-name>/.smt_sequence_policy.json" \
        --timeout-sec 30 --max-clusters 8 --min-cluster-size 8

      python3 util/smt_sequence_training.py \
        --verify "$AFL_OUT/<symcc-name>/.smt_sequence_policy.json"

  Train on a completed tuning campaign, then set
  `SYMCC_SMT_ALGORITHM_PRIOR` for a separate holdout/confirmatory campaign.
  Do not train and evaluate on the same run when reporting performance.
  `timed_out` or killed events are right-censored and charged PAR-2 `2T`;
  older trajectory rows without explicit `timed_out` remain loadable but have
  weaker censoring provenance. Training bounds are configurable with
  `--max-events`, `--max-clusters`, `--min-cluster-size`,
  `--max-iterations`, `--bic-margin`, `--cost-weight`,
  `--min-propensity`, `--max-weight`, `--prior-strength`,
  `--confidence-z`, `--min-samples`, `--min-effective-samples`, and
  `--min-improvement`.

  F243 changes the default context contract from
  `symcc-smt-context-features-v1` (9 dimensions) to
  `symcc-smt-context-features-v2` (16 dimensions). The original ordered prefix
  remains bias, log input size, difficulty, timeout ratio, unknown ratio,
  dependency ratio, data uncertainty, branch pressure, and targeted. The
  appended dimensions are mean Query IR nodes/query, mean distinct input
  bytes/query, maximum bit width, and comparison/nonlinear/bitwise/structural
  operator ratios. Sizes use bounded logarithmic transforms and operator
  counts are divided by total Query IR nodes.

  QSYM telemetry reports the raw sufficient statistics as `query_exports`,
  `query_ir_nodes`, `query_ir_input_bytes`, `query_ir_max_bits`,
  `query_ir_comparison_ops`, `query_ir_nonlinear_ops`,
  `query_ir_bitwise_ops`, and `query_ir_structural_ops`. They are zero when no
  Query IR was successfully exported, including campaigns without
  `SYMCC_QUERY_SPOOL`. Offline trajectories preserve the raw counts so future
  feature schemas can be recomputed without rerunning the target.

  Existing v1 F239, F240, and F241 artifacts remain loadable without changing
  their digest: the verifier derives geometry and tree dimension from the
  exact sealed feature contract, and the scheduler projects a v2 context to
  its first nine dimensions. Existing nine-dimensional scheduler moment state
  is zero-extended on load. Unknown dimensions, reordered feature names, or
  malformed vectors are rejected rather than guessed.

  F240 bagged/boosted budgeted sequence training:

      python3 util/smt_sequence_optimizer.py \
        "$AFL_OUT/<symcc-name>/.offline_trajectory.jsonl" \
        --output "$AFL_OUT/<symcc-name>/.smt_sequence_ensemble.json" \
        --timeout-sec 30 --max-clusters 8 --min-model-samples 8 \
        --bag-estimators 7 --boost-rounds 5 --tree-depth 3 \
        --max-schedule-length 3 --slice-fractions 0.25,0.5,1

      python3 util/smt_sequence_optimizer.py \
        --verify "$AFL_OUT/<symcc-name>/.smt_sequence_ensemble.json"

  The optimizer learns completion, censored PAR-2 ratio, and adjusted reward
  with bounded inverse-propensity-weighted shallow CART bagging plus residual
  boosting. A bounded beam search evaluates global and per-X-means-cluster
  schedules under a shared timeout. `--uncertainty-z` controls completion/reward
  lower bounds and cost upper bounds; `--min-schedule-improvement` prevents a
  multi-action schedule from replacing the best single action without a
  conservative predicted improvement. Other bounds are `--min-leaf`,
  `--max-thresholds`, `--learning-rate`, `--beam-width`, `--reward-weight`,
  `--min-propensity`, `--max-weight`, and `--seed`.

  New trajectories record `instance_id` (input content SHA-256 when available),
  `solved`, and `budget_sec`. A censored stage is charged `2*budget_sec`, not
  `2*SYMCC_TIMEOUT`; old rows without the field use the global timeout.
  Executor-specific `timeout_scale` still applies after the schedule budget, so
  hold it fixed and record it in comparative experiment manifests.

- SYMCC_SEMANTIC_PROPOSALS=0/1 (default 1 when adaptive scheduling is enabled)
  and SYMCC_SEMANTIC_TOKEN_DIR=<dir>: Enable built-in semantic candidate
  generation before the verified-proposal funnel. The generator extracts bounded
  comparison cores, proposes inverse candidates, transfers data-coverage token
  exemplars, ranks IFSS-like relevance slices for Hydra-style targeted
  core-copy/swap/boundary/truncate transformations, performs bounded
  token-grammar `solve_complete` completion from AFL extras/string tokens and
  observed comparison-core fragments, and mutates UCSan alias/heap partitions.
  Every candidate still goes through target replay and global AFL bitmap triage
  before retention.

- SYMCC_GRAMMAR_RULES=N (default 2048, minimum 32, hard maximum 8192):
  Bound persistent online token-grammar productions. Rules are inferred from
  comparison-taint lexical spans plus configured token/string fragments and
  include literal, delimited, key-value, segment, choice, sequence, optional,
  repetition, and parser-induced bounded recursive forms. A recursive rule
  represents one validated `prefix + Nonterminal + suffix` expansion and
  applies at most one layer per proposal; low-yield, unretained rules are
  evicted first.

- SYMCC_GRAMMAR_MAX_SPAN=N (default 128, minimum 8, maximum 1024): Maximum
  number of bytes to which a comparison-taint core may expand while locating
  lexical token boundaries. Closed quote/bracket cores take precedence over
  outward expansion.

- SYMCC_GRAMMAR_DERIVATION_DEPTH=N (default 3, range 1--8): Maximum number of
  times one parser-accepted recursive CFG template may be composed around the
  current token in a single proposal. Each intermediate derivation is emitted
  separately and checked against `SYMCC_PROPOSAL_MAX_BYTES`; epsilon cycles are
  never learned. The state retains canonical productions, mutual/direct cycle
  paths, multi-slot provenance, and a one-to-many rule-to-cycle relation.

- SYMCC_GRAMMAR_PARETO=0/1 (default 1): Rank grammar and subtree rules with an
  explicit multi-objective frontier instead of the legacy scalar weighted
  score. The maximized objectives are target validation yield, AFL edge-feature
  yield, dynamic data-comparison progress, independently verified String-model
  yield, parser-production novelty, ECT subtree novelty, accepted-production
  posterior likelihood, packed-forest information/reachability, and scheduling
  age. Missing data/String or PCFG observations use a neutral Bayesian prior
  rather than being interpreted as success.

  For bounded cost, each context first forms a 256-rule archive by round-robin
  preservation of every objective's extremes. It then computes exact
  non-dominated fronts within that archive and uses normalized crowding
  distance to retain diverse trade-offs. The age objective and persisted
  `last_attempt_observation` prevent a valid but temporarily dominated rule
  from being permanently starved. Set this option to 0 for the F202/F203
  scalar-score ablation. Semantic state schema v25 persists Pareto counters,
  per-rule data/String observations, fairness state, and PCFG count evidence;
  it remains compatible with v1--v24.

- SYMCC_PARETO_CORPUS=0/1 (default 1): Maintain a bounded multi-objective
  metadata archive for seeds observed by the adaptive scheduler. Admission and
  replacement use six maximized objectives: owned AFL edge-feature gain,
  dynamic/static data-progress gain, concrete-verified String-model yield,
  structural-site diversity, path-hash ownership, and reward/cost efficiency.
  An existing entry that dominates a new seed rejects its metadata admission;
  a new entry that dominates existing entries replaces them.

  This archive never removes or rewrites AFL queue files. It controls only
  SymCC replay/scheduling metadata and contributes a bounded scheduling bonus,
  so AFL's authoritative coverage ownership and crash retention remain intact.
  On capacity overflow, an epsilon grid protects one extreme for every
  objective and evicts a low-utility entry from the densest remaining cell.

- SYMCC_PARETO_CORPUS_ENTRIES=N (default 4096, range 8--65536):
  Maximum number of seed metadata entries in the Pareto archive.

- SYMCC_PARETO_CORPUS_BINS=N (default 8, range 2--32):
  Number of epsilon-grid bins per objective for bounded density replacement.
  Adaptive scheduler state schema v12 persists all entries, counters, objective
  evidence, and eviction telemetry while accepting v1--v11 state.

  Grammar completion uses splice rather than fixed-width overwrite, so it can
  create shorter or longer inputs within `SYMCC_PROPOSAL_MAX_BYTES`. Proposal
  manifests bind a stable `grammar_rule_id`; concrete target validation updates
  rule validity and authoritative AFL retention updates rule/coverage yield.
  The generator state records attempted, validated, verified and retained rule
  coverage. None of these statistics bypass target replay or bitmap triage.

- SYMCC_QUERY_GRAMMAR_HOLES=0/1 (default 1 when both semantic proposals and
  the async QueryStore are enabled): Join a solver-materialized Query IR model
  with online grammar completion. QueryStore candidate manifests carry the
  exact Query IR input-byte read set and actual model-assignment offsets.
  Grammar spans that overlap queried bytes are rejected; every completed
  candidate is then re-evaluated against the stored Query IR before entering
  the proposal manager. Hidden `.NAME.query.json` sidecars are metadata and are
  excluded from the query-candidate work queue.

- SYMCC_QUERY_GRAMMAR_HOLE_MAX=N (default 16, range 0--64): Maximum verified
  Query-IR/grammar hole proposals considered per semantic observation before
  the global proposal limit. Zero is an ablation. `symcc-query-grammar-hole-v1`
  certificates bind query ID, source candidate/manifest digests, exact queried
  offsets, hole interval and grammar rule ID. The certificate records only the
  Query IR gate; concrete target replay and authoritative AFL retention remain
  mandatory independent gates.

- SYMCC_HISTORY_ACQUISITION_PLATEAU=N (default 64, range 1--65536):
  Consecutive semantic observations with zero global coverage delta required
  before retained-seed acquisition is enabled. Any positive coverage delta
  resets the counter. This keeps history crossover off the hot path while
  ordinary execution is still productive.

- SYMCC_HISTORY_ACQUISITION_SEEDS=N (default 128, range 1--4096) and
  SYMCC_HISTORY_ACQUISITION_BYTES=N (default 4096, range 64--65536): Bound the
  persistent bank of inputs that previously survived authoritative AFL novelty
  triage and the bytes retained from each input. During a plateau, lexical
  tokens from high-yield/underexplored retained seeds may replace current
  comparison spans as `history_acquisition` proposals. Seed ID, attempts,
  target validations, subsequent retentions and coverage yield are persisted.
  Every acquired candidate remains untrusted until concrete target replay and
  AFL novelty validation; retained history never authorizes solver or parser
  claims.

- SYMCC_QUERY_SPOOL=PATH (default unset): Export each interesting branch query
  as an immutable `symcc-query-ir-v1` envelope below `PATH/incoming`. The
  envelope contains a versioned expression DAG, prefix and target roots,
  concrete witness, metadata, and full/split SMT-LIB artifacts. Export uses a
  temporary file plus atomic rename. Without this variable, query export is
  disabled.

- SYMCC_QUERY_DEFER=0/1 (default 0): When query export succeeds, skip the
  corresponding inline Z3 solve and leave it to the asynchronous query service.
  An export failure always falls back to the inline solver. Enable this only
  when `symcc_query_service.py` is running; leaving it at 0 permits shadow-mode
  comparison between inline and asynchronous solving.

- SYMCC_QUERY_OUTPUT_DIR=PATH (default `SYMCC_OUTPUT_DIR`): Directory into which
  SAT assignments from asynchronous queries are materialized as concrete input
  candidates. In the MPI integration these candidates re-enter the normal
  feedback queue and are retained only after authoritative AFL bitmap triage.

- SYMCC_QUERY_MAX_NODES=N (default 65536, maximum 250000): Maximum number of
  expression DAG nodes exported for one query. Queries exceeding the limit
  retain the inline fallback.

- SYMCC_ASYNC_QUERY_WORKERS=N (default 0): Start N persistent query-solver
  workers in the MPI master. This also configures a shared spool, query store,
  and candidate directory for SymCC workers. Set `SYMCC_QUERY_DEFER=1` for full
  tracer/solver separation. The semantic grammar-hole generator receives the
  shared QueryStore only after this service process starts successfully and
  only when `SYMCC_QUERY_GRAMMAR_HOLES=1`. Zero workers or a failed service
  launch fail closed to ordinary grammar generation with no QueryStore-backed
  holes; parser replay, target validation and AFL novelty remain mandatory.

- SYMCC_QUERY_STORE=PATH (default
  `$AFL_OUT/<symcc-name>/.query_store`): SQLite/WAL index and immutable
  content-addressed artifacts used by the asynchronous query service.

- SYMCC_QUERY_SOLVER=COMMAND (default auto-discovered
  `symcc-query-solver`): Solver helper command. Each service worker starts one
  long-running `--server` process.

- SYMCC_QUERY_SOLVER_PORTFOLIO=<json-or-path> (default empty): Configure a
  bounded exact-solver portfolio for `symcc_query_service.py`. The JSON format
  accepts two backend kinds:

    {"solvers":[
      {"kind":"symcc-json","name":"z3",
       "command":["symcc-query-solver"],"persistent":true},
      {"kind":"smtlib-qfbv","name":"cvc5",
       "command":["cvc5","--lang","smt2","--produce-models",
                  "--tlimit-per={timeout_ms}","{query}"],
       "capabilities":{"logic":"QF_BV","max_bits":4096,
                       "max_nodes":250000,"max_input_bytes":4096,
                       "accept_unsat":true}}
    ]}

  `symcc-json` is the existing helper JSON protocol; persistent entries use
  `--server`, while non-persistent entries receive `QUERY TIMEOUT_MS`.
  A non-persistent `smtlib-qfbv` entry lowers the content-addressed Query IR
  itself instead of replaying Z3's printed SMT text. `{query}` and
  `{timeout_ms}` placeholders may appear inside argv entries. If `{query}` is
  absent, the temporary SMT-LIB path is appended. F238 also supports:

    {"kind":"smtlib-qfbv","name":"cvc5-incremental",
     "command":["cvc5","--lang","smt2","--incremental",
                "--produce-models"],
     "persistent":true,"prefix_cache":4,
     "capabilities":{"incremental":true,"accept_unsat":true}}

  Persistent commands cannot contain `{query}` or `{timeout_ms}`. Each exact
  `prefix_key` owns one interactive solver process. Prefix roots are asserted
  once; each target uses `push -> assert -> check-sat/get-value -> pop`.
  Target-only input declarations may be added between requests. `prefix_cache`
  is an LRU process bound in `[1,64]`, default 4. Process closure, malformed
  output, timeout, or prefix-digest mismatch destroys that context; a later
  request rebuilds it cold. Request wall time is enforced externally even when
  the solver has no portable per-check timeout option. The service-level
  `--portfolio` option overrides this environment variable.

  An `smtlib-qfbv` capability contract has schema
  `symcc-qfbv-capability-v1`. `operators` defaults to the complete Query IR
  QF_BV set; `max_bits`, `max_nodes`, and `max_input_bytes` are hard lowering
  bounds. Unsupported operators, sort/width/arity mismatches, and bound
  violations return `unknown` before a solver process starts. `model_values`
  must be true. `incremental` defaults to false and must be true for a
  persistent entry. `accept_unsat` defaults to false: an external UNSAT is retained
  as raw telemetry but downgraded to `unknown` unless the experiment explicitly
  authorizes that backend as an exact UNSAT authority.

  Lowering emits `symcc-qfbv-lowering-v1` with canonical capability, input-set,
  SMT-LIB and certificate digests, exact operator counts, maximum width, and
  sort proof status. SAT uses standard SMT-LIB `get-value` for every 8-bit input
  offset. The adapter patches the concrete witness and checks all Query IR roots;
  `QueryStore.complete()` repeats that check against its independently loaded
  CAS expressions before persisting the result. Missing/malformed model values,
  a false model, certificate tampering, or a query-id mismatch therefore cannot
  enter the SAT cache. The current lowerer covers QF_BV only; arrays, floating
  point, strings, cross-worker clause transport, and proof-producing UNSAT
  require separate capability or evidence layers.

  Portfolio results include a `symcc-solver-portfolio-v1` object with every
  attempt's name, status, solver, elapsed time, prefix-cache hit,
  backend/capability status, context protocol, model/UNSAT authorization bits,
  certificate digests, and bounded reason. A SAT/UNSAT conflict across portfolio members is recorded as
  `disagreement=true` and conservatively returned as `unknown`, so a disputed
  result is not cached as a proof or model. Query-store stats expose
  `portfolio_results` and `portfolio_disagreements`.

- SYMCC_QUERY_SOLVER_PORTFOLIO_PARALLELISM=N (default number of configured
  portfolio solvers, maximum 64): Maximum number of solver backends run
  concurrently for one portfolio query. The service-level
  `--portfolio-parallelism` option overrides this default.

- SYMCC_QUERY_SOLVER_PORTFOLIO_CANCEL_GRACE_MS=N (default -1/disabled, range
  -1--60000): With -1, the portfolio waits for all launched attempts before
  choosing a winner, preserving complete SAT/UNSAT disagreement observation.
  A nonnegative value starts a bounded cross-check window only after a SAT
  result. At expiry, queued futures are cancelled and running helpers receive a
  query-scoped process-group interrupt. UNSAT never triggers cancellation.
  `--portfolio-cancel-grace-ms` overrides the environment; 0 requests immediate
  cancellation after processing results already completed in the same wait
  batch.

  Interrupted persistent JSON servers respawn on the next query. Interrupted
  prefix-persistent QF_BV contexts are removed and rebuilt cold. Every SAT
  winner still passes QueryStore's exact model validation; an invalid early SAT
  is rejected but may have cancelled a slower valid fallback. Portfolio
  telemetry exposes `cancellation_enabled`, `cancel_grace_ms`,
  `cancel_requested`, `cancelled_attempts`, and `consensus_complete`; attempts
  expose `cancelled/cancel_reason`. QueryStore stats expose
  `portfolio_cancel_requests`, `portfolio_cancelled_attempts`, and
  `portfolio_incomplete_consensus`. Elapsed time remains wall-clock time through
  cancellation and helper cleanup.

- SYMCC_QUERY_TRAVERSAL=dfs|bfs|priority (default dfs): Prefix-trie work
  ordering used by the MPI-launched service. The standalone service exposes the
  equivalent `--traversal` option. Prefix ownership is deterministically
  sharded across worker slots so repeated prefixes reach the same solver cache.

- SYMCC_QUERY_PREFIX_CACHE=N (default 128, maximum 65536): Number of parsed
  prefix solver contexts retained by each persistent helper. A query loads its
  target under `push`, checks it, and then `pop`s back to the immutable prefix.

- Query/schedule joint validation: `symcc_query_service.py` accepts
  `--schedule-constraints PATH`, `--schedule-validation-out PATH`,
  `--schedule-validation-max-artifacts N`, and `--schedule-validation-only`.
  It matches schedule artifacts to queries by explicit `query_id` when present,
  otherwise by `target_branch` against bounded Query IR metadata (`site`,
  `target_branch`, `target_site`, or `branch`). The query store persists
  validation rows in SQLite table `joint_schedule_validations` and immutable
  JSON files under `$SYMCC_QUERY_STORE/joint_schedule/<hash-prefix>/`.

- SYMCC_GENERATOR_SAMPLES=N (default 4, maximum 64): Number of
  solver-verified candidate models that `symcc-query-solver` attempts to embed
  in a reusable `symcc-solution-generator-v1` result after a SAT query. Set this
  to 0 to persist the generator IR, fixed assignments, computed byte ranges, and
  fields without spending time on additional checked samples.

- SYMCC_GENERATOR_MAX_VARS=N (default 4, maximum 64): Maximum number of input
  byte variables for which the persistent query solver computes exact
  per-byte feasible lower/upper bounds. Variables outside the budget stay fixed
  to the primary model in the emitted generator.

- SYMCC_GENERATOR_CHECK_TIMEOUT=N (default min(100, query timeout)): Per-check
  timeout in milliseconds for generator range probing and sample validation.
  Unknown results narrow or reject generator candidates; they are not emitted as
  verified models.

- SYMCC_GENERATOR_OPTIMISTIC=0|1 (default 1): In persistent prefix/target
  queries, compute generator ranges and proposals against the target assertions
  with prefix assertions removed. The emitted
  `symcc-optimistic-simplification-v1` certificate records the original query
  hash and complete kept/dropped assertion partition. Every proposal is still
  checked with all prefix and target assertions in the original solver;
  `unsat`/`unknown` candidates are rejected. Set this to 0 for exact full-PC
  ranges. One-shot queries and queries without a separable prefix stay exact.

- SYMCC_GENERATOR_TACTIC_CONVERTER=0|1 (default 1): Apply the native Z3
  `simplify` then `solve-eqs` tactic pipeline to the generator proposal goal,
  enumerate a bounded number of subgoal models, and use Z3's model converter to
  recover eliminated input variables. Converted assignments are accepted only
  after the original full-prefix solver returns SAT. Tactic failure is local
  and falls back to range sampling.

- SYMCC_GENERATOR_CONVERTER_SAMPLES=N (default 2, maximum 64): Maximum number
  of full-solver-accepted models requested from the native tactic converter.
  The value is also capped by `SYMCC_GENERATOR_SAMPLES`; subgoal enumeration
  attempts are bounded to four times this value.

- SYMCC_GENERATOR_REPLAY_SAMPLES=N (default 8, maximum 64, 0 disables):
  Maximum number of candidates materialized per witness by replaying a
  persisted solution generator in QueryStore. Query-IR converter recipes,
  ranges, and field samples are proposals only. Every replayed byte string
  must satisfy all persisted prefix and target roots in the bounded Query IR
  evaluator before materialization; concrete replay remains required.

- Solution generator artifacts: asynchronous query results may contain a
  `generator` object and `generator_hash`. The query store writes canonical
  generator JSON to
  `$SYMCC_QUERY_STORE/generators/<hash-prefix>/<hash>.json`, records the same
  generator in SQLite, and materializes every solver-verified model as a normal
  candidate manifest with `solver_verified=true` and `verified=false` until
  concrete replay. Offline generator replay candidates are separately marked
  `generator_replay_verified=true`, `query_ir_verified=true`, and
  `solver_verified=false`.

- SYMCC_PARTIAL_SOLUTION_CACHE=0|1 (default 1): Enable the
  PSCache-inspired partial-solution cache in the asynchronous query store. SAT
  primary assignments and solver-verified generator models are persisted as
  `symcc-partial-solution-v1` records. A later query only receives a candidate
  after bounded Query IR evaluation proves that the patched witness satisfies
  every prefix root and the target root. A partial hit never marks a query SAT
  or UNSAT; it only emits a candidate for ordinary concrete replay.

- SYMCC_PARTIAL_SOLUTION_LIMIT=N (default 8, maximum 256): Maximum number of
  Query-IR-verified partial candidates materialized for one query.

- SYMCC_PARTIAL_SOLUTION_SCAN=N (default 512, maximum 65536): Number of recent
  partial solutions considered when looking for reusable assignments.

- SYMCC_PARTIAL_SOLUTION_PENDING_QUERIES=N (default 64, maximum 4096): Number
  of pending queries rescanned after a SAT completion writes new partial
  solutions.

- SYMCC_SOLVER_PSCACHE=0|1 (default 1 in `symcc-query-solver --server`):
  Enable solver-helper-internal partial-solution probing. The persistent helper
  remembers recent SAT input-byte assignments and, before a normal Z3 check,
  briefly asserts a bounded number of cached assignments against the current
  prefix+target solver context. A hit returns SAT only after Z3 checks the
  current query under the cached assignment; a miss falls through to the normal
  solver and is not treated as UNSAT evidence.

- SYMCC_SOLVER_PSCACHE_SIZE=N (default 128, maximum 65536): Number of recent
  SAT assignment maps retained by the persistent helper.

- SYMCC_SOLVER_PSCACHE_ASSIGNMENTS=N (default 64, maximum 4096): Maximum input
  byte assignments retained from one SAT model for solver-internal probing.

- SYMCC_SOLVER_PSCACHE_PROBES=N (default 4, maximum 128): Maximum cached
  assignment maps probed before a full solve.

- SYMCC_SOLVER_PSCACHE_TIMEOUT=N (default min(25, query timeout) ms, maximum
  1000 ms): Timeout for each solver-internal partial-solution probe. Results
  expose `solver_pscache_hit` and `solver_pscache_probes`; QueryStore stats
  include `solver_pscache_hits`.

- SYMCC_SOLVER_PSCACHE_CONFLICTS=0|1 (default 1): Enable proof-carrying
  assumption-conflict collection in the persistent QF_BV helper. The helper
  projects the current concrete witness and failed cached probes to numeric
  input-byte equalities, calls Z3 with those equalities as assumptions, and
  retains a record only when Z3 returns UNSAT with a non-empty assumption
  core. A second check revalidates the retained core. If the formula is UNSAT
  without any byte assumption, minimization reaches the empty core and the
  record is discarded.

- SYMCC_SOLVER_PSCACHE_CONFLICT_ASSIGNMENTS=N (default 64, maximum 4096):
  Maximum input-byte equalities projected from one concrete witness for an
  assumption-conflict check.

- SYMCC_SOLVER_PSCACHE_CONFLICT_SOLUTIONS=N (default 16, maximum 64):
  Maximum distinct failed cached assignments exported from one helper request.
  The current witness may add one record; the serialized result has an
  unconditional hard bound of 64 records.

- SYMCC_SOLVER_PSCACHE_CONFLICT_CORE_CHECKS=N (default 8, range 0--4096):
  Deletion checks used to minimize each Z3 assumption core. Exhausting the
  budget or receiving unknown preserves a verified non-minimal core and sets
  `core_minimal=false`; it never upgrades an unproved core. Every retained
  core receives a final UNSAT recheck.

- SYMCC_SOLVER_PSCACHE_CONFLICT_TIMEOUT=N (default min(25, query timeout) ms,
  maximum 1000 ms): Per-check timeout for witness conflict extraction, core
  deletion, and final core verification. Timeout/unknown yields no conflict
  claim for the affected check.

  Helper results expose `solver_pscache_conflict_checks` and bounded
  `symcc-solver-conflict-solution-v1` records containing the full projected
  byte assignment, non-empty core assignment, source, proof kind, minimization
  status, and check count. QueryStore validates their types and subset
  relation, adds canonical certificate hashes, independently checks that the
  assignment fails the source Query IR, and persists only such records.
  SQLite `query_literals` and `partial_solution_literals` normalize nested
  logical negation into signed literal identities, so positive-prefix and
  off-path evidence participates in relevance ranking. Future candidates
  still require complete Query IR validation and ordinary concrete replay.

- SYMCC_SELECTIVE_QUERY=0|1 (default 1 in persistent
  `symcc-query-solver --server`): Before a full query solve, build an
  assertion-to-input-byte dependency hypergraph and close the target assertion's
  byte set through every connected prefix assertion. Bytes in disconnected
  components may be fixed to the QueryStore concrete witness for one short
  selective SAT probe. A selective SAT model is exact for the full query.
  Selective UNSAT, unknown, timeout, malformed/missing witness, or budget
  rejection always falls through to the ordinary full solver and can never
  populate an UNSAT proof.

- SYMCC_SELECTIVE_QUERY_MIN_FIXED=N (default 2, maximum 4096): Minimum number
  of disconnected witness bytes required before attempting a selective probe.

- SYMCC_SELECTIVE_QUERY_MAX_FIXED=N (default 64, maximum 4096): Maximum
  disconnected bytes fixed in one selective probe.

- SYMCC_SELECTIVE_QUERY_MAX_SYMBOLIC=N (default 16, maximum 4096): Maximum
  byte variables left symbolic after fixing. Queries above this bound go
  directly to the full solver.

- SYMCC_SELECTIVE_QUERY_TIMEOUT=N (default min(50, query timeout) ms, maximum
  1000 ms): Maximum total short-probe timeout. The learned policy may reduce
  this value from per-context selective/full-solve EWMA, but never increases
  it or the query timeout.

- SYMCC_SELECTIVE_QUERY_COMPLETIONS=N (default 1, range 0--8): Number of
  disconnected-component completions attempted inside the total short-probe
  timeout. The bounded sequence is concrete witness, all-zero, all-0xff, then
  deterministic query-seeded random assignments; duplicate assignments are
  skipped. Setting 0 is a mechanism ablation. Every completion retains the
  complete prefix+target query, so only SAT is authoritative.

- SYMCC_SELECTIVE_QUERY_LEARNING=0|1 (default 1): Enable contextual online
  selection of whether a structurally eligible query should receive the short
  probe. Context keys bucket assertion count, byte-variable count, target
  dependency ratio, fixed-byte count, AST size, and costly bit-vector
  operations. Value 0 keeps the F188 structural policy.

- SYMCC_SELECTIVE_QUERY_POLICY_EXPLORE=N (default 4, range 0--1024): Forced
  cold-start attempts per context before the cost-aware decision is used.

- SYMCC_SELECTIVE_QUERY_POLICY_MIN_SAVINGS_US=N (default 100, range
  0--3600000000): Minimum optimistic expected solver-time saving needed for a
  learned attempt after cold start.

- SYMCC_SELECTIVE_QUERY_POLICY_MIN_TIMEOUT=N (default 5 ms, range 1--1000):
  Lower bound when the learned EWMA predictor reduces the selective timeout.

- SYMCC_SELECTIVE_QUERY_POLICY_STATE=PATH (default: query service creates
  `STORE/policies/selective-worker-W-backend-B.state`): Versioned bounded
  per-worker/backend policy state. Explicit paths should not be shared by
  concurrently writing helpers. A corrupt or incompatible file is ignored.

- SYMCC_SELECTIVE_QUERY_POLICY_CONTEXTS=N (default 256, range 1--4096):
  Maximum learned structural contexts. Least-observed contexts are evicted.

- SYMCC_SELECTIVE_QUERY_POLICY_SAVE_INTERVAL=N (default 1, range 1--4096):
  Number of new observations between atomic state-file replacements.

  Result artifacts expose eligibility, decision/context, predicted savings,
  learned timeout, completion count/hit index, policy observations, full-solve
  EWMA, and the original attempted/hit/symbolic/fixed/elapsed fields.
  QueryStore stats additionally expose learned skips and non-witness completion
  hits. Tunable mechanism parameters are present in the conditional
  self-configuration schema; state paths and storage limits are operational
  controls and are not sampled.

- Partial-solution artifacts: cache rows live in SQLite tables
  `partial_solutions`, `partial_solution_clauses`,
  `partial_solution_literals`, `query_literals`, and
  `partial_solution_candidates`. Lookup prioritizes normalized signed-literal
  overlap, then source-clause overlap, before applying the mandatory Query IR
  verifier. Conflict-derived rows include `provenance`, a canonical proof JSON,
  and an independently checked source-verification bit. Candidate manifests
  use `symcc-query-candidate-v1` with
  `solver_verified=false`,
  `partial_solution_hash`, `partial_solution_source_query_id`,
  `partial_solution_verified=true`, `query_ir_verified=true`, and
  `verified=false`. External query-output directories receive
  `async-partial-*` files that flow through the same MPI/AFL feedback path as
  exact solver candidates.

- F241 schedule-level SMBO artifacts are trained from an already verified F240
  ensemble and can be passed through the existing
  `SYMCC_SMT_ALGORITHM_PRIOR=PATH` interface:

      python3 util/smt_schedule_smbo.py \
        .smt_sequence_ensemble.json --output .smt_schedule_smbo.json \
        --evaluation-budget 64 --initial-design 12 \
        --max-candidates 1024 --max-schedule-length 3 \
        --slice-fractions 0.25,0.5,1 \
        --bag-estimators 5 --boost-rounds 3 --tree-depth 3
      python3 util/smt_schedule_smbo.py --verify .smt_schedule_smbo.json

  `--evaluation-budget` is the maximum number of schedule objectives visible
  to acquisition (4--512). `--initial-design` is the requested deterministic
  initial size (4--128), and the actual design always includes every
  single-action/budget baseline. `--max-candidates` is 8--4096 and must also
  contain all such baselines. `--max-schedule-length` is 1--8.
  `--exploration` is EI xi (0--1), `--uncertainty-floor` is the minimum sigma,
  and `--action-uncertainty-z`, `--reward-weight`, and
  `--min-schedule-improvement` retain F240's conservative schedule semantics.
  Tree count/depth/leaf/threshold and learning-rate flags bound the
  schedule-level acquisition surrogate independently of F240's action models.

  Artifact schema `symcc-smt-schedule-smbo-policy-v1` records selection
  `evaluations` separately from `posthoc_oracle_evaluations`. The latter are
  computed only after selection to diagnose simple regret and must be charged
  equally or disabled conceptually in optimizer-cost comparisons. Loading
  fails closed on any F240 proof, digest, candidate, trace, or replay mismatch.
  Runtime state reports
  `prior_kind=smbo-expected-improvement-sequence`; the schedule remains a 90/10
  preference and does not grant additional solver-result authority.

- F244 fixed-version QF_BV backend conformance:

      # Reproducibly build the official Bitwuzla 0.9.1 tag/commit under
      # $HOME/.local/opt/bitwuzla-0.9.1.
      benchmark/install_bitwuzla_0_9_1.sh
      export PATH="$HOME/.local/opt/bitwuzla-0.9.1/bin:$PATH"

      # Run pinned Z3 4.8.12, cvc5 1.1.2, and Bitwuzla 0.9.1.
      python3 util/qf_bv_conformance.py --output qfbv-evidence.json
      python3 util/qf_bv_conformance.py --verify qfbv-evidence.json
      python3 util/qf_bv_conformance.py \
        --replay qfbv-evidence.json --output qfbv-replay.json

  Default evidence requires exact versions Z3 4.8.12, cvc5 1.1.2, and
  Bitwuzla 0.9.1.
  `--backend-config` accepts a JSON file or inline list of objects with
  `name`, `command`, `version_command`, and exact `expected_version`.
  Commands use the same `{query}` and `{timeout_ms}` placeholders as the
  one-shot QF_BV query-service adapter. Missing executables, version mismatch,
  malformed models, incomplete operator coverage, untrusted UNSAT acceptance,
  certificate mismatch, or digest mismatch fail closed.

  Schema `symcc-qfbv-backend-conformance-v1` binds the canonical 38-operator
  SAT matrix, contradictory UNSAT probe, absolute executable identity and
  SHA-256, exact version output, capabilities, lowering certificates, and
  QueryStore completion. `artifact_sha256` seals the complete run.
  `semantic_sha256` excludes timestamp, elapsed time, and host-specific binary
  path/hash so `--replay` can compare solver semantics across runs. Offline
  `--verify` reconstructs Query IR identities and lowering certificates without
  executing a solver. The checked result is
  `benchmark/evidence/qfbv_conformance_f244.json`.

- F245 sealed paired QF_BV holdout campaigns:

      python3 util/qf_bv_campaign.py \
        --corpus /path/to/frozen/query-spool \
        --conformance benchmark/evidence/qfbv_conformance_f244.json \
        --split-seed frozen-study-seed --split-parts 5 --holdout-parts 1 \
        --timeout-ms 5000 --repetitions 20 --confirmatory \
        --output qfbv-holdout.json
      python3 util/qf_bv_campaign.py --verify qfbv-holdout.json
      python3 util/qf_bv_campaign.py \
        --replay qfbv-holdout.json --output qfbv-holdout-replay.json

  `--corpus` accepts a Query IR envelope JSON, list/`queries` bundle, JSONL,
  or directory (`*.query.json` preferred), bounded to 4096 unique queries and
  256 MiB. `SHA256(split_seed:query_id) mod split_parts` assigns the first
  `holdout_parts` buckets to holdout. Only holdout tasks execute. `--backends`
  optionally selects comma-separated names already certified by the embedded
  conformance artifact. Every current executable version and file SHA must
  still match before execution.

  Repetitions run one-shot tasks in a stable hash-randomized order with equal
  query count and wall timeout. The artifact records elapsed time, child
  user+system CPU, censored PAR-2, model/trust evidence, backend totals, and
  pairwise solved quadrants/disagreements/PAR-2 deltas. `--verify` reconstructs
  the corpus split, task set, lowering, SAT witnesses, PAR-2, and aggregates
  without running a solver. `--confirmatory` requires at least 20 repetitions,
  a non-synthetic corpus, and a non-empty disjoint training split.

  `--smoke-corpus` exists only for functional validation and is rejected by
  confirmatory mode. The checked non-performance smoke artifact is
  `benchmark/evidence/qfbv_holdout_f245_smoke.json`.

- F246 train-sealed QF_BV strategy campaigns:

      python3 util/qf_bv_strategy_campaign.py \
        --base-campaign qfbv-holdout.json \
        --training-trajectory train-trajectory.jsonl \
        --beam-policy .smt_sequence_ensemble.json \
        --smbo-policy .smt_schedule_smbo.json \
        --timeout-ms 5000 --cancel-grace-ms 50 \
        --repetitions 20 --confirmatory \
        --output qfbv-strategies.json
      python3 util/qf_bv_strategy_campaign.py \
        --verify qfbv-strategies.json
      python3 util/qf_bv_strategy_campaign.py \
        --replay qfbv-strategies.json \
        --output qfbv-strategies-replay.json

  Every JSONL training event must contain `context.query_id` naming a query in
  the embedded F245 train split. The tool normalizes the events, retrains F240
  from them, retrains F241 from F240, and requires exact artifact equality.
  Modeled action names must exactly equal the selected F244-certified backend
  names. The F240/F241 timeout must equal `--timeout-ms`, and every sequence's
  stage budgets must sum to at most that value.

  The task matrix includes one individual arm per backend, `f240-beam`,
  `f241-smbo`, and `f242-parallel-grace-Nms`. `--cancel-grace-ms` is 0--60000;
  only a validated SAT result starts cancellation, while UNSAT collects all
  attempts. The artifact stores full internal attempts, child CPU, wall,
  PAR-2, cancel/incomplete-consensus counters, structural feature decisions,
  and paired strategy aggregates. Equal logical query count/shared declared
  wall budget does not make parallel CPU equal; use CPU quotas or
  coverage/CPU-hour for confirmatory interpretation.

  `--smoke-policy` deterministically builds a synthetic train-only F240/F241
  bundle for functional testing and is rejected by confirmatory mode. The
  checked non-performance artifact is
  `benchmark/evidence/qfbv_strategy_f246_smoke.json`.

- F247 sealed AFL edge/data coverage join:

      cc -O2 -shared -fPIC util/afl_data_coverage_rt.c \
        -o build/libafl_data_coverage_rt.so -ldl
      afl-clang-fast -O0 -g -fno-builtin \
        benchmark/qfbv_coverage_smoke.c \
        -o build/qfbv_coverage_smoke_afl
      python3 util/qf_bv_coverage_join.py \
        --strategy-campaign qfbv-strategies.json \
        --target-command-json \
          '["/absolute/path/to/afl-target","@@"]' \
        --data-preload /absolute/path/to/libafl_data_coverage_rt.so \
        --showmap afl-showmap --timeout-ms 1000 \
        --map-repetitions 2 \
        --output qfbv-coverage.json
      python3 util/qf_bv_coverage_join.py --verify qfbv-coverage.json
      python3 util/qf_bv_coverage_join.py --replay qfbv-coverage.json \
        --output qfbv-coverage-replay.json

  The command must contain exactly one `@@`. The target, `afl-showmap`, and
  preload absolute paths, file SHA-256 values, showmap version, and timeout are
  sealed. Every SAT assignment in the verified F246 source is materialized;
  candidates and original witnesses are deduplicated by content SHA-256 and
  replayed through persistent `afl-showmap -S -e` edge/data oracles.

  Both oracles load the same preload so PCGUARD edge IDs have the same layout.
  The edge oracle sets `AFL_DATA_COVERAGE=0` and
  `SYMCC_AFL_DATA_COVERAGE=0`; the combined oracle sets both to `1`.
  The preload reserves IDs `0..65535` as its data namespace before AFL++
  forkserver map negotiation, while PCGUARD edge IDs are allocated above it.
  The verifier requires identical status, `edge_ids subset combined_ids`, and
  every extra data ID below 65536. Do not compare a no-preload edge map with a
  preload combined map because their PCGUARD IDs are not comparable.

  `SYMCC_AFL_DATA_MAP_SIZE=N` optionally narrows data hashing to the first
  `N` slots, where `1 <= N <= 65536`; invalid or larger values retain 65536.
  It does not resize the AFL shared memory and must not be confused with
  AFL++'s internal `__AFL_MAP_SIZE` allocation limit. The normal public switch
  remains `SYMCC_AFL_DATA_COVERAGE=0/1`; `AFL_DATA_COVERAGE=0/1` is the
  emergency runtime alias.

  `--map-repetitions` is 1--100. Each input must produce an identical status
  and sparse bitmap in every repetition. `--confirmatory` additionally
  requires at least two map repetitions and a verified confirmatory F246
  source, which itself requires a non-synthetic corpus and at least 20
  repetitions. The artifact reports candidate-vs-witness edge/data novelty,
  per-strategy union gain, coverage per solver child CPU second, pairwise
  complementarity, and F243 feature-schema v1/v2 Brier/log-loss/ECE
  calibration. Showmap replay CPU is reported separately.

  `benchmark/evidence/qfbv_coverage_f247_smoke.json` and
  `benchmark/qfbv_coverage_smoke.c` are functional evidence only. They contain
  four synthetic holdout queries and must not be used to rank strategies or
  make coverage-performance claims.

- F248/F268/F272/F273 Hydra profile/transform/original-replay pipeline:

      python3 util/hydra_transform.py profile telemetry/*.json \
        --profile-output build/hydra.profile \
        --artifact-output results/hydra-profile.json

      # Use the original build as the authority.
      symcc -O0 target.c -o build/target.original

      # Build one transformed site. Use a fresh manifest.
      SYMCC_HYDRA=1 \
      SYMCC_HYDRA_PROFILE=build/hydra.profile \
      SYMCC_HYDRA_MODE=aggressive \
      SYMCC_HYDRA_MANIFEST_OUT=build/hydra-manifest.jsonl \
        symcc -O0 target.c -o build/target.hydra
      python3 util/verify_hydra_transform_manifest.py \
        build/hydra-manifest.jsonl

      # Run the transformed target through the normal SymCC exploration, then
      # replay every generated input on both binaries.
      python3 util/hydra_transform.py campaign \
        --original-command-json '["/abs/build/target.original"]' \
        --transformed-command-json '["/abs/build/target.hydra"]' \
        --input-dir /abs/transformed-output \
        --site <manifest-site> \
        --manifest build/hydra-manifest.jsonl \
        --denylist-output build/hydra-denylist.txt \
        --output results/hydra-replay.json
      python3 util/hydra_transform.py verify results/hydra-replay.json
      python3 util/hydra_transform.py replay results/hydra-replay.json \
        --output results/hydra-replay-check.json

  Commands may contain one `@@` file placeholder; otherwise input bytes are
  provided on stdin. Campaign bounds are 16,384 inputs, 16 MiB per input,
  256 MiB total and 1--3,600,000 ms timeout. Exit 0 means the artifact verifies
  and no failure-preservation violation was observed; exit 2 means at least one
  input failed only on the original, so the transformed build is rejected.
  A transformed-only failure is not an error in aggressive mode: it is omitted
  from `accepted_failure_inputs` and its unique selected site is emitted to the
  denylist. The checked mechanism-only evidence is
  `benchmark/evidence/hydra_f248_smoke.json`. F268's compiler regression checks
  an equal 2x2 region on all 256 byte values, structure-manifest tampering and
  symbolized LLVM verification. F272 additionally checks a 2x1 region with a
  one-sided edit and a 1x4 cross-block def-use region on all 256 byte values,
  v2 block-ordinal/edit-distance tampering through both the direct verifier and
  campaign gate, and rejection of a fifth pure-linear arm block. F273 checks
  3x1 and maximal 7x7 internal trees plus an aggressive matched-store tree on
  all 256 byte values, validates symbolized IR, rejects parent/leaf/successor
  tampering, and keeps a fourth internal branch, empty alignment and
  tree-local reconvergence unchanged.

- F274 unified continuation/loop/Hydra transformation seal and independent
  replay:

      # Continuation. The manifest determines memory-on versus structural-only.
      python3 util/seal_transform_artifact.py seal \
        --pipeline continuation \
        --manifest continuation=continuations.jsonl \
        --input-ir input.ll --lowered-ir lowered.ll \
        --compiler build/libsymcc.so --llvm-tool /path/to/opt \
        --output transformation.seal.json

      # A loop may carry recurrence evidence, exit evidence, or both.
      python3 util/seal_transform_artifact.py seal \
        --pipeline loop \
        --manifest loop-recurrence=loops.jsonl \
        --manifest loop-exit=loop-exits.jsonl \
        --input-ir input.ll --lowered-ir lowered.ll \
        --compiler build/libsymcc.so --llvm-tool /path/to/opt \
        --output transformation.seal.json

      # Hydra requires exactly one record and restores its site and mode.
      python3 util/seal_transform_artifact.py seal \
        --pipeline hydra --manifest hydra=hydra.jsonl \
        --input-ir input.ll --lowered-ir lowered.ll \
        --compiler build/libsymcc.so --llvm-tool /path/to/opt \
        --output transformation.seal.json

      python3 util/seal_transform_artifact.py verify \
        --pipeline hydra --manifest hydra=hydra.jsonl \
        --input-ir input.ll --lowered-ir lowered.ll \
        --compiler build/libsymcc.so --llvm-tool /path/to/opt \
        --seal transformation.seal.json

      python3 util/replay_transform_artifact.py \
        --pipeline hydra --manifest hydra=hydra.jsonl \
        --input-ir input.ll --lowered-ir lowered.ll \
        --compiler build/libsymcc.so --llvm-tool /path/to/opt \
        --seal transformation.seal.json

  Repeat `--manifest KIND=PATH` for each loop proof kind. Pipeline/kind
  mismatches and duplicate kinds are rejected. Seal creation independently
  verifies every manifest, binds ordered proof identities, input/lowered IR,
  compiler, LLVM tool and LLVM version, refuses an existing output and commits
  through lock/fsync/atomic rename. Replay clears inherited transformation
  variables and independently reruns the exact pass pipeline from `input.ll`;
  regenerated manifests must be record-identical, regenerated textual IR must
  be SHA-256-identical and LLVM-verifier clean, and the seal is checked again
  after replay. Generate `lowered.ll` with the same deterministic `opt -S`
  invocation. This is local exact artifact replay, not a signature, remote
  attestation, transparency log or cross-version semantic equivalence proof.

See sota_hybrid_execution_2026.md for the feedback model and evaluation plan.

(Most people should stop reading here.)


                                Advanced options


There is actually a third category of options: when compiling with SymCC, you
can specify the location of its various components via environment variables.
This is not necessary in most cases because the build system makes sure that all
components know about each other; however, in some advanced setups you may need
to move files around after building them, and in that case, you can use the
variables documented below to communicate the new locations:

- SYMCC_RUNTIME_DIR and SYMCC_RUNTIME32_DIR: The directory that contains the
  run-time support library (i.e., libSymRuntime.so).

- SYMCC_PASS_DIR: The directory containing the compiler pass (i.e.,
  libSymbolize.so).

- SYMCC_CLANG and SYMCC_CLANGPP: The clang and clang++ binaries to use during
  compilation. Be very careful with this one: if the version of the compiler you
  specify here doesn't match the one you built SymCC against, you'll most likely
  get linker errors.
