Keyrxng

Practical Temporality (Part II): Repairing Time-Aware Semantic Recommendations

8/18/2025 ·

So what?
Part II of the 3-part series: turns the Part I diagnosis of temporal resistance into a concrete, minimal rollout plan—time decay, hybrid signals, availability filters, safer fallbacks, metrics, and guardrails.

Series context: Part I named the failure mode (“temporal resistance”). This post operationalizes the fix. The companion field note (“Semantic task matchmaking”) contains the raw observational narrative that sparked the investigation.

Executive summary

Part I showed how stale-yet-strong semantic vectors keep recommending absent contributors. Here we apply minimal force: add exponential time decay, integrate availability, blend lightweight activity signals, and enforce safer fallback semantics. We keep the vector DB untouched and layer temporal intelligence in a re-scoring step. A small A/B plus offline replay gives high confidence without risky rewrites.

Design contract (short)

Keep the contract small: the goal is to improve operational relevance without discarding semantic quality.

Core strategies (what to implement)

  1. Time-weighted similarity (low risk)
  1. Hybrid scoring with activity signals (medium risk)
  1. Contributor status & availability (high value)

Implementation detail (Ubiquity OS specificity): no contributor profile embeddings exist; retrieval is issue→similar issues→their assignees. Therefore: do not attempt to precompute contributor vectors for this iteration. Inject time-aware re-ranking and fallback logic after similar-issue expansion, treating contributors as derived candidates with attached metadata.

Implementation sketch (where to change code)

Minimal pseudocode:

  1. issue_vec = embed(issue_text)
  2. candidates = vector_db.search(issue_vec, top_n=50)
  3. for c in candidates:
    • base_sim = cosine(issue_vec, c.embedding)
    • days = days_since(c.last_activity)
    • adjusted = base_sim * exp(-λ * days)
    • final_score = mix(adjusted, recent_commits_norm, availability)
  4. return sort_by(final_score)[0:K]

The key is to do the re-scoring outside the vector DB and keep the DB layer simple and fast.

Experiment plan (A/B and metrics)

Metrics to monitor:

A/B framework:

Decision rule:

Edge cases and operational tradeoffs

Chunk granularity correction: in Ubiquity OS the unit of semantic matching is the issue body and title. Do not assume the system is embedding PR descriptions or code diffs — the code path fetches similar issues by cosine distance on their issue-level embeddings, then retrieves the developers who were assigned to those similar, completed issues. This distinction matters when designing decay and availability heuristics.

Vector footprint at scale — an illustrative example

Vector-space issues are not unique to this recommender; they appear anywhere you persist high-dimensional embeddings over long-lived text artifacts. Consider a hypothetical deployment to make the problem concrete:

That yields roughly 1,000 repos * 5 merges/month * 10 comments = 50,000 new comment-vectors per month. Over a year that’s ~600k vectors. If you also index issues, PR bodies, and other artifacts the count grows quickly into the millions.

If every vector is treated equally (no decay, no namespace-scoping, no filtering), then a cosine search from a user query can surface semantically similar items from any time period or any organization. In practice that creates multiple problems:

  1. Scope leakage: answers cross organizational boundaries and surface irrelevant or sensitive details from other orgs or old conversations.
  2. Performance & cost: large vector collections increase latency and storage costs; the nearest-neighbor index needs more memory and more expensive CPU/GPU cycles for high recall.
  3. Poisoning: without deduplication and pruning, spammy or low-quality historical comments remain and can dominate similarity results for common queries.
  4. Maintenance burden: fixing the index requires heavy pre- and post-processing (namespace sharding, reindexing, cluster pruning, dedupe, re-embedding after model updates) — each of which is expensive and error-prone at scale.

Mitigations you will need as soon as you cross tens to hundreds of thousands of vectors:

The bottom line: vector stores are powerful, but at scale they require deliberate engineering choices around indexing, decay, and pruning. The ghost problem in Ubiquity OS is a small demonstration of a broader operational reality: embeddings remember, organizations change, and without decay and scoping the result is an expensive and fragile search surface.

Deployment checklist

  1. Add a feature flag for temporal scoring.
  2. Implement the re-scoring module and unit tests for adjusted_similarity calculations.
  3. Instrument metrics (dormant recommendation percentage, acceptance, time-to-complete).
  4. Run offline replay: re-score historical issue-to-contributor queries and produce diffs.
  5. Start A/B test with a conservative λ and monitor.

Example: choosing λ and a safe threshold

Closing & forward path

Paradox restated: embeddings remember; organizations evolve. The pragmatic cure is not to discard semantic signal, but to contextualize it. A thin temporal layer—decay, availability, hybrid scoring, thresholded fallbacks—restores operational trust.

Longer horizon ideas: