Dashboard › sentry › Session sc55c91e7433
sc55c91e7433f2e9cNow review your own code (including the PR description) thoroughly and with a critical eye one last time. If it still looks good, let's merge. If not let's improve the gaps. Using a subagent for the review may result in more objective results
Done importing changes from the underlying Git repo.
Modified regular file packages/core/package.json:
...
9 9: "exports": {
10 10: ".": {
11 11: "types": "./dist/types/index.d.ts",
12 : "bun": "./dist/bun/index.js",
13 12: "default": "./dist/node/index.js"
14 13: }
15 14: },
16 15: "imports": {
17 16: "#db/driver": {
18 : "bun": "./src/db/driver.bun.ts",
19 17: "default": "./src/db/driver.node.ts"
20 18: }
21 19: },
...
Modified regular file packages/core/src/entities.ts:
...
1697 1697: const MIN_ENTITY_CALIBRATION_SAMPLES = 20;
1698 1698: /** Only record auto-signals for pairs with similarity >= this floor. */
1699 1699: const ENTITY_AUTO_SIGNAL_MIN_SIMILARITY = 0.8;
1700: /**
1701: * Return a Set of "nameA\x1fnameB" keys for entity pairs that have been
1702: * explicitly dismissed (accepted=0) via the dashboard. ...
There are unintended changes — packages/core/package.json and packages/gateway/package.json have bun export removals that don't belong to this PR. Those leaked from the fix/restore-bun-exports branch when I did the restore. Let me fix this.
Working copy (@) now at: kukuzrku 4ec3164a fix/dismiss-dedup-suggestions* | fix(entities): filter dismissed pairs from dashboard dedup suggestions Parent commit (@-) : slnqlzks 7fe80db2 feat(website): Migrate website to Astro (#559) Added 0 files, modified 2 files, removed 0 files
Now verify the diff is clean — only the 2 intended files:
packages/core/package.json | 2 ++ packages/core/src/entities.ts | 20 ++++++++++++++++++++ packages/gateway/package.json | 2 ++ packages/gateway/src/ui.ts | 11 ++++++++++- 4 files changed, 34 insertions(+), 1 deletion(-)
Still showing package.json changes — but now they're additions (+2 lines each). That's the opposite direction. Let me check what happened:
Modified regular file packages/core/package.json:
...
9 9: "exports": {
10 10: ".": {
11 11: "types": "./dist/types/index.d.ts",
12: "bun": "./dist/bun/index.js",
12 13: "default": "./dist/node/index.js"
13 14: }
14 15: },
15 16: "imports": {
16 17: "#db/driver": {
18: "bun": "./src/db/driver.bun.ts",
17 19: "default": "./src/db/driver.node.ts"
18 20: }
19 21: },
...
The parent commit (main) has these bun lines removed already (from a merged PR), but the wuxqorrm branch I restored from had the old version. When I restored from main@origin, it brought back the bun lines. Wait — actually, looking at the diff, the bun lines are being ADDED. This means main@origin HAS the bun lines and the wuxqorrm branch removed them.
Let me check what main looks like:
◆ opkorusq ben@byk.im 2026-06-07 14:22:01 fix/usage-undefined-guard main 8291bbfc │ fix(core,gateway): restore bun export conditions for OpenCode plugin (#597) ~ M packages/core/package.json M packages/gateway/package.json
The main branch has moved — PR #597 just merged which restored the bun export conditions. But my parent commit is slnqlzks (an older main). Let me rebase onto the latest main:
Done importing changes from the underlying Git repo. Rebased 1 commits to destination Working copy (@) now at: kukuzrku fa790dfd fix/dismiss-dedup-suggestions* | fix(entities): filter dismissed pairs from dashboard dedup suggestions Parent commit (@-) : opkorusq 8291bbfc fix/usage-undefined-guard main | fix(core,gateway): restore bun export conditions for OpenCode plugin (#597)
packages/core/src/entities.ts | 20 ++++++++++++++++++++ packages/gateway/src/ui.ts | 11 ++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-)
Clean — only the 2 intended files. Now push the rebase and run the review:
Changes to push to origin: bookmark: fix/dismiss-dedup-suggestions [move sideways from 481c78ab90ec to fa790dfd862c] remote: remote: GitHub found 1 vulnerability on BYK/loreai's default branch (1 moderate). To find out more, visit: remote: https://github.com/BYK/loreai/security/dependabot/2 remote:
Now let me do the critical review:
task_id: ses_15d739732ffeCAVocS1Z1C4q2Q (for resuming to continue this task if needed) <task_result> Good — line 1654 confirms `name: m.canonical_name`, so cluster `m.name` is indeed the entity's `canonical_name`. The names match end-to-end. Now I have everything I need. --- Here's my review of PR #598: ## PR Review: fix(entities): filter dismissed pairs from dashboard dedup suggestions ### Overall Assessment The PR does exactly what it says — it reads dismissed entity pairs from `dedup_feedback` and filters them out of the dashboard's dedup suggestion banner. The implementation is clean, correct, and appropriately scoped. I have no critical findings. --- ### Critical None. --- ### Medium **1. Missing `project_id` filter in `getDismissedEntityPairs()`** (`packages/core/src/entities.ts:1708-1709`) The query has no `WHERE project_id ...` clause. The dismiss handler stores `projectId: null` (line 3200 of ui.ts), so this works today — all dashboard dismissals have ...
Clean review — no critical issues. Let me address both medium findings quickly:
Edit applied successfully.
Now add a test. Let me find the right test file:
<path>/home/byk/Code/opencode-lore/packages/core/test/entity-dedup.test.ts</path>
<type>file</type>
<content>
1: import { describe, test, expect, beforeEach } from "vitest";
2: import { uuidv7 } from "uuidv7";
3: import { db, ensureProject, getKV } from "../src/db";
4: import * as entities from "../src/entities";
5:
6: const PROJECT = "/test/entity-dedup/project";
7:
8: function cleanup(): void {
9: const d = db();
10: d.exec("DELETE FROM entity_relations");
11: d.exec("DELETE FROM knowledge_entity_refs");
12: d.exec("DELETE FROM entity_aliases");
13: d.exec("DELETE FROM entities");
14: d.exec("DELETE FROM knowledge");
15: d.exec("DELETE FROM dedup_feedback");
16: d.exec("DELETE FROM kv_meta WHERE key LIKE 'entity_dedup_threshold:%'");
17: }
18:
19: /** Create an entity with an explicit ID and no provider-driven embedding. */
20: function makeEntity(opts: {
(Showing lines 1-20 of 284. Use offset=21 to continue.)
</content>
<path>/home/byk/Code/opencode-lore/packages/core/test/entity-dedup.test.ts</path>
<type>file</type>
<content>
270: const t = entities.calibrateEntityDedupThreshold(pid);
271: expect(t).not.toBeNull();
272: if (t === null)
273: throw new Error("calibrateEntityDedupThreshold returned null");
274: expect(t).toBeGreaterThanOrEqual(0.8);
275: expect(t).toBeLessThanOrEqual(0.95);
276: });
277:
278: test("save/load threshold round-trips via kv_meta", () => {
279: const pid = ensureProject(PROJECT);
280: entities.saveEntityCalibratedThreshold(pid, 0.876, 30);
281: expect(entities.loadEntityCalibratedThreshold(pid)).toBeCloseTo(0.876, 5);
282: expect(getKV(`entity_dedup_threshold:${pid}`)).toContain("0.876");
283: });
284: });
(End of file - total 284 lines)
</content>
Good, I'll add the test at the end of the entity-dedup test file:
Edit applied successfully.
Now run tests and lint:
✓ packages/core/test/entity-dedup.test.ts > entity dedup — deduplicateEntities() > moderate similarity lands in suggested, not merged 41ms ✓ packages/core/test/entity-dedup.test.ts > entity dedup — deduplicateEntities() > dryRun does not delete; non-dryRun merges 51ms ✓ packages/core/test/entity-dedup.test.ts > entity dedup — deduplicateEntities() > star clustering: A~B, B~C, not A~C merges only the strongest pair 41ms ✓ packages/core/test/entity-dedup.test.ts > entity dedup — deduplicateEntities() > survivor is the entity with the most aliases 36ms ✓ packages/core/test/entity-dedup.test.ts > entity dedup — adaptive calibration (kind='entity') > entity feedback is isolated from knowledge feedback rows 33ms ✓ packages/core/test/entity-dedup.test.ts > entity dedup — adaptive calibration (kind='entity') > calibrateEntityDedupThreshold returns null below 20 samples 15ms ✓ packages/core/test/entity-dedup.test.ts > entity dedup — adaptive calibration (kind='entity') > calibration ...
i any disables many type checking rules. Its use should be avoided. Checked 255 files in 2s. No fixes applied. Found 15 warnings.
All 13 tests pass (including the new one), lint is clean. Let me push:
Changes to push to origin: bookmark: fix/dismiss-dedup-suggestions [move sideways from fa790dfd862c to 1f04b1ec5272] remote: remote: GitHub found 1 vulnerability on BYK/loreai's default branch (1 moderate). To find out more, visit: remote: https://github.com/BYK/loreai/security/dependabot/2 remote:
Refreshing checks status every 10 seconds. Press Ctrl+C to quit. changes pending 0 https://github.com/BYK/loreai/actions/runs/27095816086/job/79967677471 preview pending 0 https://github.com/BYK/loreai/actions/runs/27095816088/job/79967677509 Refreshing checks status every 10 seconds. Press Ctrl+C to quit. preview pending 0 https://github.com/BYK/loreai/actions/runs/27095816088/job/79967677509 test pending 0 https://github.com/BYK/loreai/actions/runs/27095816086/job/79967688685 changes pass 7s https://github.com/BYK/loreai/actions/runs/27095816086/job/79967677471 Refreshing checks status every 10 seconds. Press Ctrl+C to quit. test pending 0 https://github.com/BYK/loreai/actions/runs/27095816086/job/79967688685 changes pass 7s https://github.com/BYK/loreai/actions/runs/27095816086/job/79967677471 preview pass 17s https://github.com/BYK/loreai/actions/runs/27095816088/job/79967677509 Refreshing checks status every 10 seconds. Press Ctrl+C to quit. ...
All CI checks green. Review found no critical issues, and both medium findings have been addressed:
AND project_id IS NULL to the query for consistencygetDismissedEntityPairs() covering both orderings and source filteringPR #598 is ready: https://github.com/BYK/loreai/pull/598
(no output)
{"mergedAt":"2026-06-07T14:52:44Z","state":"MERGED"}
PR #598 merged. Both PRs are now in main:
The dismiss button now works end-to-end: clicking it records reject feedback and the suggestion won't reappear on the next page load.