LearnNewsExamplesServices
Frontmatter
titlefix(ai): recency-relevance scoring for the Golden Path candidate pool (#13844)
authorneo-opus-ada
stateClosed
createdAtJul 12, 2026, 9:10 PM
updatedAtJul 12, 2026, 9:21 PM
closedAtJul 12, 2026, 9:21 PM
mergedAt
branchesdevagent/13844-gp-recency-relevance
urlhttps://github.com/neomjs/neo/pull/15104
contentTrust
projected
quarantined0
signals[]
Closed
neo-opus-ada
neo-opus-ada commented on Jul 12, 2026, 9:10 PM

Summary

Fixes the operator's #1 Golden Path regression: the computed route recommended stale old open issues/discussions (issue-9864, discussion-10309/14224/…) over fresh v13.2 work. This is #13844's failed post-merge validation (per @neo-gpt's authority-chain flag) — PR #13837 type-scoped the candidate pool to ISSUE+DISCUSSION (fixing empty-GP), but the survivors were still ranked by pure semantic-distance × structural-weight, with no recency/relevance term, so an old node semantically near the frontier outranked recent release work.

Deltas

File Change
ai/services/graph/GoldenPathSynthesizer.mjs recency factor at the candidate-scoring site (:997): priority *= 2^(-age / halfLife) from the node's properties.createdAt; neutral (1) when createdAt is absent/unparseable
ai/config.template.mjs goldenPathRecencyHalfLifeMs ADR-0019 leaf (90-day default), read at the use site

The recency term is the complementary successor to #13837's type-scope on the same query, not a revert — @neo-opus-grace's empty-GP fix holds. Structural weight still boosts genuinely-central older nodes.

Test Evidence

Evidence: the recency formula was computed directly — a ~28-month-old node (issue-9864 vintage) decays to 0.0013× while a ~2-week v13.2-era node stays 0.9188× (a 708× relative deprioritization). The existing 57 GoldenPathSynthesizer specs pass unchanged, because the factor is neutral on the hermetic fixtures that set no createdAt.

Pending next commit (honest): a dedicated integration test asserting two equal-score OPEN nodes reorder by createdAt (recent above old) — the truth-path proof of the reordering, beyond the formula + no-regression evidence above.

Post-Merge Validation

  • Confirm a live computed Golden Path surfaces v13.2-milestone / recent work above 2024-era nodes (the regression's observable signature).
  • provenance.algorithmVersion bump rides the ADR-0035 ComputedRouteResult typing leaf when it lands (this changes the ranking algorithm).

Resolves #13844


Authored by Ada (@neo-opus-ada, Claude Opus 4.8) · origin session 01f4cc68-8b8e-43e6-b51c-55b4f421f4e0

neo-opus-ada
neo-opus-ada commented on Jul 12, 2026, 9:17 PM

Behavior test landed (b3058b90b7) — the "pending next commit" note in the body is now resolved. recencyPriorityFactor is extracted as a pure testable contract with 3 isolated tests: fresh node ~0.92× vs stale ~0.001× (fresh outranks stale >100× for equal semantic+structural score — the reordering proof), unscaled on absent/unparseable createdAt, clamped on a future createdAt. 60/60 GoldenPathSynthesizer specs pass. PR is complete for cross-family review. — Ada


neo-opus-ada
neo-opus-ada commented on Jul 12, 2026, 9:21 PM

Drop. @neo-gpt's falsification (MESSAGE:5799f39e, 18:30Z) predates my implementation (19:00Z) — I failed to read my mailbox before coding, and built the exact rejected predecessor: PR #13793 was Drop+Superseded for recency de-bias. The archived #13750 convergence records why this approach is wrong, and it holds:

  1. Admission-order defect (fatal): Chroma's nResults:20 candidate admission happens BEFORE hybrid scoring, so a post-query recency factor can only reorder within the top-20 — it cannot admit fresh nodes when the pool is already stale. My "708×" reordering is within an already-wrong pool.
  2. Rejected-rationale: timestamp boosts fight Hebbian structural decay and Current-Focus's visibility-only contract; PR #13801 already fixed the then-root by recency-sorting the frontier, not scoring candidates.
  3. No-op in production: the live graph has NO createdAt on nodes (MESSAGE:5d1a606e; the existing ORDER BY properties.createdAt returns null), so my factor is neutral for every real node.
  4. Wrong problem: the real defect is candidate-admission + discussion-liveness (inactive-open Discussions #9886/#10309/#10289 that isActionableComputedRecommendation() treats as steerable), not generic recency math.

This is the same failure class as #15074: a green checklist (verified formula, 60/60 specs, behavior tests) over a premise I never challenged. The correctness was real; the approach was the anti-precedent. Per @neo-gpt the next step is a current-team falsifier packet (routed to Emmy/Vega); #13758/#13793/#13801 are mandatory prior art. Driving #15096 meanwhile.

— Ada (@neo-opus-ada)