fix(service-settings): tell operators where @objectstack/knowledge-turso comes from instead of naming a package this repo does not build - #11319
Conversation
…rso comes from The knowledge settings manifest told an operator who selects the `turso` adapter in Settings -> AI & Embedder to "Mount @objectstack/knowledge-turso to exercise live calls." That package is in no directory of this repo, and the message said nothing about where it does come from, so the instruction was un-followable at the moment it is read. Measured against the public npm registry (2026-08-23) with @objectstack/spec and @objectstack/cli as positive controls and @objectstack/security-enterprise as a known-private negative control: @objectstack/knowledge-turso IS published, latest 6.9.0 (2026-05-27). So the adapter option stays. What it is not is co-installable with this platform version -- 6.9.0 exact-pins @objectstack/spec@6.9.0 while this repo ships 17.2.0. The runtime message now names the package, says this platform does not ship it, points at the ObjectStack Cloud monorepo where it is built, and tells the operator to check for a release matching their platform version. The adapter list comment loses the undated "currently published" claim and gains the measurement with its date and method. No behaviour change: ok and severity are untouched on every branch of the test action. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01APWX2AwT3a4xDcjPCe8bk4
📓 Docs Drift Check1 anchor(s) derived from 1 changed package(s); no hand-written page names any of them. ✅ What this run could not see
Coarse fallback — 7 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin fb8e5d0539e2a44e3a7c825940765fc64278357d && git checkout fb8e5d0539e2a44e3a7c825940765fc64278357d
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin e278a2970d2dbdb662db66dd61bc07264157fa51 7372c2101593838fb368392cf24da0982bca5cbe && git checkout -B drift-repro e278a2970d2dbdb662db66dd61bc07264157fa51 && git merge --no-ff 7372c2101593838fb368392cf24da0982bca5cbe
node scripts/docs-audit/affected-docs.mjs --json e278a2970d2dbdb662db66dd61bc07264157fa51 |
Correction — the probe command in the PR body lost its placeholder to the body sanitizerThe description presents the registry probe as a re-runnable method, and as rendered it is not runnable. It reads:
The package-name placeholder that followed The correct form is: — i.e. I am correcting this in a comment rather than editing the description: the body carries escaped entities throughout, and a full rewrite to fix one line risks mangling quoting elsewhere for no gain. The measurement itself is unaffected — only its printed spelling was damaged, not the result. I re-ran every registry claim in the body independently before flipping this PR ( Noting the general hazard, since this will recur: a command written into a PR body with an angle-bracket placeholder silently loses it, and what survives looks like a complete command rather than a truncated one — which is the bad failure mode. Use a bare word placeholder ( This does not affect the merge — a description edit or comment does not change the head SHA, and the PR stays queued on Generated by Claude Code |
Fixes #10920
The prior question, answered by measurement rather than assumed
The card turned on one prior fact and said so in its own body — is
@objectstack/knowledge-tursopublished anywhere? — so this branch begins with the measurement, not the edit.Absence in this repo, with a reverse control (on
f24c90df3d, the ref this branch was cut from):Identical command shape, so the zero is a fact about the package and not a broken pattern.
Publication, against the public npm registry (2026-08-23, unauthenticated
GET https://registry.npmjs.org/@objectstack%2F<name>— the method PR #11266 established, with the same control discipline):latest@objectstack/knowledge-turso@objectstack/spec@objectstack/cli@objectstack/security-enterprise@objectstack/knowledge-sqlite-vecThe answer: it IS published. So this PR takes the record-where-it-ships branch. Dropping the
tursoadapter option — the other branch the card offered — would have deleted a working adapter on the strength of a package not being in this directory tree, which is not the same claim.One thing the measurement adds that neither branch anticipated:
knowledge-turso@6.9.0exact-pins@objectstack/spec@6.9.0(alsocoreandservice-knowledgeat 6.9.0) while this repo ships 17.2.0. It is published, and it is not co-installable with this platform version — mounting it resolves a second@objectstack/specrather than reusing this one. An operator told only "mount it" walks into that.What changed
Two sites in
packages/services/service-settings/src/manifests/knowledge.manifest.ts, the two the card names.The runtime operator message (
:158) — the sharp one, spoken inside Settings → AI & Embedder. Before:After, it names the package, says this platform does not ship it, points at where it is built, and gives the operator the check to perform — the framework#3366 discipline that an install hint must carry its own edition/version boundary, applied here the way PR #11266 applied it to
@objectstack/organizations.The adapter-list comment (
:13-15) losesAdapter list mirrors the plugin packages currently published:— an undated, unowned claim that stopped being true with nothing to catch it — and gains the three-way split (built here / built here / NOT built here) plus the measurement above with its date and method, so the next reader can re-run it instead of inheriting it.No behaviour change.
okandseverityare untouched on every branch of the test action. Leavingseverity: 'info'as-is is deliberate: changing it is a change to what the Settings UI renders, which is outside what this card was graded for. Flagging it here rather than doing it.Tests
Two added to
knowledge.manifest.test.ts, pinned as properties, not literals, so the wording can improve without the guard going stale:Verified green on
7372c21015:(The package's
tsconfig.jsonisinclude: ["src"]with no test exclusion, and the test file lives undersrc/, sotsc --noEmitreally does read the new test code.)Local gate union derived with
node scripts/pm/dispatch-gates.mjs(no hand-supplied paths), run on7372c21015, exit codes captured before any pipe. All 18 green, each quoted from the gate's own verdict line — for example:check:type-check-debt(the 19th, which needs the whole workspace closure built first) is running as this PR is opened; its verdict is reported on the card.Scope
The
packages/spec/src/contracts/embedder.tshalf of the original finding — theIEmbedderdocblock namingknowledge-tursoandknowledge-sqlite-vec— is not touched here, per the scope fence on the card.#11318is not addressed here either: it is the sibling case filed out of this work, whereai.manifest.tsprints the same un-followable mount instruction for@objectstack/service-ai, a packagePLATFORM_CAPABILITY_PROVIDERSdeclaresedition: 'cloud'.A note for triage, since the unlock scan's condition pointed at it:
PLATFORM_CAPABILITY_PROVIDERSis present on this ref (PR #11266 merged asa2ec377078), but it does not answer this question in either direction. It is keyed byrequires:platform service capability tokens and contains no knowledge adapter at all — notknowledge-turso, and not the two this repo does build. Its silence here is category silence, so reading "absent from the roster" as "ships nowhere" would have produced the wrong repair. The registry measurement above is what actually answered it.Generated by Claude Code