Files
OmniRoute/tests/unit/release-cycle-base-resolver.test.ts
Praveen K Palaniswamy 65e81158ab fix(ollama): route models by advertised capability (#11088)
Landed with the design call resolved per the owner's pick — **option 1**: the synced store is now endpoint-agnostic (persistDiscoveredModels and managedModelImport no longer drop non-chat models at write time), and chat selectability moved to read time (auto-pool expansion in autoStrategy applies filterChatSelectableModels; the models-route projection already had its chatOnly filter). Your discovery test now passes end-to-end (3/3): /api/show capabilities persist per connection and image/embedding requests route through the advertising host.

Reconciliation notes: conflicted areas merged onto the current tip (adobe discovery import, requestedModel preflight signature, resolvedProvider fast-path coexists with the synced-route override — explicit resolution wins); carried base-red drains (#10055 memoization, #11071 test variants) dropped as already-landed; the managed-model-import exclusion test was propagated to the new contract (image/video models persist; the read filter still hides them from chat pickers — pinned by a new assertion). Full battery: 205/206 focused (the one red is a confirmed periodic-timer timing flake on the loaded devbox — 20/20 isolated), autoCombo vitest 30/30, combo suites 46/46, gates + typecheck clean.

Thank you @yourspraveen — the capability probe + routing design was right; it just needed the store contract opened up. Fixes #11087.
2026-08-23 11:45:01 -03:00

121 lines
4.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* Guard for the reconciliation range base.
*
* `list-uncovered-commits.mjs` used `git describe --tags` to bound the range it scans. That
* is wrong here in a way that hides work instead of announcing itself: releases reach `main`
* by SQUASH, so no commit on a release branch is ever an ancestor of the tag, and
* `vPREV..HEAD` re-lists the un-squashed history of every earlier cycle.
*
* Measured on release/v3.8.50 @ 7eca04fd12:
*
* v3.8.49..HEAD ....... 1361 commits
* cycle open..HEAD ..... 22 commits
*
* 62× the real range. The report drowns, which is how a previous reconciliation let ~200 PRs
* through with no CHANGELOG bullet.
*
* The base is now resolved by CONTENT — the oldest commit that introduced this version string
* into package.json — because the commit SUBJECT has already changed format once:
*
* chore(release): bump v3.8.49 (development cycle version) ← older
* chore(release): open v3.8.50 development cycle ← current
*
* A message-matching resolver would have silently fallen back to the broken tag base the
* first time someone reworded the bump. These tests pin the content strategy and, just as
* importantly, pin that the fallback is LOUD.
*/
import test from "node:test";
import assert from "node:assert/strict";
// @ts-expect-error — plain .mjs release script, no type declarations by design
import { resolveCycleBase } from "../../scripts/release/list-uncovered-commits.mjs";
/** Build a fake `git` that answers by matching on the argv it receives. */
function fakeGit(answers: Record<string, string>) {
const calls: string[][] = [];
const run = (args: string[]) => {
calls.push(args);
if (args[0] === "log") return answers.log ?? "";
if (args[0] === "describe") {
if (answers.describe === undefined) throw new Error("no tags");
return answers.describe;
}
return "";
};
return { run, calls };
}
test("resolves the base to the OLDEST commit carrying this version", () => {
// `git log -S` lists newest-first. The cycle opened at the oldest hit — a later commit that
// merely touched the same line (a merge, a revert) must not win.
const { run } = fakeGit({ log: "ffffffffff\nbbbbbbbbbb\naaaaaaaaaa" });
const r = resolveCycleBase("3.8.50", run);
assert.equal(r.base, "aaaaaaaaaa");
assert.equal(r.source, "cycle-open");
});
test("searches package.json for the version string, not the commit subject", () => {
const { run, calls } = fakeGit({ log: "aaaaaaaaaa" });
resolveCycleBase("3.8.50", run);
const logCall = calls.find((c) => c[0] === "log");
assert.ok(logCall, "must ask git log");
assert.ok(logCall.includes("-S"), "must use -S (content search), not --grep");
assert.ok(
logCall.some((a) => a === '"version": "3.8.50"'),
"must search for the exact package.json version line"
);
assert.ok(logCall.includes("package.json"), "must scope the search to package.json");
assert.ok(
!logCall.some((a) => a === "--grep"),
"must NOT match on the commit subject — the wording changed once already"
);
});
test("a single hit still resolves (the common case: cycle just opened)", () => {
const { run } = fakeGit({ log: "ed2db6cb19" });
assert.deepEqual(resolveCycleBase("3.8.50", run), {
base: "ed2db6cb19",
source: "cycle-open",
});
});
test("falls back to the tag LOUDLY when the cycle-open commit cannot be found", () => {
const { run } = fakeGit({ log: "", describe: "v3.8.49" });
const written: string[] = [];
const realWrite = process.stderr.write.bind(process.stderr);
// @ts-expect-error — narrowing the write signature for the assertion is not worth it here
process.stderr.write = (chunk: string) => {
written.push(String(chunk));
return true;
};
try {
const r = resolveCycleBase("3.8.50", run);
assert.equal(r.base, "v3.8.49");
assert.equal(r.source, "tag-fallback");
} finally {
process.stderr.write = realWrite;
}
const msg = written.join("");
assert.match(msg, /WARNING/, "a silent fallback would reproduce the original bug");
assert.match(msg, /squash/i, "the warning must say WHY the tag range is untrustworthy");
assert.match(msg, /noise/i, "and what the operator will see because of it");
});
test("survives a repo with neither the version commit nor any tag", () => {
// Shallow clone: both lookups fail. It must degrade, not throw.
const run = (args: string[]) => {
if (args[0] === "log") throw new Error("shallow");
throw new Error("no tags");
};
const realWrite = process.stderr.write.bind(process.stderr);
// @ts-expect-error — see above
process.stderr.write = () => true;
try {
const r = resolveCycleBase("3.8.50", run);
assert.equal(r.source, "tag-fallback");
assert.equal(r.base, "");
} finally {
process.stderr.write = realWrite;
}
});