From a23ad342b117402a800e05872a6415656eb1e728 Mon Sep 17 00:00:00 2001 From: bokiko Date: Wed, 18 Mar 2026 00:30:08 +0000 Subject: [PATCH] kyzn(deep): improve performance [run:20260318-002459-8eee8d4b] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Health: 96 → 96 (→0) Cost: $0.96201645 --- .kyzn/.gitignore | 3 +++ .kyzn/config.yaml | 35 +++++++++++++++++++++++++++++++++++ scripts/indexer.py | 27 +++++++++++++++++---------- 3 files changed, 55 insertions(+), 10 deletions(-) create mode 100644 .kyzn/.gitignore create mode 100644 .kyzn/config.yaml diff --git a/.kyzn/.gitignore b/.kyzn/.gitignore new file mode 100644 index 0000000..101f1a8 --- /dev/null +++ b/.kyzn/.gitignore @@ -0,0 +1,3 @@ +# kyzn — gitignored local data +history/ +reports/ diff --git a/.kyzn/config.yaml b/.kyzn/config.yaml new file mode 100644 index 0000000..c48c9b9 --- /dev/null +++ b/.kyzn/config.yaml @@ -0,0 +1,35 @@ +# kyzn configuration — commit this file +# Generated by: kyzn init +# Date: 2026-03-18T00:24:58Z + +project: + name: bloxcue + type: generic + +preferences: + mode: +How aggressive should improvements be? + 1) Deep — real improvements only (no cosmetic changes) + 2) Clean — dead weight cleanup (remove unused code, fix naming) + 3) Full — everything (maximum value per run) + +Choice [1]: 1 + budget: Budget per run (USD) [2.50]: 2.50 + max_turns: 30 + diff_limit: 2000 + trust: +Trust level for auto-merging? + 1) Guardian — always create PR, always wait for approval (recommended) + 2) Autopilot — auto-merge if build passes + tests pass + diff < threshold + +Choice [1]: 1 + on_build_fail: +If the build breaks after improvements, what should kyzn do? + 1) Write a report explaining what happened (recommended) + 2) Silently discard the branch + 3) Create a draft PR so you can see what was attempted + +Choice [1]: 1 + +focus: + priorities: [] diff --git a/scripts/indexer.py b/scripts/indexer.py index a803459..c9de44c 100755 --- a/scripts/indexer.py +++ b/scripts/indexer.py @@ -822,8 +822,10 @@ def load_index() -> Dict: _index_cache = json.loads(INDEX_FILE.read_text()) _index_mtime = current_mtime return _index_cache - except Exception: - pass + except (OSError, json.JSONDecodeError) as e: + print(f"[bloxcue] Warning: failed to load index cache ({e}), rebuilding", file=sys.stderr) + except Exception as e: + print(f"[bloxcue] Warning: unexpected error loading index ({e}), rebuilding", file=sys.stderr) return build_index() @@ -955,12 +957,15 @@ def search(query: str, limit: int = 5) -> List[Dict]: # Bigram bonus (phrase matching) entry_bigrams = entry.get("bigrams", []) + entry_bigrams_set = set(entry_bigrams) for qbigram in query_bigrams: - for ebigram in entry_bigrams: - if qbigram == ebigram: - score += 5.0 - elif qbigram in ebigram or ebigram in qbigram: - score += 2.5 + if qbigram in entry_bigrams_set: + score += 5.0 + else: + for ebigram in entry_bigrams: + if qbigram in ebigram or ebigram in qbigram: + score += 2.5 + break # Fuzzy fallback: catch matches that BM25 missed (typos, partial matches) if score == 0: @@ -1027,6 +1032,7 @@ def search(query: str, limit: int = 5) -> List[Dict]: # MMR diversity: reduce redundancy in top results if len(results) > 1: selected = [results[0]] + selected_term_sets = [set(results[0]["entry"].get("keywords", []))] remaining = results[1:] while remaining and len(selected) < limit: @@ -1036,8 +1042,7 @@ def search(query: str, limit: int = 5) -> List[Dict]: for i, candidate in enumerate(remaining): cand_terms = set(candidate["entry"].get("keywords", [])) max_overlap = 0.0 - for sel in selected: - sel_terms = set(sel["entry"].get("keywords", [])) + for sel_terms in selected_term_sets: if cand_terms and sel_terms: union = len(cand_terms | sel_terms) if union > 0: @@ -1051,7 +1056,9 @@ def search(query: str, limit: int = 5) -> List[Dict]: best_mmr = mmr best_idx = i - selected.append(remaining.pop(best_idx)) + chosen = remaining.pop(best_idx) + selected.append(chosen) + selected_term_sets.append(set(chosen["entry"].get("keywords", []))) results = selected