[P0] Evolution kernel rejects its own anonymous-dict candidate fixtures #165

Closed
opened 2026-08-21 23:08:29 +00:00 by lost-rob0t · 1 comment
lost-rob0t commented 2026-08-21 23:08:29 +00:00 (Migrated from github.com)

Failure

The restored aggregate runner reaches the evolution suite from merged #148. The kernel's own canonical fixtures use anonymous SWI dicts for candidate genes and constraint schemas:

constraints{schema:_{prompt:[p1,p2], loop:[direct,delegate]}}
candidate{id:a, genes:_{prompt:p1, loop:direct}}

valid_candidate_shape/1 and valid_constraints/1 require raw ground/1 on those enclosing named dicts. Because a nested anonymous dict carries a variable tag, the valid fixture is rejected before gene validation. The current crossover assertion also compares against a fresh anonymous dict with ==, which is representation-unstable.

This is the same closed-data representation defect centralized in #158/#159.

Required invariant

  • candidate and constraint configuration data are canonical closed data;
  • anonymous dict tags normalize to rlm_anonymous_dict;
  • named tags remain named;
  • true variable values and cycles fail closed;
  • validation returns the canonical candidate used by mutation/crossover;
  • lineage/fingerprint material is deterministic across equivalent anonymous-dict inputs;
  • no arbitrary callable/operator execution is introduced.

Acceptance

  • existing valid candidate fixture validates;
  • unknown genes and disallowed values still reject;
  • mutation and crossover return ground canonical genes;
  • equivalent anonymous-dict inputs produce stable lineage fingerprints;
  • genuine variable/cyclic candidate data rejects;
  • Pareto selection behavior remains unchanged;
  • aggregate test/run_tests.pl remains the oracle.

Discovered during post-#60 false-green remediation of merged #148.

## Failure The restored aggregate runner reaches the evolution suite from merged #148. The kernel's own canonical fixtures use anonymous SWI dicts for candidate genes and constraint schemas: ```prolog constraints{schema:_{prompt:[p1,p2], loop:[direct,delegate]}} candidate{id:a, genes:_{prompt:p1, loop:direct}} ``` `valid_candidate_shape/1` and `valid_constraints/1` require raw `ground/1` on those enclosing named dicts. Because a nested anonymous dict carries a variable tag, the valid fixture is rejected before gene validation. The current crossover assertion also compares against a fresh anonymous dict with `==`, which is representation-unstable. This is the same closed-data representation defect centralized in #158/#159. ## Required invariant - candidate and constraint configuration data are canonical closed data; - anonymous dict tags normalize to `rlm_anonymous_dict`; - named tags remain named; - true variable values and cycles fail closed; - validation returns the canonical candidate used by mutation/crossover; - lineage/fingerprint material is deterministic across equivalent anonymous-dict inputs; - no arbitrary callable/operator execution is introduced. ## Acceptance - [ ] existing valid candidate fixture validates; - [ ] unknown genes and disallowed values still reject; - [ ] mutation and crossover return ground canonical genes; - [ ] equivalent anonymous-dict inputs produce stable lineage fingerprints; - [ ] genuine variable/cyclic candidate data rejects; - [ ] Pareto selection behavior remains unchanged; - [ ] aggregate `test/run_tests.pl` remains the oracle. Discovered during post-#60 false-green remediation of merged #148.
lost-rob0t commented 2026-08-24 08:55:14 +00:00 (Migrated from github.com)

Completed on current main ab426de54a54101ca3a6d8197db77e4c1f9d009f. Exact production code matches PR #166. Focused evolution acceptance passed 11/11 and the fresh aggregate on the same SHA passed 767/767 across 74 suites with no failures/timeouts/blocked/fixme. PR #166 was closed as superseded because its old base would regress newer work.

Completed on current main `ab426de54a54101ca3a6d8197db77e4c1f9d009f`. Exact production code matches PR #166. Focused evolution acceptance passed 11/11 and the fresh aggregate on the same SHA passed 767/767 across 74 suites with no failures/timeouts/blocked/fixme. PR #166 was closed as superseded because its old base would regress newer work.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
nsaspy/prolog-rlm#165
No description provided.