Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
129 changes: 127 additions & 2 deletions .github/workflows/product-check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ on:
pull_request:
push:
branches: [main]
schedule:
# 18:00 UTC is 03:00 KST the following day; scheduled runs use the default branch.
- cron: "0 18 * * *"
workflow_dispatch:

permissions:
contents: read
Expand All @@ -15,8 +19,7 @@ env:

jobs:
checks:
# Fast public checks (about ten minutes). The full Python suite takes hours on a hosted
# runner, so maintainers run it locally before merging.
# Public static, Web and quick-start checks. The jobs below cover the full Python suite.
runs-on: windows-latest
timeout-minutes: 60
defaults:
Expand Down Expand Up @@ -85,3 +88,125 @@ jobs:
} finally {
& taskkill /PID $thothApi.Id /T /F | Out-Null
}

python-fast:
runs-on: windows-latest
timeout-minutes: 60
defaults:
run:
shell: pwsh
env:
PLAYWRIGHT_BROWSERS_PATH: ${{ github.workspace }}/.thoth-test-browsers
steps:
- uses: actions/checkout@v5
- uses: actions/setup-python@v6
with:
python-version: "3.13"
- uses: actions/setup-node@v4
with:
node-version: "24"
- uses: pnpm/action-setup@v4
with:
version: "11.21.0"
- uses: astral-sh/setup-uv@v7
with:
version: "0.12.5"
- name: Install locked test dependencies
run: |
python -m venv --copies --without-pip .venv
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
uv sync --python .\.venv\Scripts\python.exe --no-managed-python --no-python-downloads --frozen --extra dev --dev --extra browser
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
pnpm install --frozen-lockfile
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
.\.venv\Scripts\python.exe -m playwright install --only-shell chromium
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
- name: Non-integration Python tests
run: .\.venv\Scripts\python.exe -m pytest --ignore=tests/integration -q -rfE -p no:cacheprovider --junitxml=test-results/python-fast.xml
- name: Upload Python test results
if: ${{ always() }}
uses: actions/upload-artifact@v7
with:
name: python-junit-fast
path: test-results/python-fast.xml
if-no-files-found: error

python-integration:
runs-on: windows-latest
timeout-minutes: 90
strategy:
fail-fast: false
matrix:
shard: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
defaults:
run:
shell: pwsh
env:
PLAYWRIGHT_BROWSERS_PATH: ${{ github.workspace }}/.thoth-test-browsers
steps:
- uses: actions/checkout@v5
- uses: actions/setup-python@v6
with:
python-version: "3.13"
- uses: actions/setup-node@v4
with:
node-version: "24"
- uses: pnpm/action-setup@v4
with:
version: "11.21.0"
- uses: astral-sh/setup-uv@v7
with:
version: "0.12.5"
- name: Install locked test dependencies
run: |
python -m venv --copies --without-pip .venv
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
uv sync --python .\.venv\Scripts\python.exe --no-managed-python --no-python-downloads --frozen --extra dev --dev --extra browser
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
pnpm install --frozen-lockfile
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
.\.venv\Scripts\python.exe -m playwright install --only-shell chromium
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
- name: Validate and run integration shard
run: |
$thothFilesJson = & .\.venv\Scripts\python.exe scripts/ci_test_shards.py select --count 16 --index ${{ matrix.shard }}
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
$thothFiles = @($thothFilesJson | ConvertFrom-Json)
if ($thothFiles.Count -eq 0) { throw 'Integration shard is empty.' }
& .\.venv\Scripts\python.exe -m pytest @thothFiles -q -rfE -p no:cacheprovider --junitxml=test-results/python-integration-${{ matrix.shard }}.xml
exit $LASTEXITCODE
- name: Upload Python test results
if: ${{ always() }}
uses: actions/upload-artifact@v7
with:
name: python-junit-integration-${{ matrix.shard }}
path: test-results/python-integration-${{ matrix.shard }}.xml
if-no-files-found: error

python-summary:
needs: [python-fast, python-integration]
if: ${{ always() }}
runs-on: windows-latest
timeout-minutes: 10
defaults:
run:
shell: pwsh
steps:
- uses: actions/checkout@v5
- uses: actions/setup-python@v6
with:
python-version: "3.13"
- uses: actions/download-artifact@v8
with:
pattern: python-junit-*
path: test-results/aggregate
merge-multiple: true
- name: Summarize every Python group
if: ${{ always() }}
env:
FAST_RESULT: ${{ needs.python-fast.result }}
INTEGRATION_RESULT: ${{ needs.python-integration.result }}
run: >-
python scripts/ci_test_summary.py --reports test-results/aggregate --shards 16
--job-results "$env:FAST_RESULT" "$env:INTEGRATION_RESULT"
--markdown-output "$env:GITHUB_STEP_SUMMARY"
5 changes: 5 additions & 0 deletions README.ko.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,11 @@

## 다시 살펴볼 수 있는 연구 흐름

가설별 예상 결과와 기각 조건은 저장된 선택이 없는 프로젝트에서 기본으로 켜집니다.
이전에 꺼서 저장한 설정은 그대로 유지되며, 프로젝트의 고급 설정에서 바꿀 수 있습니다.
빈 예측을 채우는 추가 모델 호출과 토큰 사용이 생길 수 있습니다. 근거를 연결한 예측도
확인 전에는 미확정 제안입니다.

| 단계 | THOTH에서 하는 일 |
| :--- | :--- |
| **1 · 질문** | 연구 질문을 만들고 관련 문서를 연결합니다. |
Expand Down
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,11 @@ Older requests retain their original language policy. New questions use model ca

## A research loop you can revisit

Expected results and refutation conditions are on by default for projects without a saved
choice. A previously saved off choice stays off. You can change this in the project's advanced
settings. Filling missing predictions may add a model call and use more tokens; predictions
remain unconfirmed proposals, even when they include evidence references.

| Step | In THOTH |
| :--- | :--- |
| **1 · Ask** | Start with a research question and connect the relevant documents. |
Expand Down
Loading
Loading