Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
3bd9976
feat(docs): rebuild documentation with the Paper design system
emir-karabeg Oct 29, 2026
4cf2622
fix(docs): verify nested tabs and fresh-checkout CI setup
emir-karabeg Oct 29, 2026
ac35482
chore(docs): refresh preservation evidence against latest staging
emir-karabeg Oct 29, 2026
67613aa
fix(docs): align shared navigation and controls with Paper
emir-karabeg Oct 30, 2026
2af0fdd
fix(docs): share active heading across responsive outlines
emir-karabeg Oct 30, 2026
416663b
fix(docs): track the final section at the end of the page
emir-karabeg Oct 30, 2026
d794f9a
fix(docs): preserve sidebar scroll in a persistent layout
emir-karabeg Oct 30, 2026
703e2c1
fix(docs): restore live screenshot backgrounds and framing
emir-karabeg Oct 30, 2026
7dcbd2e
fix(docs): finish layout polish and clean implementation references
emir-karabeg Oct 30, 2026
268aad8
fix(docs): align shared dark theme and overlay states
emir-karabeg Oct 30, 2026
f06b2d6
fix(docs): remove dark borders from platform screenshots
emir-karabeg Oct 30, 2026
16b3fdc
Merge remote-tracking branch 'origin/staging' into feat/docs
emir-karabeg Oct 30, 2026
74b58e8
test(docs): benchmark production navigation and image delivery in CI
emir-karabeg Oct 30, 2026
1aab14f
fix(docs): preserve machine content and production reading contracts
emir-karabeg Oct 30, 2026
179c340
Merge remote-tracking branch 'origin/staging' into feat/docs
emir-karabeg Oct 30, 2026
fb45fae
fix(docs): retain readable tabs without JavaScript and verify current…
emir-karabeg Oct 30, 2026
a5b626b
fix(docs): expose root response schemas and generate clean-checkout t…
emir-karabeg Oct 30, 2026
50a703b
fix(docs): resolve no-script tabs in the preflight cascade layer
emir-karabeg Oct 30, 2026
57826a6
perf(docs): import only the search schema constructors
emir-karabeg Oct 30, 2026
b313fcc
fix(docs): preserve retrieval excerpts and reduce reading overhead
emir-karabeg Oct 30, 2026
66faa48
fix(docs): reuse in-flight intent prefetches during navigation
emir-karabeg Oct 30, 2026
3d9ad44
docs: record production readiness evidence and release requirements
emir-karabeg Oct 30, 2026
6a0ebfa
docs: clarify optimizer measurement provenance
emir-karabeg Oct 30, 2026
5588062
Merge commit '3175daab84bfc2d7dfc8d924d55313190c280476' into feat/docs
emir-karabeg Oct 30, 2026
f54d9f5
docs: preserve latest staging Search assets and compatibility evidence
emir-karabeg Oct 30, 2026
d7ae1eb
fix(docs): polish responsive controls and keep search indexing current
waleedlatif1 Oct 30, 2026
c32d75a
test(docs): select the visible API example in browser checks
waleedlatif1 Oct 30, 2026
75cb5cb
test(docs): execute native examples against streaming and binary resp…
waleedlatif1 Oct 30, 2026
64d0d86
fix(docs): stream native API responses without buffering
waleedlatif1 Oct 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 3 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,6 @@ Dockerfile* text eol=lf
*.ttf binary
*.eot binary
*.pdf binary

apps/docs/migration/*.json linguist-generated=true

@cubic-dev-ai cubic-dev-ai Bot Oct 30, 2026 •

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.

P2: This glob also matches apps/docs/migration/baseline.json, which is a frozen input that compile-content.ts and test-corpus-e2e.ts read to verify preserved routes and anchors, not a generated file. Marking it linguist-generated collapses its diffs in GitHub review, hiding changes to the reference corpus. Narrow the attribute to the file that the verification step actually regenerates.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At .gitattributes, line 45:

<comment>This glob also matches `apps/docs/migration/baseline.json`, which is a frozen input that `compile-content.ts` and `test-corpus-e2e.ts` read to verify preserved routes and anchors, not a generated file. Marking it `linguist-generated` collapses its diffs in GitHub review, hiding changes to the reference corpus. Narrow the attribute to the file that the verification step actually regenerates.</comment>

<file context>
@@ -41,3 +41,6 @@ Dockerfile* text eol=lf
 *.eot binary
 *.pdf binary
+
+apps/docs/migration/*.json linguist-generated=true
+apps/docs/migration/verification/** linguist-generated=true
</file context>
Suggested change
apps/docs/migration/*.json linguist-generated=true
apps/docs/migration/report.json linguist-generated=true
Fix with cubic

apps/docs/migration/verification/** linguist-generated=true
3 changes: 3 additions & 0 deletions .github/workflows/checks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -684,6 +684,9 @@ jobs:
tar -xzf "$archive" -C "$RUNNER_TEMP" actionlint
"$RUNNER_TEMP/actionlint" -color -shellcheck= -pyflakes=

- name: Generate documentation modules for import audits
run: bun run --cwd apps/docs content:generate

# Every zero-argument `check:*` script, run concurrently. The list is derived in
# scripts/run-audits.ts, which also writes the per-audit timing table to the job
# summary and annotates failures. Audits needing a base ref stay separate below.
Expand Down
17 changes: 14 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1149,9 +1149,20 @@ jobs:
with:
filters: |
docs:
- 'apps/docs/content/docs/**'
- 'apps/sim/scripts/process-docs.ts'
- 'apps/sim/lib/chunkers/**'
- 'apps/docs/content/**'
- 'apps/docs/components/workflow-preview/examples.ts'
- 'apps/docs/components/workflow-preview/block-display-workflows.ts'
- 'apps/docs/scripts/compile-content.ts'
- 'apps/docs/scripts/index-search.ts'
- 'apps/docs/lib/content/**'
- 'apps/docs/lib/search/**'
- 'apps/docs/lib/openapi-specs.ts'
- 'apps/docs/lib/urls.ts'
- 'apps/docs/public/openapi*.json'

@cubic-dev-ai cubic-dev-ai Bot Oct 30, 2026 •

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.

P2: This glob matches nothing: the OpenAPI specs live at apps/docs/openapi-*.json, not under apps/docs/public/. Spec edits change the generated API operation pages that are indexed for search, but they will not trigger the docs job. Change the entry to 'apps/docs/openapi*.json'.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At .github/workflows/ci.yml, line 1161:

<comment>This glob matches nothing: the OpenAPI specs live at `apps/docs/openapi-*.json`, not under `apps/docs/public/`. Spec edits change the generated API operation pages that are indexed for search, but they will not trigger the `docs` job. Change the entry to `'apps/docs/openapi*.json'`.</comment>

<file context>
@@ -1149,9 +1149,20 @@ jobs:
+              - 'apps/docs/lib/search/**'
+              - 'apps/docs/lib/openapi-specs.ts'
+              - 'apps/docs/lib/urls.ts'
+              - 'apps/docs/public/openapi*.json'
+              - 'apps/docs/package.json'
+              - 'bun.lock'
</file context>
Suggested change
- 'apps/docs/public/openapi*.json'
- 'apps/docs/openapi*.json'
Fix with cubic

- 'apps/docs/package.json'
- 'bun.lock'
- '.github/workflows/docs.yml'
- '.github/workflows/ci.yml'

# Process docs embeddings (only when docs change, after images are promoted)
docs:
Expand Down
212 changes: 201 additions & 11 deletions .github/workflows/docs-negotiation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,51 +17,241 @@ on:
- 'bun.lock'
- '.github/workflows/docs-negotiation.yml'
workflow_dispatch:
inputs:
benchmark:
description: Run bounded production navigation, image and Lighthouse measurements
type: boolean
default: false
build_ref:
description: Commit to build for the benchmark (empty uses this workflow revision)
type: string
default: ''
preview_artifact:
description: Save the verified production build for local visual inspection
type: boolean
default: false
benchmark_scope:
description: Full measurements, navigation without Lighthouse, or only interactive controls
type: choice
options: [full, navigation, interactions]
default: full
benchmark_production:
description: Also measure the public production origin (only when it permits automated access)
type: boolean
default: false

permissions:
contents: read

concurrency:
group: docs-negotiation-${{ github.ref }}
group: docs-negotiation-${{ github.ref }}-${{ inputs.benchmark && 'benchmark' || 'verification' }}
cancel-in-progress: true
Comment on lines +47 to 48

@cubic-dev-ai cubic-dev-ai Bot Oct 30, 2026 •

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.

P2: Benchmark runs share this group with cancel-in-progress: true, so a second benchmark dispatch on the same ref cancels a measurement that may already be far along. Disable cancellation for the benchmark group, for example cancel-in-progress: ${{ !inputs.benchmark }}.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At .github/workflows/docs-negotiation.yml, line 47:

<comment>Benchmark runs share this group with `cancel-in-progress: true`, so a second benchmark dispatch on the same ref cancels a measurement that may already be far along. Disable cancellation for the benchmark group, for example `cancel-in-progress: ${{ !inputs.benchmark }}`.</comment>

<file context>
@@ -17,51 +17,241 @@ on:
 
 concurrency:
-  group: docs-negotiation-${{ github.ref }}
+  group: docs-negotiation-${{ github.ref }}-${{ inputs.benchmark && 'benchmark' || 'verification' }}
   cancel-in-progress: true
 
</file context>
Suggested change
group: docs-negotiation-${{ github.ref }}-${{ inputs.benchmark && 'benchmark' || 'verification' }}
cancel-in-progress: true
group: docs-negotiation-${{ github.ref }}-${{ inputs.benchmark && 'benchmark' || 'verification' }}
cancel-in-progress: ${{ !inputs.benchmark }}
Fix with cubic


jobs:
benchmark:
if: github.event_name == 'workflow_dispatch' && inputs.benchmark
name: docs benchmark (${{ matrix.target }})
runs-on: ${{ (vars.CI_PROVIDER == '' || vars.CI_PROVIDER == 'blacksmith') && 'blacksmith-8vcpu-ubuntu-2404' || 'linux-x64-8-core' }}
timeout-minutes: 150
strategy:
fail-fast: false
max-parallel: 2
matrix:
target: ${{ fromJSON(inputs.benchmark_production && '["build","production"]' || '["build"]') }}
env:
DATABASE_URL: ''
OPENAI_API_KEY: ''
DOCS_BENCHMARK_BASE_URL: ${{ matrix.target == 'production' && 'https://docs.sim.ai' || 'http://127.0.0.1:3001' }}
steps:
- name: Checkout measured revision
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v6
with:
ref: ${{ inputs.build_ref || github.sha }}
fetch-depth: 0
filter: blob:none
- name: Setup workspace
uses: ./.github/actions/setup
with:
provider: ${{ vars.CI_PROVIDER }}
- name: Checkout benchmark harness
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v6
with:
ref: ${{ github.sha }}
path: .readiness-harness
sparse-checkout: apps/docs/scripts/benchmark-readiness.ts
sparse-checkout-cone-mode: false
- name: Prepare measurements
env:
GH_TOKEN: ${{ github.token }}
MEASURED_TARGET: ${{ matrix.target }}
run: |
mkdir -p test-results/benchmark
cp .readiness-harness/apps/docs/scripts/benchmark-readiness.ts apps/docs/scripts/benchmark-readiness.ts
if [ "$MEASURED_TARGET" = production ]; then
gh api "repos/$GITHUB_REPOSITORY/deployments?environment=Production&per_page=1" >test-results/benchmark/deployment.json
REVISION=$(jq -r '.[0].sha' test-results/benchmark/deployment.json)

@cubic-dev-ai cubic-dev-ai Bot Oct 30, 2026 •

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.

P2: This records the newest production deployment's SHA without confirming that it succeeded or is serving docs.sim.ai, so a failed or in-progress deployment can mislabel the benchmark report. Verify the serving deployment's successful status before setting the measured revision.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At .github/workflows/docs-negotiation.yml, line 92:

<comment>This records the newest production deployment's SHA without confirming that it succeeded or is serving `docs.sim.ai`, so a failed or in-progress deployment can mislabel the benchmark report. Verify the serving deployment's successful status before setting the measured revision.</comment>

<file context>
@@ -17,51 +17,241 @@ on:
+          cp .readiness-harness/apps/docs/scripts/benchmark-readiness.ts apps/docs/scripts/benchmark-readiness.ts
+          if [ "$MEASURED_TARGET" = production ]; then
+            gh api "repos/$GITHUB_REPOSITORY/deployments?environment=Production&per_page=1" >test-results/benchmark/deployment.json
+            REVISION=$(jq -r '.[0].sha' test-results/benchmark/deployment.json)
+          else
+            REVISION=$(git rev-parse HEAD)
</file context>
Fix with cubic

else
REVISION=$(git rev-parse HEAD)
fi
echo "DOCS_BENCHMARK_REVISION=$REVISION" >> "$GITHUB_ENV"
bunx --no-install playwright install --with-deps chromium
- name: Build measured production docs
id: build
if: matrix.target == 'build'
run: bun run --cwd apps/docs build
- name: Measure navigation and Lighthouse sequentially
env:
BENCHMARK_SCOPE: ${{ inputs.benchmark_scope || 'full' }}
run: |
if [ "$DOCS_BENCHMARK_BASE_URL" = http://127.0.0.1:3001 ]; then
bun run --cwd apps/docs start --port 3001 >test-results/benchmark/server.log 2>&1 &
DOCS_SERVER_PID=$!
trap 'kill "$DOCS_SERVER_PID" 2>/dev/null || true' EXIT
for attempt in $(seq 1 30); do
curl -fsS "$DOCS_BENCHMARK_BASE_URL/introduction" -o /dev/null && break
sleep 1
done
fi
NAVIGATION_STATUS=0
LIGHTHOUSE_STATUS=0
if [ "$BENCHMARK_SCOPE" = interactions ]; then
export DOCS_BENCHMARK_SCENARIOS=interactions
fi
DOCS_BENCHMARK_MODE=navigation DOCS_BENCHMARK_REPORT_PATH="$GITHUB_WORKSPACE/test-results/benchmark/navigation.json" bun run --cwd apps/docs scripts/benchmark-readiness.ts || NAVIGATION_STATUS=$?
if [ "$BENCHMARK_SCOPE" = full ]; then
DOCS_BENCHMARK_MODE=lighthouse DOCS_BENCHMARK_REPORT_PATH="$GITHUB_WORKSPACE/test-results/benchmark/lighthouse.json" bun run --cwd apps/docs scripts/benchmark-readiness.ts || LIGHTHOUSE_STATUS=$?
fi
test "$NAVIGATION_STATUS" -eq 0 && test "$LIGHTHOUSE_STATUS" -eq 0
- name: Upload measurements
if: always()
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: docs-benchmark-${{ matrix.target }}
path: test-results/benchmark/
retention-days: 14
- name: Package measured production preview
if: always() && inputs.preview_artifact && steps.build.outcome == 'success'
run: tar -czf docs-preview-build.tar.gz --exclude='.next/cache' -C apps/docs .next .content
- name: Upload measured production preview
if: always() && inputs.preview_artifact && steps.build.outcome == 'success'
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: docs-preview-build
path: docs-preview-build.tar.gz
retention-days: 3

http:
if: github.event_name != 'workflow_dispatch' || !inputs.benchmark
name: docs HTTP
runs-on: ${{ (vars.CI_PROVIDER == '' || vars.CI_PROVIDER == 'blacksmith') && 'blacksmith-8vcpu-ubuntu-2404' || 'linux-x64-8-core' }}
timeout-minutes: 15
timeout-minutes: 45
services:
search-postgres:
image: pgvector/pgvector:pg17
env:
POSTGRES_USER: docs_test
POSTGRES_PASSWORD: docs_test
POSTGRES_DB: docs_search_test
ports:
- 5432:5432
options: >-
--health-cmd "pg_isready -U docs_test -d docs_search_test"
--health-interval 5s
--health-timeout 5s
--health-retries 10
env:
DATABASE_URL: postgresql://docs_test:docs_test@127.0.0.1:1/docs_test
DOCS_E2E_BASE_URL: http://127.0.0.1:3001
DOCS_NEGOTIATION_REPORT_PATH: ${{ github.workspace }}/test-results/docs-negotiation.json
DOCS_HEADER_REPORT_PATH: ${{ github.workspace }}/test-results/docs-headers.json
DOCS_NAVIGATION_REPORT_PATH: ${{ github.workspace }}/test-results/navigation/docs.json
DOCS_NEGOTIATION_REPORT_PATH: ${{ github.workspace }}/apps/docs/test-results/docs-negotiation.json
DOCS_SEARCH_E2E_DATABASE_URL: postgresql://docs_test:docs_test@127.0.0.1:5432/docs_search_test
DOCS_SEARCH_E2E_REPORT_PATH: ${{ github.workspace }}/apps/docs/test-results/search-postgres/report.json
DOCS_INTERFACES_REPORT_PATH: ${{ github.workspace }}/apps/docs/test-results/docs-interfaces.json
DOCS_CORPUS_REPORT_PATH: ${{ github.workspace }}/apps/docs/test-results/docs-corpus.json
DOCS_HEADER_REPORT_PATH: ${{ github.workspace }}/apps/docs/test-results/docs-headers.json
DOCS_NAVIGATION_REPORT_PATH: ${{ github.workspace }}/apps/docs/test-results/navigation/docs.json
DOCS_GENERATORS_REPORT_PATH: ${{ github.workspace }}/apps/docs/test-results/generators/report.json
DOCS_MIGRATION_REPORT_PATH: ${{ github.workspace }}/apps/docs/test-results/migration.json
DOCS_SAMPLES_REPORT_PATH: ${{ github.workspace }}/apps/docs/test-results/samples/report.json
DOCS_SAMPLES_SYNTAX_LANGUAGES: javascript,python,bash,go,java,csharp
DOCS_SAMPLES_HTTP_BASE_URL: http://127.0.0.1:3001
DOCS_PROVIDER_E2E_DATABASE_URL: postgresql://docs_test:docs_test@127.0.0.1:5432/docs_search_test
DOCS_PROVIDER_E2E_BASE_URL: http://127.0.0.1:3001
DOCS_PROVIDER_E2E_REPORT_PATH: ${{ github.workspace }}/apps/docs/test-results/platform-consumer/report.json
steps:
- name: Checkout code
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v6
with:
fetch-depth: 0
filter: blob:none
- name: Setup workspace
uses: ./.github/actions/setup
with:
provider: ${{ vars.CI_PROVIDER }}
- name: Build production docs
id: build
run: bun run --cwd apps/docs build
- name: Verify generator idempotence and authored regions
run: bun run --cwd apps/docs scripts/test-generators-e2e.ts
- name: Verify preserved routes, anchors and examples
if: always() && steps.build.outcome == 'success'
run: bun run --cwd apps/docs content:verify-migration
- name: Verify native header edge cases
if: always() && steps.build.outcome == 'success'
run: bun run --cwd apps/docs test:headers:e2e
- name: Verify isolated PostgreSQL search and index lifecycle
if: always() && steps.build.outcome == 'success'
run: bun run --cwd apps/docs test:search:postgres:e2e
- name: Set up Java for copied request examples
if: always() && steps.build.outcome == 'success'
uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5
with:
distribution: temurin
java-version: '17'
- name: Set up .NET for copied request examples
if: always() && steps.build.outcome == 'success'
uses: actions/setup-dotnet@26b0ec14cb23fa6904739307f278c14f94c95bf1 # v5
with:
dotnet-version: '8.0.x'
- name: Set up Go for copied request examples
if: always() && steps.build.outcome == 'success'
uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6
with:
go-version: '1.25.x'
cache: false
- name: Install browser for navigation checks
run: bunx --no-install playwright install --with-deps chromium
if: always() && steps.build.outcome == 'success'
run: bunx --no-install playwright install --with-deps chromium webkit
- name: Verify HTTP content negotiation
if: always() && steps.build.outcome == 'success'
run: |
mkdir -p test-results
bun run --cwd apps/docs start --port 3001 >test-results/docs-server.log 2>&1 &
mkdir -p apps/docs/test-results
bun run --cwd apps/docs start --port 3001 >apps/docs/test-results/docs-server.log 2>&1 &
DOCS_SERVER_PID=$!
trap 'kill "$DOCS_SERVER_PID" 2>/dev/null || true' EXIT
bun run --cwd apps/docs test:negotiation:e2e
bun run --cwd apps/docs test:navigation:e2e
STATUS=0
bun run --cwd apps/docs test:negotiation:e2e || STATUS=1
bun run --cwd apps/docs scripts/test-docs-interfaces-e2e.ts || STATUS=1
bun run --cwd apps/docs test:corpus:e2e || STATUS=1
bun run --cwd apps/docs scripts/verify-api-samples.ts || STATUS=1
bun --cwd apps/sim --no-env-file scripts/test-docs-search-provider-e2e.ts || STATUS=1
bun run --cwd apps/docs test:navigation:e2e || STATUS=1
DOCS_NAVIGATION_BROWSER=webkit DOCS_NAVIGATION_REPORT_PATH="$GITHUB_WORKSPACE/apps/docs/test-results/navigation-webkit/docs.json" bun run --cwd apps/docs test:navigation:e2e || STATUS=1
exit "$STATUS"
- name: Package production preview for visual inspection
if: always() && inputs.preview_artifact && steps.build.outcome == 'success'
run: tar -czf docs-preview-build.tar.gz --exclude='.next/cache' -C apps/docs .next .content
- name: Upload production preview
if: always() && inputs.preview_artifact && steps.build.outcome == 'success'
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: docs-preview-build
path: docs-preview-build.tar.gz
retention-days: 3
- name: Upload HTTP regression report
if: always()
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: docs-negotiation-report
path: test-results/
path: apps/docs/test-results/
if-no-files-found: warn
retention-days: 14
20 changes: 17 additions & 3 deletions .github/workflows/docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,22 +19,36 @@ jobs:
runs-on: ${{ (vars.CI_PROVIDER == '' || vars.CI_PROVIDER == 'blacksmith') && 'blacksmith-2vcpu-ubuntu-2404' || 'ubuntu-latest' }}
timeout-minutes: 30
if: github.ref == 'refs/heads/main'
concurrency:
group: docs-search-index-production
cancel-in-progress: false

steps:
- name: Checkout code
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v6
with:
ref: main

@cubic-dev-ai cubic-dev-ai Bot Oct 30, 2026 •

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.

P1: ref: main can check out a newer commit than the one that triggered this serialized workflow. Pin the checkout to ${{ github.sha }} so the index matches the caller's revision.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At .github/workflows/docs.yml, line 30:

<comment>`ref: main` can check out a newer commit than the one that triggered this serialized workflow. Pin the checkout to `${{ github.sha }}` so the index matches the caller's revision.</comment>

<file context>
@@ -19,22 +19,36 @@ jobs:
       - name: Checkout code
         uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v6
         with:
+          ref: main
           persist-credentials: false
 
</file context>
Suggested change
ref: main
ref: ${{ github.sha }}
Fix with cubic

persist-credentials: false

- name: Setup workspace
uses: ./.github/actions/setup
with:
provider: ${{ vars.CI_PROVIDER }}
node-version: '22'
node-version: '24'

- name: Process docs embeddings
working-directory: ./apps/sim
working-directory: ./apps/docs
env:
DATABASE_URL: ${{ secrets.DATABASE_URL }}
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
run: bun run scripts/process-docs.ts --clear
run: |
bun run content:generate
DOCS_SEARCH_REPORT_PATH=test-results/docs-search-publish.json bun run scripts/index-search.ts

@cubic-dev-ai cubic-dev-ai Bot Oct 30, 2026 •

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.

P1: This publisher still runs automatically for main-branch docs changes, and the subsequent --check cannot protect the existing index from that write. Keep publication disabled behind an explicit verified-deployment and backup gate.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At .github/workflows/docs.yml, line 46:

<comment>This publisher still runs automatically for main-branch docs changes, and the subsequent `--check` cannot protect the existing index from that write. Keep publication disabled behind an explicit verified-deployment and backup gate.</comment>

<file context>
@@ -19,22 +19,36 @@ jobs:
-        run: bun run scripts/process-docs.ts --clear 
+        run: |
+          bun run content:generate
+          DOCS_SEARCH_REPORT_PATH=test-results/docs-search-publish.json bun run scripts/index-search.ts
+          DOCS_SEARCH_REPORT_PATH=test-results/docs-search-check.json bun run scripts/index-search.ts --check
+
</file context>
Fix with cubic

DOCS_SEARCH_REPORT_PATH=test-results/docs-search-check.json bun run scripts/index-search.ts --check

- name: Upload search index report
if: always()
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: docs-search-index
path: apps/docs/test-results/docs-search-*.json
7 changes: 2 additions & 5 deletions apps/docs/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,10 @@ bun-debug.log*
*.tsbuildinfo
next-env.d.ts

# Fumadocs
/.source/
# Build-generated content
/.content/
.plans/

# fumadocs generates .source dirs anywhere a source.config sits
**/.source/

# Build-generated documentation asset
/public/llms-full.txt
/public/.llms-full-*/
Loading