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
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
84 changes: 84 additions & 0 deletions .github/workflows/product-check.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
name: Product check

on:
pull_request:
push:
branches: [main]

permissions:
contents: read

jobs:
product-check:
# The documented quick start supports Windows; Linux remains unverified.
runs-on: windows-latest
timeout-minutes: 180
defaults:
run:
shell: pwsh
env:
PYTHONUTF8: "1"
PLAYWRIGHT_BROWSERS_PATH: ${{ github.workspace }}/.thoth-test-browsers
THOTH_WORKSPACE: .thoth-ci
THOTH_IRIS_RESULT_FIXTURE: .thoth-ci/no-private-result.json
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 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: Python product tests
run: .\.venv\Scripts\python.exe -m pytest
- name: Python lint
run: .\.venv\Scripts\python.exe -m ruff check src apps tests migrations conftest.py scripts/pytest_environment.py
- name: Runtime architecture
run: .\.venv\Scripts\python.exe scripts/check_architecture.py
- name: Web tests
run: pnpm --dir apps/web run test --run
- name: Web lint
run: pnpm --dir apps/web run lint
- name: Web types
run: pnpm --dir apps/web run typecheck
- name: Web build
run: pnpm --dir apps/web run build
- name: README quick-start server smoke
run: |
.\.venv\Scripts\python.exe -m thoth.cli workspace
if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }
$thothApi = Start-Process .\.venv\Scripts\python.exe -ArgumentList @('-m', 'thoth.cli', 'serve', '--workspace', '.thoth-ci', '--port', '18766') -WindowStyle Hidden -PassThru
try {
$thothReady = $false
for ($thothAttempt = 0; $thothAttempt -lt 30; $thothAttempt++) {
try {
Invoke-RestMethod http://127.0.0.1:18766/healthz -ErrorAction Stop | Out-Null
$thothReady = $true
break
} catch { Start-Sleep -Seconds 1 }
}
if (-not $thothReady) { throw 'Quick-start API did not become ready.' }
$thothPage = Invoke-WebRequest http://127.0.0.1:18766/
if ($thothPage.StatusCode -ne 200 -or $thothPage.Content -notmatch 'type="module"') {
throw 'Built Web entry did not load.'
}
# Web tests and local browser acceptance check the rendered first-run UI.
} finally {
& taskkill /PID $thothApi.Id /T /F | Out-Null
}
84 changes: 44 additions & 40 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,40 +1,44 @@
.venv/
__pycache__/
*.py[cod]
.pytest_cache/
.ruff_cache/
.basedpyright/
.coverage
htmlcov/
dist/
build/
*.egg-info/
.env
.thoth/
.thoth-*/
node_modules/
apps/web/node_modules/
apps/web/dist/
apps/web/*.tsbuildinfo
apps/web/vite.config.js
apps/web/vite.config.d.ts
playwright-report/
test-results/
artifacts/qa/
*.log
field-validation/private/
field-validation/results/

# Local research and verification artifacts
outputs/
.codex/verification/
.omo/
*.db
*.sqlite
*.sqlite3
*.sqlite3-wal
*.sqlite3-shm
*.pem
*.key
tmp_*
_deploy_*
.venv/
__pycache__/
*.py[cod]
.pytest_cache/
.ruff_cache/
.basedpyright/
.coverage
htmlcov/
dist/
build/
*.egg-info/
.env
.thoth/
.thoth-*/
node_modules/
apps/web/node_modules/
apps/web/dist/
apps/web/*.tsbuildinfo
apps/web/vite.config.js
apps/web/vite.config.d.ts
playwright-report/
test-results/
artifacts/qa/
*.log
field-validation/private/
field-validation/results/

# Local research and verification artifacts
docs/plans/
docs/research/
docs/verification/
PROJECT_WIKI/
outputs/
.codex/verification/
.omo/
*.db
*.sqlite
*.sqlite3
*.sqlite3-wal
*.sqlite3-shm
*.pem
*.key
tmp_*
_deploy_*
10 changes: 6 additions & 4 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
## 작업 범위

- 조사·설명·설계 요청은 제품 수정을 허가하지 않는다. 구현 요청에서는 합의한 범위를 끝까지 수행하되, 의미 변경·외부 권한·비용이 필요한 부분만 질문한다.
- 현재 작업서는 해당 인수조건의 기준이다. PROJECT_WIKI/NOW.md에서 최신 작업을 확인하고, 아래 상세 계약은 변경 영역에 해당하는 것만 읽는다. 과거 완료 보고·기억보다 현재 코드와 해당 source의 실행 증거를 우선한다.
- 현재 작업서는 해당 인수조건의 기준이다. PROJECT_WIKI와 계획·리서치·과정 기록은 로컬 전용이며 공개 checkout의 필수 입력이 아니다. 아래 공개 상세 계약은 변경 영역에 해당하는 것만 읽는다. 과거 완료 보고·기억보다 현재 코드와 해당 source의 실행 증거를 우선한다.
- 기존 dirty 변경과 사용자 데이터를 보존한다. 검사 실패를 숨기려고 테스트·정책·기준값·예외 허용을 바꾸지 않는다. 변경이 필요하면 이유와 새 계약을 명시한다.

## 제품을 보존할 것
Expand Down Expand Up @@ -51,9 +51,11 @@

- 버그 수정은 별도 입력이나 실패 주입으로 재현하고 원하는 동작을 회귀 테스트에 남긴다. 새 기능은 정상 사용자 진입→소비자→저장 결과를 확인한다. 테스트 double의 고정 답은 live 의미 품질 증거가 아니다.
- 현재 적용되는 검증 정책을 따르되, 개발 중에는 영향 범위의 검사부터 수행한다. 동일 source의 살아 있는 검증을 중복 실행하지 않는다. 검사 범위를 줄이려면 기존 정책을 조용히 무시하지 말고 변경안을 명시한다.
- 개발 단계의 기본 검사는 가볍게 한다. 각 단계에서는 바꾼 코드의 테스트와 해당 언어의 lint(웹 lint·typecheck, Python ruff check·format)만 돌린다. 여러 화면·호출자가 함께 쓰는 컴포넌트나 모듈을 바꿨을 때만 그 소비자 테스트 또는 웹 테스트 전체를 추가한다. 빌드·architecture·basedpyright는 import 경계나 타입 계약을 바꾼 경우에만 돌린다.
- 병합·공개 전에는 깨끗한 checkout에서 제품 확인(Python 제품 시험 전체, 웹 시험 전체, 웹 lint·typecheck·build, Python ruff check, 계층 검사, README 빠른 시작)을 한 번 실행하고, 결과를 보고 사용자가 병합을 승인한다. 비활성 개발 Hook·과정 점검 시험은 명시 목록에 따라 제외하고 제외 이유와 수를 보고한다. 실패·중단·NOT_RUN을 통과로 표현하지 않는다.
- 실패/중단/NOT_RUN을 정확히 보고한다. 관련 테스트 PASS와 전체 회귀 PASS, controlled D4와 live D5를 구분한다. 파일/RPC/테스트 개수를 완성률로 쓰지 않는다.
- step 완료는 key 존재가 아니라 exact input revision·실제 상태 전이·후속 소비로 증명한다. NOT_TRIGGERED/NO_CHANGE/NOT_RUN을 SUCCESS와 구분한다.
- 인계에는 해결한 기능, 실제 검증, 미완료/차단, 관련 source와 기록 위치를 남긴다. 제품 의미가 바뀌면 정본을 먼저, 해당 Wiki projection을 다음으로 갱신한다. 상태만 바뀌면 NOW/검증 기록만 갱신한다.
- 인계에는 해결한 기능, 실제 검증, 미완료/차단, 관련 source와 기록 위치를 남긴다. 제품 의미가 바뀌면 정본을 먼저, 해당 Wiki projection을 다음으로 갱신한다. 상태만 바뀌면 NOW/검증 기록만 갱신한다. 이 기록은 커밋·병합·세션 인계처럼 넘기는 지점에서 짧게 남기고, 개발 중간 단계마다 쓰지 않는다.
- 배포·외부 발송·공식 제출·새 credential/비용·물리 장비·commit/push는 사용자의 해당 실행 지시 범위를 따른다. 이 문서 자체는 그 권한을 부여하지 않는다.

## 상세 계약 길잡이
Expand All @@ -65,5 +67,5 @@
- registry 계약: docs/architecture/extension-point-catalog.md
- 현재 검증 선택 정책: docs/architecture/verification-profiles.md
- 제품 기능의 고정 중심: research-briefs/CORE_PRODUCT_INVARIANTS.md
- 정상 진입/성숙도: PROJECT_WIKI/50_SEED_ROADMAP/behavioral-acceptance-contracts.md 및 implementation-maturity-matrix.md
- 이번 보완 범위: docs/plans/THOTH_POST_AUDIT_REPAIR_SCOPE_20260913.md
- 공개 RPC 정본: docs/architecture/rpc-method-catalog.md
- 제품 확인 결과와 한계: docs/VERIFICATION.md
124 changes: 0 additions & 124 deletions PROJECT_WIKI/30_ARCHITECTURE/current-ocp-gaps.md

This file was deleted.

Loading
Loading