Artifact 8189752613ae0c87a34d3ea9ec612db7f2fd8a785b72264957563db478019eb3:
- File
src/sim/gen.zig
-
2026-08-01 08:31:42
— part of check-in
[992ff19a23]
on branch sub-manifest
— dst gen: check merge parents for cycles, not just the primary chain
The generator's own note says a real check-in DAG is acyclic by construction - a manifest's hash covers its P-card - while the phantom-parent flavor lets a hash be named before its record exists, so a later pick can close a loop and must be checked. The check only ever walked primary_parent_of, and the merge parent was drawn by pickInsertedIndex with the comment "no cycle risk".
That holds for the primary chain alone. Section 3.3 ancestry, which the B1 tie-break walks, follows merge parents too: a merge edge into an already inserted check-in, paired with a phantom primary edge out of it, closes a loop the guard never looked at. ancestryMaximal then finds every candidate dominated and no maximal element, and panics - seed 192 built exactly that, 9 to 14 to 13 and back.
parent_indices records every parent index a record names, wouldCloseCycle walks that graph visited-once, and the merge draw is checked like the primary one. A losing draw degrades to the single-parent record rather than drawing again, so the seeded stream shifts as little as it can.
Pre-existing: trunk fails seed 192 identically, and gen.zig is byte-identical there. Only the default six seeds hid it. (user: dmestas, size: 24120) [annotate] [blame] [check-ins using]
- 2026-08-14 12:21:34 — part of check-in [8a45a021f9] on branch trunk — merge sub-manifest: delta-manifest dialect, R cards, diff hunks, server identity, stash, open/log resolution, clone remote+progress, timestamp names; e2e expectations updated (user: dmestas, size: 24120) [annotate] [blame] [check-ins using]
-
2026-08-01 08:31:42
— part of check-in
[992ff19a23]
on branch sub-manifest
— dst gen: check merge parents for cycles, not just the primary chain