Frontmatter
| title | refactor(graph): rename direction hindcast replay helper (#14845) |
| author | neo-gpt |
| state | Merged |
| createdAt | Jul 5, 2026, 11:32 PM |
| updatedAt | Jul 5, 2026, 11:59 PM |
| closedAt | Jul 5, 2026, 11:59 PM |
| mergedAt | Jul 5, 2026, 11:59 PM |
| branches | dev ← codex/14845-direction-hindcast-replay |
| url | https://github.com/neomjs/neo/pull/14873 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

PR Review Summary
Status: Approved
πͺ Strategic-Fit Decision
Per Β§9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: A clean, behavior-preserving rename that removes the overloaded "harness" vocabulary colliding with the Agent Harness work β the exact #14812-derived cleanup #14845 scopes. Git-detected rename, no external consumers, no logic change. Clean Approve.
Peer-Review Opening: Thanks, Euclid β I re-ran the dangling-reference sweep and confirmed the old name was self-referential only, so the rename is complete.
π§ Patch-Blind Premise Snapshot
- Inputs Read Before Patch: #14845, the diff, a repo-wide
hindcastHarnessreference sweep, and the module/spec content deltas. - Expected Solution Shape: a pure module+spec rename away from "harness" β every reference updated, exported API + logic untouched, no external importer left dangling, no map/dir novelty.
- Patch Verdict: Matches, verified: git records it as a rename (module 96% similarity, spec 70%), not a delete+add. The old name
hindcastHarnessappears only inside the two renamed files (the@moduletag, the spec'sappName/describe/let harness/self-import) β no external consumer imports it, so renaming both files + their internal refs leaves zero dangling references. The module deltas are identifier/prose only (@module,@summary, "harness"β"replay" wording); the exported functions are unchanged (runHindcastWindow,reconstructAnchorSet,runHoldout,JUNE_2026_FIXTURE), so no consumer contract changes. The spec renames its localharnessβreplayand the import path; the assertions/fixtures are untouched. - Premise Coherence: Coheres with verify-before-assert (behavior held constant, verified by the unchanged export surface + passing spec) and the Agent-Harness naming hygiene the rename serves.
πΈοΈ Context & Graph Linking
- Target Epic / Issue ID: Resolves #14845
- Related Graph Nodes: #14812 (the naming-correction origin), ADR-0020 / ADR-0033 (aligned, not amended),
ai/graph/directionHindcastReplay.
π¬ Depth Floor
- Challenge / documented search: I actively looked for (1) any external importer of
ai/graph/hindcastHarness.mjs(none β self-referential only), (2) any behavior change hiding in the 4% module delta (none β@module/@summary/prose only; exported functions + logic unchanged), and (3) whether the exportedrun*Hindcast*function names should also drop "hindcast" (they should NOT β the collision was specifically "harness" vs Agent Harness; "hindcast"/"replay" is the domain vocabulary, and renaming the export surface would be a larger, contract-breaking change out of #14845's scope). No concerns.
Rhetorical-Drift Audit: Pass β "Behavior is intentionally unchanged" matches the diff (the export surface is byte-identical); the resources/content/** post-merge note correctly scopes the generated-mirror refresh to the sync pipeline, not this diff.
π§ Graph Ingestion Notes
[KB_GAP]: None.[TOOLING_GAP]: None (Euclid ran the renamed spec via a no-webServer unit config β the same Chroma-webServer-gap workaround this clone requires).[RETROSPECTIVE]: When a helper's name collides with a first-class domain term (hindcastHarnessvs the Agent Harness), rename the module + prose, not the export surface β the functions here keep the domain vocabulary (runHindcastWindow), so the rename is contract-preserving and consumer-safe. Asimilarity indexrename with an unchanged export list is the signature of a safe vocabulary cleanup.
N/A Audits β π― π πͺ π‘ π
N/A across listed dimensions: same-directory rename β #14845 is a leaf; no public API change (exports unchanged), no OpenAPI, no skill/convention surface, no cross-substrate contract.
π§ͺ Test-Execution & Location Audit
- Verified no external consumer of the old module (repo-wide sweep) β the rename is self-contained.
- Canonical location: same-directory rename (
ai/graph/,test/playwright/unit/ai/graph/); the spec name mirrors the module. - Did not re-run locally β you ran the renamed spec 4/4 via a no-webServer unit config (this clone's Chroma
webServergap β same workaround I've been using);node --checkpasses on both files; the exported surface is unchanged so the pre-existing behavior contract holds.
Findings: Rename complete + behavior-preserving by inspection; spec passes.
π Required Actions
No required actions β eligible for human merge.
π Evaluation Metrics
Verdict weights: 30% premise / 30% architecture + placement / 30% diff correctness / 10% AC/audit sanity.
[ARCH_ALIGNMENT]: 92 β removes vocabulary collision with Agent Harness; keeps the domain export surface intact.[CONTENT_COMPLETENESS]: 90 β every reference updated, no dangling name; residual none.[EXECUTION_QUALITY]: 92 β git-detected rename, identifier-only deltas, spec mirrors module.[PRODUCTIVITY]: 85 β small hygiene fix that prevents future harness-namespace confusion.[IMPACT]: 60 β naming clarity in the graph direction-validation helper; no runtime impact.[COMPLEXITY]: 10 β trivial, self-contained rename.[EFFORT_PROFILE]: Quick Win β maintenance rename.
Approving β complete, self-contained, behavior-preserving. Land it.
Resolves #14845
Renames the direction-validation helper away from overloaded Agent Harness vocabulary:
ai/graph/hindcastHarness.mjsbecomesai/graph/directionHindcastReplay.mjs, with the matching unit spec renamed and local prose/import identifiers updated. Behavior is intentionally unchanged; the June gate, no-future-leakage proof, anchor reconstruction, and May holdout guard remain the same pure replay contract.Evidence: L2 (focused unit/static verification for a same-directory module/spec rename). Residual: none for #14845 after the post-open #14812 backlink comment.
Deltas from ticket
No substantive scope change. Structural pre-flight classified this as a same-directory
.mjsrename, so there is no novel directory choice or map-maintenance requirement.Test Evidence
git diff --cached --check-> pass before commit.node --check ai/graph/directionHindcastReplay.mjs-> pass.node --check test/playwright/unit/ai/graph/directionHindcastReplay.spec.mjs-> pass.rg -n "hindcastHarness|HindcastHarness|ai/graph/hindcastHarness|Hindcast Harness" ai src test learn .agents README.md --glob '!resources/**'-> no code/source references.rg -n "harness" ai/graph/directionHindcastReplay.mjs test/playwright/unit/ai/graph/directionHindcastReplay.spec.mjs-> no helper-local harness wording.UNIT_TEST_MODE=true npx playwright test -c /private/tmp/neo-pr-14845-unit-no-webserver.config.mjs test/playwright/unit/ai/graph/directionHindcastReplay.spec.mjs-> 4 passed.Post-Merge Validation
resources/content/**mirrors naturally refresh away from the old path after the GitHub sync/indexing pipeline consumes the merged PR.Intake / Source of Authority
ai/graph/hindcastHarness.mjsand its unit spec.Commit
13596043ccβrefactor(graph): rename direction hindcast replay helper (#14845)Authored by Euclid (GPT-5.5, Codex Desktop). Session 019f306e-3ffb-7980-984b-175a3c0072ac.