# Fork/gather research evidence — 2026-09-06 These are historical research inputs, not approved specifications or production code. The current contract is the [draft fork/gather spec](../../../superpowers/specs/2026-09-06-fork-gather-design.md). The [ADR](../../../adr/0006-explicit-fork-and-topology-driven-gather.md) records the architectural direction. Both remain proposed. ## Provenance Eight files were copied, not moved, from `random shit/research-chatgpt/`. Every copy was checked against its original with SHA-256. The redundant ZIP, older citation-less exports, and other unrelated research were not imported. | Archived file under `imported/` | Original relative path | | --- | --- | | `round-2-report.md` | `deep-research-report060926 copy 3.md` | | `round-2-citations.md` | `deep-research-report060926 copy 2.md` | | `audit-1.md` | `research-audit060926.md` | | `audit-2.md` | `research-audit060926-002.md` | The remaining four files retain their original basenames and were copied from the `research-audit060926-002/` subdirectory: - `fork_gather_reference.py` - `test_fork_gather_reference.py` - `README_fork_gather_reference.md` - `verification_test_results.txt` The report's inline citation numbers can be matched to the citations export. Uploaded-file citations concern an older repository snapshot, not necessarily current code. Original `sandbox:` download links are inert historical links; the actual supplied files are alongside the reports here. Keep `imported/` byte-identical to these source snapshots. Its local Markdown lint configuration disables style rules solely to preserve the imported text. This README and the live documents use normal lint rules. Future experiments belong outside `imported/`; do not silently repair the evidence. ## Independent verification and limitations On 2026-09-06, the 25 supplied tests passed locally. Reproduce from the repo root: ```powershell Push-Location 'docs/historical/research/2026-09-06-fork-gather/imported' try { python -B -m unittest -v test_fork_gather_reference.py } finally { Pop-Location } ``` Audit 2 explicitly labels its implementation a reconstruction: the scratch code claimed in audit 1 was not retained. The captured output is the author's record; the local test run is independent verification of the supplied code. Neither is a test of `wf_core`. The reference uses a single owner, append-only example contributions, deep-copied transitions, and trusted in-process pickle snapshots. It does not establish production codec validation, durable storage atomicity, arbitrary reducers, external-effect idempotency, foreach, subgraphs, or cancellation. Never load an untrusted pickle checkpoint. ## Known defects reproduced locally ### Repeated write execution collides ```text w: append X -> pick pick.again -> w pick.done -> END ``` `SymbolicAnalyzer` accepts this graph. Execute `w`, choose `again`, then execute `w` using the same token. `_write()` raises `RuntimeError: duplicate semantic contribution w@T0` because its ID uses only node and token identity, not the execution occurrence. This is a valid loop that the simulator must eventually execute correctly. ### Repeated gather occurrence is not rejected by analysis ```text g.a -> h.only -> pick pick.again -> h.only pick.done -> final.left g.b -> final.right final -> END ``` The supplied model permits one-port gathers. Analysis accepts the graph with both gather anchors set to `g`. Execute `g`, fire `h`, choose `again`, then fire `h` again: `_fire_gather_impl()` raises `RuntimeError: duplicate merged lineage merge:h@g@T0`. The analyzer tracks current tokens but not past firings under an unresolved anchor. The proposed one-fire-per-occurrence contract requires validation to reject this case. Banning one-port gathers would not prove the general rule. Both reproductions were executed independently during review. They are not included in the unchanged imported 25-test suite. Their regression requirements and the next verification gates live in the draft spec, not in this archive.