Skip to content

fix(docs-site): write search-index.json one entry per line - #1794

Merged
murdore merged 1 commit into
releasefrom
fix/search-index-one-entry-per-line
Sep 26, 2026
Merged

murdore merged 1 commit into
releasefrom
fix/search-index-one-entry-per-line

Conversation

@murdore

@murdore murdore commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

What

Writes docs-site/static/search-index.json one entry per line instead of as a single 8.5 MB line. The data doesn't change: the file parses to the same 11,042 entries as release.

Why

The index is committed and every docs change regenerates it. As a single line, any two open PRs that touched docs conflicted on the whole file, whatever pages they edited. On 2026-09-25, 14 of the 24 open PRs showed a conflict, and for most of them this file (plus docs/api pages) was the only one. That forced a rebase after every merge.

#1763 made entry ids stable per URL and the traversal order fixed, so an unchanged page now produces an unchanged entry. Writing one entry per line turns that into unchanged lines, so git can merge two PRs that edit different pages.

Proof

Real three-way merge of two regenerated indexes, one editing the DeepSeek provider page and one the HuggingFace page:

writer git merge-file merged == fresh build with both edits
one line (before) 1 conflict no
one entry per line (this PR) clean byte-identical
  • docs-site/scripts/test-search-index-reproducibility.cjs now asserts exactly that. It passes here, and fails with the one-line writer restored.
  • test:docs-mcp 3/3: the docs MCP server loads the new file.
  • Two consecutive docs-site builds give byte-identical output, so the "Generated artifacts are current" check stays deterministic.
  • Readers (push-algolia-index.js, the docs MCP server) all JSON.parse the file, so the layout is invisible to them.

Summary by CodeRabbit

  • Bug Fixes
    • Search index updates for separate pages can now merge cleanly, reducing the chance of conflicts when changes are combined.
    • Regenerated indexes are checked against a fresh index containing both page edits, helping ensure combined search updates remain consistent.

@github-actions

github-actions Bot commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

✅ Single Commit Policy - COMPLIANT

Status: Policy requirements met • 1 commit • Valid format • Ready for merge

📊 View validation details

📝 Commit Details

  • Hash: 0eabcc5eff24c88aab6f7dfab53720b497bf9107
  • Message: fix(docs-site): write search-index.json one entry per line
  • Author: Sachin Sharma

✅ Validation Results

  • Single commit requirement met
  • No merge commits in branch
  • Semantic commit message format verified
  • Ready for squash merge to release branch

🤖 Automated validation by NeuroLink Single Commit Enforcement

@coderabbitai

coderabbitai Bot commented Sep 25, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

Important

Review skipped

We couldn't safely recover the incremental review. No full review was started, and the last reviewed checkpoint was preserved. Retry later, or explicitly request a full review by commenting @coderabbitai full review.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository: juspay/neurolink/.coderabbit.yaml

Review profile: CHILL

Plan: Advanced

Run ID: 2c010a79-236d-4f64-8bbb-2f90d1d957c0

📥 Commits

Reviewing files that changed from the base of the PR and between 8521098 and 3249238.

📒 Files selected for processing (3)
  • docs-site/plugins/docusaurus-plugin-search-index/index.js
  • docs-site/scripts/test-search-index-reproducibility.cjs
  • docs-site/static/search-index.json

Included review availability: This review used your included allowance. Your plan provides up to 2 included reviews per hour; 1 remain after this review.


📝 Walkthrough

Walkthrough

The search index is now written as a multiline JSON array, with one document per line. The reproducibility script tests whether indexes generated from separate page edits merge to match an index generated with both edits.

Changes

Search Index Serialization and Reproducibility

Layer / File(s) Summary
Serialize the index and verify merge output
docs-site/plugins/docusaurus-plugin-search-index/index.js, docs-site/scripts/test-search-index-reproducibility.cjs
generateIndex writes each serialized document on its own line. The reproducibility test uses git merge-file to merge indexes generated from separate page edits, then checks the result against an index generated with both edits.

Priority: ⬇️ Low

Estimated code review effort: 2 (Simple) | ~10 minutes

Change: Refactor

Merge Risk: ⚪ Minimal · up to 32492

The index remains compatible with search readers, and the merge test exercises the intended independent page edits. No merge-blocking issue remains.

Architecture Summary

Architecture risk: 🔵 Low · up to 32492

The change affects 1 system.

Changed systems: docs-site

Architecture concerns
No architecture-level concerns identified.

Review details

Systems and components

  • observed — docs-site (service) was modified; 2 changed files map to changed impact.

Before / after behavior

  • observed — Modified behavior in docs-site/plugins/docusaurus-plugin-search-index/index.js: generateIndex now writes the documents as a multiline JSON array, with each document serialized on its own line, instead of writing the entire array as compact JSON.
  • observed — Modified behavior in docs-site/scripts/test-search-index-reproducibility.cjs: Adds the spawnSync import from child_process for invoking Git in the merge test.
  • observed — Modified behavior in docs-site/scripts/test-search-index-reproducibility.cjs: Adds a three-way merge test: generate a base index and separate indexes for edits to each of two pages, then generate an index containing both edits. Run git merge-file -p on the separate indexes and base; assert the merge exits with status 0 and its output equals the index generated with both edits.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 2 functions across 2 files. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the main change: writing one search-index entry per line.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

Documentation Validation Results

🚀 Documentation validation passed!

Check Status Result
Frontmatter Validation ✅ Passed
TypeScript Check ✅ Passed
Build ✅ Passed
Link Validation ✅ Passed

📦 Build artifact uploaded successfully. Ready for deployment preview.

Commit: 74fde4d4d56e70a3d772a553600f2687c787c2dc | Workflow: View logs

@Tara-ag Tara-ag left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One-entry-per-line search-index layout is correct and well-covered. One MINOR nit inline; not blocking.

Comment on lines +206 to +210
const merge = spawnSync(
"git",
["merge-file", "-p", "first", "base", "second"],
{ cwd: mergeDir, encoding: "utf8" },
);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

MINOR — spawnSync("git", …) is not guarded for a missing/unusable git binary.

If git isn't on PATH (or the tmp dir isn't reachable as a work tree), spawnSync returns { status: null, error } and the very next assert.equal(merge.status, 0, …) fails on an unrelated, confusing message. Failing on the missing-tool condition directly makes the failure actionable. This test's premise is that git's three-way merge proves the merge-friendly layout, so surfacing the tool precondition is worth the 4 lines:

Suggested change
const merge = spawnSync(
"git",
["merge-file", "-p", "first", "base", "second"],
{ cwd: mergeDir, encoding: "utf8" },
);
const merge = spawnSync(
"git",
["merge-file", "-p", "first", "base", "second"],
{ cwd: mergeDir, encoding: "utf8" },
);
assert.ok(
merge.status !== null && merge.error === undefined,
`git merge-file unavailable: ${merge.error?.message ?? "not found on PATH"}`,
);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CORRECTION to the suggestion above. The earlier suggestion block was misanchored and, worse, it dropped the assert.equal(merge.status, 0, …) merge-conflict assertion that is the whole point of the test. Please use this corrected version instead.

It anchors to the spawnSync("git", …) call and inserts the guard after it, keeping the existing merge-status check intact:

Suggested change
const merge = spawnSync(
"git",
["merge-file", "-p", "first", "base", "second"],
{ cwd: mergeDir, encoding: "utf8" },
);
const merge = spawnSync(
"git",
["merge-file", "-p", "first", "base", "second"],
{ cwd: mergeDir, encoding: "utf8" },
);
assert.ok(
merge.status !== null && merge.error === undefined,
`git merge-file unavailable: ${merge.error?.message ?? "not found on PATH"}`,
);

With this, the original assert.equal(merge.status, 0, "edits to two different pages must merge the index without a conflict") on the next line still runs, and the missing-git case fails with an actionable message instead of a confusing merge.status mismatch.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Keeping this finding (recurring review, no author reply yet). The corrected suggestion above still stands as a MINOR, non-blocking improvement: when git is absent on PATH (or the tmp dir isn't usable as a work tree), spawnSync returns { status: null, error } and the following assert.equal(merge.status, 0, …) fails on an unrelated, confusing message. Adding the guard makes the tool-precondition failure actionable. No action required to merge — this is flagged for follow-up.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in #1894: the search-index reproducibility test now asserts that git merge-file could run (no spawn error) before it checks the exit status.

@Tara-ag

Tara-ag commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

Superseded — this summary was superseded by the recurring review. See the canonical review summary below (same verdict): comment 5841812208.

Verdict: APPROVE. Keeping only one summary comment per the PR-review protocol (no duplicated findings or summaries).

search-index.json is committed and every docs change regenerates it, but
it was written as a single 8.5 MB line. Git merges line by line, so any
two open PRs that touched docs conflicted on the whole file, however
unrelated their pages were. On 2026-09-25, 14 of the 24 open PRs showed a
conflict, and in most of them this file (with docs/api pages) was the
only conflict.

With the stable per-URL ids and sorted traversal from #1763,
an unchanged page now produces an unchanged line, so writing one entry per
line lets git merge two PRs that edit different pages. The data is
unchanged: the new file parses to the same 11,042 entries as the old one.

Checked with a real three-way merge of two regenerated indexes, one
editing the DeepSeek page and one the HuggingFace page:

  one line:        git merge-file reports 1 conflict
  entry per line:  no conflict, and the merged file is byte-identical to
                   a fresh build carrying both edits

test-search-index-reproducibility.cjs now asserts exactly that, and fails
on the one-line writer.
@murdore
murdore force-pushed the fix/search-index-one-entry-per-line branch from 3249238 to 0eabcc5 Compare September 26, 2026 00:56
@Tara-ag

Tara-ag commented Sep 26, 2026

Copy link
Copy Markdown
Contributor

Recurring review — overall: APPROVE ✅

I re-verified the change (fix/search-index-one-entry-per-line) directly: the graph diff is confined to docs-site/tools/search-index/index.js (writer changed to one JSON entry per line) and docs-site/scripts/test-search-index-reproducibility.cjs (new reproducible-merge test). No other callers or execution flows are affected, and the newline ("%0A"-→\n) change is a pure formatting change — the emitted index still parses to the identical object, so downstream consumers in getFileText and the Rust server are unaffected. Secret scan was clean. This matches the previously APPROVED review's analysis, and there are no new findings.

On the one existing finding (spawnsync-git-guard, MINOR): no author reply has been posted, so per the recurring-review protocol I keep it — it's non-blocking and does not gate the merge. I noted the disposition in the existing thread; it's a robustness nicety (fail with an actionable message if git/merge-file isn't available), not a correctness issue.

Recommendation: the branch is ready to merge. The MINOR nit can be addressed as a follow-up.

/approve

@Tara-ag Tara-ag left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approving this branch. The change is confined to the doc-search index writer (docs-site/tools/search-index/index.js): the JSON output changes from one pretty-printed object to one object per line, which is byte-stable across runs and merge-friendly (Git merge applies cleanly per line). The new test-search-index-reproducibility.cjs test validates this property and fails on the old writer. Output content is unchanged, so the Rust server and getFileText consumers are unaffected. One non-blocking minor (git presence guard in the test) is tracked in the existing thread.

@murdore
murdore merged commit 8cb5874 into release Sep 26, 2026
30 checks passed
@murdore
murdore deleted the fix/search-index-one-entry-per-line branch September 26, 2026 01:17
@github-actions

Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 12.24.1 🎉

The release is available on:

Your semantic-release bot 📦🚀

murdore added a commit that referenced this pull request Oct 3, 2026
…uides and plans

Fixes the docs-accuracy review threads left open on merged PRs. Each claim
was re-checked against the code on this checkout before editing.

CLAUDE.md
- CI-skip section: GitHub skips the push and pull_request runs when the
  head commit holds a directive, so the required check stays Pending and
  blocks the merge. `Reject CI-Skip Directives` is only a backstop and its
  regex does not cover a skip-checks trailer. (T3814059894-1, #1365)
- Rule 15 allow list: the closed Grandfathered block is legacy debt without
  a per-file header and may shrink, never grow; same note beside the list in
  eslint.config.js. (T3818474525-allow-docs, #1378)
- Audit snippet: the && chain moves into an `if`, so a failing audit cannot
  end a `set -e` caller's shell before the worktree cleanup. Proven with a
  bash `set -e` control. (T4051898811-1, #1676)
- "Reading a CI result": incidents 1, 2 and 4 are the absence-of-signal
  mistake, 3 is its inverse. (T4042254379-intro-first-four, #1716)

Provider and reference docs
- openai.md and providers/index.md: gpt-5.4 context is 1.05M (mini and nano
  stay 400K), matching contextWindows.ts. (T4114160945 and T4114105048,
  #1824; one defect raised twice)
- deepseek.md: close the unbalanced backtick that leaked into the search
  index. (T4112589028-b, #1800)
- pareto-inference.md: no context window is published; 131,072 is a catalog
  fallback, not a floor or a vendor figure. (T4125607242, #1848)
- docs/index.md: count MCP servers consistently. (T4072651139, #1776)
- provider-selection.md: the Streaming row covers text-generation providers
  only; decision-only providers (four, not three) use decide().
  (T4115057665, #1820)
- README.md: drop the hand-kept tool-support counts and stop grouping
  LiteLLM with the zero-configuration local runtimes, since it needs a
  running proxy. (T4113418122-readme-count-stale-now, #1816; T4072651184,
  #1776)
- openai-compat-catalog.md: every catalog provider except Groq maps
  TimeoutError to NetworkError. (T3806464799, #1353)
- SAFETY-PRIMITIVES.md: only no-inline-secret-regex and
  provider-typed-errors still apply; SSRF, stream-span and isNeuroLink
  bypasses are review-only. (T3790049900-1, #1334)

Plans
- middleware plan: providers-mocked has no AI Studio section and is
  construction-only for Vertex and Bedrock; name the three real seams.
  (T3950529360#1, #1656)
- dead-code-purge plan: record that the removal shipped in the major
  v11.0.0 and that there is no replacement for the removed types.
  (PF-T3790294047, #1335)
- onboarding-playbook plan: repo-relative commands instead of machine-local
  paths, drop the uncommitted scratch spec links, "Every Tier 3+ provider"
  ends with a manifest (Tier 2 is declared in its catalog JSON), and the three misplaced closing fences are moved so
  the duplicate "Verification commands" H2s are gone.
  (T3790294048, T3790294049, T3790294054, #1335)

Tooling
- verify-provider-onboarding now requires addedInPR, filesTouched and
  manualTestStatus in a hand-written provider's manifest, as the manifests
  README already said. xor and perplexity-decider gain
  manualTestStatus "ci-mocked-only"; README lists "verified-live". New case
  in the provider-structure suite runs the real tool against a scratch
  manifests tree: red without the validator change, green with it.
  (T3790294060-a, #1335)
- test-search-index-reproducibility asserts git merge-file could run, so a
  missing git reports ENOENT instead of a merge conflict. (T4108958700-git-
  guard, #1794)

Regenerated: docs-site/static/search-index.json via the docs build; a second
build leaves it byte-identical.

Fixes from the review of this PR, found after it was opened:
- openai.md: GPT-6 (September 2026) is newer than GPT-5.4 (March 2026), so
  the guide no longer calls GPT-5.4 the newest or the latest.
- onboarding-playbook plan: the Tier 2 bullet described a hand-written catalog
  row and a descriptor row; a Tier 2 provider is one JSON file under
  src/lib/providers/catalog/, and the onboarding gate checks that file instead
  of a manifest.

Skipped or deferred:
- T3810290322+T3810299660 (a link from tiers/README.md back to its parent): not
  done. The first attempt added a bare README key to LINK_MAPPINGS in
  sync-docs.ts, which would have sent about 7,500 API-reference links to the
  provider-integration README instead of the API index. It was reverted; a fix
  needs a link rule scoped to provider-integration/tiers.
- PF-T3790294047 is only partly fixed: the outcome note is in the plan, but
  docs/MIGRATION.md still has no v11.0.0 entry.

perplexity-decider is marked ci-mocked-only, the
conservative value; its owner may upgrade it if the live probe counts. The
catalog description of pareto-inference still says "conservative floor";
that is catalog data, left alone to avoid a codegen change in a docs commit.
murdore added a commit that referenced this pull request Oct 3, 2026
…uides and plans

Fixes the docs-accuracy review threads left open on merged PRs. Each claim
was re-checked against the code on this checkout before editing.

CLAUDE.md
- CI-skip section: GitHub skips the push and pull_request runs when the
  head commit holds a directive, so the required check stays Pending and
  blocks the merge. `Reject CI-Skip Directives` is only a backstop and its
  regex does not cover a skip-checks trailer. (T3814059894-1, #1365)
- Rule 15 allow list: the closed Grandfathered block is legacy debt without
  a per-file header and may shrink, never grow; same note beside the list in
  eslint.config.js. (T3818474525-allow-docs, #1378)
- Audit snippet: the && chain moves into an `if`, so a failing audit cannot
  end a `set -e` caller's shell before the worktree cleanup. Proven with a
  bash `set -e` control. (T4051898811-1, #1676)
- "Reading a CI result": incidents 1, 2 and 4 are the absence-of-signal
  mistake, 3 is its inverse. (T4042254379-intro-first-four, #1716)

Provider and reference docs
- openai.md and providers/index.md: gpt-5.4 context is 1.05M (mini and nano
  stay 400K), matching contextWindows.ts. (T4114160945 and T4114105048,
  #1824; one defect raised twice)
- deepseek.md: close the unbalanced backtick that leaked into the search
  index. (T4112589028-b, #1800)
- pareto-inference.md: no context window is published; 131,072 is a catalog
  fallback, not a floor or a vendor figure. (T4125607242, #1848)
- docs/index.md: count MCP servers consistently. (T4072651139, #1776)
- provider-selection.md: the Streaming row covers text-generation providers
  only; decision-only providers (four, not three) use decide().
  (T4115057665, #1820)
- README.md: drop the hand-kept tool-support counts and stop grouping
  LiteLLM with the zero-configuration local runtimes, since it needs a
  running proxy. (T4113418122-readme-count-stale-now, #1816; T4072651184,
  #1776)
- openai-compat-catalog.md: every catalog provider except Groq maps
  TimeoutError to NetworkError. (T3806464799, #1353)
- SAFETY-PRIMITIVES.md: only no-inline-secret-regex and
  provider-typed-errors still apply; SSRF, stream-span and isNeuroLink
  bypasses are review-only. (T3790049900-1, #1334)

Plans
- middleware plan: providers-mocked has no AI Studio section and is
  construction-only for Vertex and Bedrock; name the three real seams.
  (T3950529360#1, #1656)
- dead-code-purge plan: record that the removal shipped in the major
  v11.0.0 and that there is no replacement for the removed types.
  (PF-T3790294047, #1335)
- onboarding-playbook plan: repo-relative commands instead of machine-local
  paths, drop the uncommitted scratch spec links, "Every Tier 3+ provider"
  ends with a manifest (Tier 2 is declared in its catalog JSON), and the three misplaced closing fences are moved so
  the duplicate "Verification commands" H2s are gone.
  (T3790294048, T3790294049, T3790294054, #1335)

Tooling
- verify-provider-onboarding now requires addedInPR, filesTouched and
  manualTestStatus in a hand-written provider's manifest, as the manifests
  README already said. xor and perplexity-decider gain
  manualTestStatus "ci-mocked-only"; README lists "verified-live". New case
  in the provider-structure suite runs the real tool against a scratch
  manifests tree: red without the validator change, green with it.
  (T3790294060-a, #1335)
- test-search-index-reproducibility asserts git merge-file could run, so a
  missing git reports ENOENT instead of a merge conflict. (T4108958700-git-
  guard, #1794)

Regenerated: docs-site/static/search-index.json via the docs build; a second
build leaves it byte-identical.

Fixes from the review of this PR, found after it was opened:
- openai.md: GPT-6 (September 2026) is newer than GPT-5.4 (March 2026), so
  the guide no longer calls GPT-5.4 the newest or the latest.
- CLAUDE.md: the CI-skip paragraph still blamed the %s-only format check for
  the bypass, which contradicted the sentence before it. GitHub skips the whole
  workflow before any step runs, so the paragraph now says the format check is
  not the cause.
- onboarding-playbook plan: the Tier 2 bullet described a hand-written catalog
  row and a descriptor row; a Tier 2 provider is one JSON file under
  src/lib/providers/catalog/, and the onboarding gate checks that file instead
  of a manifest.

Skipped or deferred:
- T3810290322+T3810299660 (a link from tiers/README.md back to its parent): not
  done. The first attempt added a bare README key to LINK_MAPPINGS in
  sync-docs.ts, which would have sent about 7,500 API-reference links to the
  provider-integration README instead of the API index. It was reverted; a fix
  needs a link rule scoped to provider-integration/tiers.
- PF-T3790294047 is only partly fixed: the outcome note is in the plan, but
  docs/MIGRATION.md still has no v11.0.0 entry.

perplexity-decider is marked ci-mocked-only, the
conservative value; its owner may upgrade it if the live probe counts. The
catalog description of pareto-inference still says "conservative floor";
that is catalog data, left alone to avoid a codegen change in a docs commit.
murdore added a commit that referenced this pull request Oct 3, 2026
…uides and plans

Fixes the docs-accuracy review threads left open on merged PRs. Each claim
was re-checked against the code on this checkout before editing.

CLAUDE.md
- CI-skip section: GitHub skips the push and pull_request runs when the
  head commit holds a directive, so the required check stays Pending and
  blocks the merge. `Reject CI-Skip Directives` is only a backstop and its
  regex does not cover a skip-checks trailer. (T3814059894-1, #1365)
- Rule 15 allow list: the closed Grandfathered block is legacy debt without
  a per-file header and may shrink, never grow; same note beside the list in
  eslint.config.js. (T3818474525-allow-docs, #1378)
- Audit snippet: the && chain moves into an `if`, so a failing audit cannot
  end a `set -e` caller's shell before the worktree cleanup. Proven with a
  bash `set -e` control. (T4051898811-1, #1676)
- "Reading a CI result": incidents 1, 2 and 4 are the absence-of-signal
  mistake, 3 is its inverse. (T4042254379-intro-first-four, #1716)

Provider and reference docs
- openai.md and providers/index.md: gpt-5.4 context is 1.05M (mini and nano
  stay 400K), matching contextWindows.ts. (T4114160945 and T4114105048,
  #1824; one defect raised twice)
- deepseek.md: close the unbalanced backtick that leaked into the search
  index. (T4112589028-b, #1800)
- pareto-inference.md: no context window is published; 131,072 is a catalog
  fallback, not a floor or a vendor figure. (T4125607242, #1848)
- docs/index.md: count MCP servers consistently. (T4072651139, #1776)
- provider-selection.md: the Streaming row covers text-generation providers
  only; decision-only providers (four, not three) use decide().
  (T4115057665, #1820)
- README.md: drop the hand-kept tool-support counts and stop grouping
  LiteLLM with the zero-configuration local runtimes, since it needs a
  running proxy. (T4113418122-readme-count-stale-now, #1816; T4072651184,
  #1776)
- openai-compat-catalog.md: every catalog provider except Groq maps
  TimeoutError to NetworkError. (T3806464799, #1353)
- SAFETY-PRIMITIVES.md: only no-inline-secret-regex and
  provider-typed-errors still apply; SSRF, stream-span and isNeuroLink
  bypasses are review-only. (T3790049900-1, #1334)

Plans
- middleware plan: providers-mocked has no AI Studio section and is
  construction-only for Vertex and Bedrock; name the three real seams.
  (T3950529360#1, #1656)
- dead-code-purge plan: record that the removal shipped in the major
  v11.0.0 and that there is no replacement for the removed types.
  (PF-T3790294047, #1335)
- onboarding-playbook plan: repo-relative commands instead of machine-local
  paths, drop the uncommitted scratch spec links, "Every Tier 3+ provider"
  ends with a manifest (Tier 2 is declared in its catalog JSON), and the three misplaced closing fences are moved so
  the duplicate "Verification commands" H2s are gone.
  (T3790294048, T3790294049, T3790294054, #1335)

Tooling
- verify-provider-onboarding now requires addedInPR, filesTouched and
  manualTestStatus in a hand-written provider's manifest, as the manifests
  README already said. xor and perplexity-decider gain
  manualTestStatus "ci-mocked-only"; README lists "verified-live". New case
  in the provider-structure suite runs the real tool against a scratch
  manifests tree: red without the validator change, green with it.
  (T3790294060-a, #1335)
- test-search-index-reproducibility asserts git merge-file could run, so a
  missing git reports ENOENT instead of a merge conflict. (T4108958700-git-
  guard, #1794)

Regenerated: docs-site/static/search-index.json via the docs build; a second
build leaves it byte-identical.

Fixes from the review of this PR, found after it was opened:
- openai.md: GPT-6 (September 2026) is newer than GPT-5.4 (March 2026), so
  the guide no longer calls GPT-5.4 the newest or the latest.
- CLAUDE.md: the CI-skip paragraph still blamed the %s-only format check for
  the bypass, which contradicted the sentence before it. GitHub skips the whole
  workflow before any step runs, so the paragraph now says the format check is
  not the cause.
- onboarding-playbook plan: the Tier 2 bullet described a hand-written catalog
  row and a descriptor row; a Tier 2 provider is one JSON file under
  src/lib/providers/catalog/, and the onboarding gate checks that file instead
  of a manifest.

Skipped or deferred:
- T3810290322+T3810299660 (a link from tiers/README.md back to its parent): not
  done. The first attempt added a bare README key to LINK_MAPPINGS in
  sync-docs.ts, which would have sent about 7,500 API-reference links to the
  provider-integration README instead of the API index. It was reverted; a fix
  needs a link rule scoped to provider-integration/tiers.
- PF-T3790294047 is only partly fixed: the outcome note is in the plan, but
  docs/MIGRATION.md still has no v11.0.0 entry.

perplexity-decider is marked ci-mocked-only, the
conservative value; its owner may upgrade it if the live probe counts. The
catalog description of pareto-inference still says "conservative floor";
that is catalog data, left alone to avoid a codegen change in a docs commit.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants