Repository navigation
Tags
Tags
fix(cpp): filter skip fields out of metadata.common_input before op i… …nit (CI review) CI diff-fuzz on this PR found a new go-vs-cpp divergence (seed 1784954760 divergence_000076) that the fixture-level fix did not cover. pine-go's SetMetadata (pine.go:159-168) filters skip control fields out of metadata.common_input before handing it to the operator via MetadataAware; the operator sees only business fields. My earlier Liam0205#174 fix gated OperatorInput::common on the excluded_common set — the skip field's VALUE returns nil — but I never filtered the field NAME out of the list handed to operator init(). Ops that iterate cfg.metadata.common_input to build a salt/hash (reorder_shuffle_by_salt loops over common_inputs_ in execute()) then see an extra entry: Go common_input=[count] salt = "17|" cpp common_input=[count,_skip] salt = "17||" Same downstream cascade as Liam0205#174: different salt → different shuffle order → cascading downstream item order divergence. Fix: at engine construction, filter cfg.skip out of op_cfg.metadata.common_input before calling op->init(cfg). Matches Go's SetMetadata filter step and applies to every operator uniformly, not just shuffle. DAG dependency inference sees the unfiltered read set via CommonReadFields at plan time, so wiring is unaffected. Verified: the failing CI seed 1784954760 100 rounds is now 100/0; seed 20260725 500 rounds also 100/0; nightly divergence Liam0205#174/Liam0205#177 regressions still pass; cross-validate 3/9 → 98/98 + 91/91.
fix(cpp): filter skip fields out of metadata.common_input before op i… …nit (CI review) CI diff-fuzz on this PR found a new go-vs-cpp divergence (seed 1784954760 divergence_000076) that the fixture-level fix did not cover. pine-go's SetMetadata (pine.go:159-168) filters skip control fields out of metadata.common_input before handing it to the operator via MetadataAware; the operator sees only business fields. My earlier Liam0205#174 fix gated OperatorInput::common on the excluded_common set — the skip field's VALUE returns nil — but I never filtered the field NAME out of the list handed to operator init(). Ops that iterate cfg.metadata.common_input to build a salt/hash (reorder_shuffle_by_salt loops over common_inputs_ in execute()) then see an extra entry: Go common_input=[count] salt = "17|" cpp common_input=[count,_skip] salt = "17||" Same downstream cascade as Liam0205#174: different salt → different shuffle order → cascading downstream item order divergence. Fix: at engine construction, filter cfg.skip out of op_cfg.metadata.common_input before calling op->init(cfg). Matches Go's SetMetadata filter step and applies to every operator uniformly, not just shuffle. DAG dependency inference sees the unfiltered read set via CommonReadFields at plan time, so wiring is unaffected. Verified: the failing CI seed 1784954760 100 rounds is now 100/0; seed 20260725 500 rounds also 100/0; nightly divergence Liam0205#174/Liam0205#177 regressions still pass; cross-validate 3/9 → 98/98 + 91/91.
docs(llmdoc): record type-tag dispatch and fuzz blind-spot lessons (L… …iam0205#175) Reflection: luaj's is*() family implements coercion queries, not type predicates — same-looking APIs across the three Lua host libraries have opposite semantics (gopher-lua type switch / wangshu kind tags = tags, luaj is* = coercion). The deeper lesson: the differential fuzzer never emitted flow_contract, so engines projected all outputs to {} and the comparison never saw a computed field value — measure effective visibility at the comparison surface, not shape occurrence. Promoted to stable docs: operator-contract.md (scalar dispatch must use real type tags, three-host-library semantics table), ci-quality-baseline.md (new-fuzz-dimension signal-reaches-comparison-surface rule + red/green verification recipe), cross-layer-validation.md (fixture comparator semantics define what each layer can pin). index.md synced.
docs(llmdoc): record type-tag dispatch and fuzz blind-spot lessons (L… …iam0205#175) Reflection: luaj's is*() family implements coercion queries, not type predicates — same-looking APIs across the three Lua host libraries have opposite semantics (gopher-lua type switch / wangshu kind tags = tags, luaj is* = coercion). The deeper lesson: the differential fuzzer never emitted flow_contract, so engines projected all outputs to {} and the comparison never saw a computed field value — measure effective visibility at the comparison surface, not shape occurrence. Promoted to stable docs: operator-contract.md (scalar dispatch must use real type tags, three-host-library semantics table), ci-quality-baseline.md (new-fuzz-dimension signal-reaches-comparison-surface rule + red/green verification recipe), cross-layer-validation.md (fixture comparator semantics define what each layer can pin). index.md synced.
PreviousNext