Skip to content

Commit 5cb2954

Browse files
committed
feat: 경로 승격 준비 판정을 구현
상황: 대표 학습 경로의 자동 검증 결과와 사람 효능 근거가 한 상태로 섞여 있어, 자동 검사 통과가 공개 승격처럼 해석될 여지가 있었다. 변경: M0 경로 준비 상태와 다섯 자동 검사 계약을 추가하고, R10 round 및 E0-E3 근거가 없으면 provisional을 유지하는 판정기와 6경로 검증 gate를 CI·품질·릴리즈 순서에 연결했다. 영향: 6개 대표 경로는 자동 준비 6/6이어도 독립 검수 0/468과 R10 미준비 상태에서는 승격 0/6으로 유지된다. 기존 E0-E3 사람 표본과 연구 운영 조건은 완화하지 않았다. 검증: path-promotion-readiness gate 통과, 관련 pytest 29개 통과, ruff 통과, preflight 3/3 통과, git diff --check 통과.
1 parent abe469d commit 5cb2954

10 files changed

Lines changed: 699 additions & 10 deletions

File tree

.github/workflows/ci.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,11 @@ jobs:
9595
timeout-minutes: 20
9696
run: uv run python -X utf8 tests/run.py gate curriculum-quality-matrix
9797

98+
- name: Verify path promotion readiness
99+
if: matrix.python-version == '3.12'
100+
timeout-minutes: 20
101+
run: uv run python -X utf8 tests/run.py gate path-promotion-readiness
102+
98103
- name: Verify repository simplification
99104
if: matrix.python-version == '3.12'
100105
timeout-minutes: 10

docs/skills/ops/foundation/testing-and-gates.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ uv run python -X utf8 tests/run.py gate web-learning
4848
uv run python -X utf8 tests/run.py gate landing-public
4949
uv run python -X utf8 tests/run.py gate local-studio-browser
5050
uv run python -X utf8 tests/run.py gate run-local-state-browser
51+
uv run python -X utf8 tests/run.py gate path-promotion-readiness
5152
uv run python -X utf8 tests/run.py gate path-learning-signal
5253
uv run python -X utf8 tests/run.py gate path-efficacy-confirmatory
5354
uv run python -X utf8 tests/run.py gate product-experience-browser
@@ -139,6 +140,7 @@ uv run python -X utf8 tests/run.py gate attempts
139140
| `landing-public` | surface | Landing·Learn의 실제 제품 media, Web-first CTA, lazy docs, SEO와 390/1440 responsive 렌더를 확인한다. |
140141
| `local-studio-browser` | surface | Local 학습, native file/zip/schedule 강검증, archive, 최소 창, Automation 표면을 확인한다. |
141142
| `run-local-state-browser` | surface | 같은 editor bundle의 Web·Local 노트북을 320px 최소 폭과 실행 중·성공·오류 상태로 비교하고, Web 자동화의 Local 필요 안내와 Local 연결 후 가용 상태를 독립 report로 확인한다. |
143+
| `path-promotion-readiness` | fast | 대표 6경로의 구조, mastery·transfer·retrieval, capstone artifact, solution 실행과 저작 무결성을 경로별 M0로 판정한다. R10 round와 current-content 사람 근거가 없으면 green이어도 모두 provisional이며 공개 승격은 차단한다. |
142144
| `path-learning-signal` | release | 대표 6경로마다 current content hash의 E2 pre/post/unseen-transfer 사람 근거를 확인하며 한 경로 실패를 평균으로 숨기지 않는다. |
143145
| `path-efficacy-confirmatory` | release | 대표 6경로마다 powered E3 confirmatory 사람 근거를 확인한다. shell 출시와 분리된 featured 승격 gate다. |
144146
| `product-experience-browser` | surface | Landing/Home·Learn, Web Lesson·Run, Web-to-Local evidence handoff, Local Lesson·Run·Automation의 대표 Chromium viewport에서 실제 theme/tier, 자산, overflow, control overlap, accessible name을 확인한다. |
@@ -178,9 +180,9 @@ uv run python -X utf8 tests/run.py gate attempts
178180

179181
`preflight`는 로컬 기본 확인이며 현재 `root-clean`, `docs`, `backend`를 실행한다. `backend`가 전체 pytest를 포함하므로 `teacher-eval``teacher-e2e`는 빠른 집중 확인용으로 둔다.
180182
`change-cycle`은 현재 `HEAD` 대비 변경 파일과 untracked 파일을 보고 일반 작업 완료에 필요한 gate만 고른다. 항상 `root-clean`, `docs`를 먼저 실행하고, `src/`·`tests/` 변경은 `backend`, `editor/` 변경은 `editor-build`, `launcher/` 변경은 `launcher-check``launcher-test`, `landing/` 변경은 `landing-build`, `curricula/` 변경은 `curriculum-quality-matrix`를 추가한다. 커리큘럼 전체 실행성, 브라우저 표면, 제품 품질 판정은 명시 gate나 `quality-cycle`에서 본다.
181-
`quality-cycle`은 제품이 잘 만들어졌는지 보는 반복 검증 단위다. 순서는 `root-clean` → `docs` → `backend` → `architecture-boundary` → `design-system-contract` → `theme-runtime-browser` → `visual-accessibility-browser` → `visual-assets` → `learning-method` → `learning-evidence-contract` → `learning-efficacy-report` → `learning-system-readiness` → `dogfood-alpha-audit` → `product-quality-audit` → `automation-ide-audit` → `diagnostic-summary-contract` → `ai-live-smoke` → `provider-settings-browser` → `install-launcher-smoke` → `runtime-recovery-contract` → `runtime-recovery-browser` → `pyproc-assets-browser` → `pyproc-runtime-fs-browser` → `pyproc-asgi-browser` → `curriculum-quality-matrix` → `repository-simplification` → `curriculum-executability` → `curriculum-top-tier-audit` → `playwright-curriculum-runtime` → `onboarding-browser` → `web-learning` → `landing-public` → `local-studio-browser` → `run-local-state-browser` → `product-experience-browser` → `astryx-journey` → `frontend-performance-budget` → `landing-build` → `launcher-test` → `learning-content`다. 이 명령은 완료 선언을 대신하지 않고, provider, 학습, 자동화, runtime, Astryx 공용 디자인, 대표 실제 화면, 웹 파이썬 자산·파일·서버, 설치/런처, 온보딩, 프론트 성능, architecture-boundary가 한 사이클에서 함께 버티는지 확인한다. 묶음 실행이 끝나면 runner는 통과한 gate 수, soft failure 수, gate별 duration summary, gate별 command log path/size/freshness, 현재 `gitHead`, `startedAt`/`completedAt`, 그리고 gate별 artifact freshness를 `output/test-runner/quality-cycle/sequence-summary.json`에 남긴다. `product-quality-audit`, `design-system-contract`, `theme-runtime-browser`, `visual-accessibility-browser`, `run-local-state-browser`, `product-experience-browser`, `astryx-journey`를 포함해 report를 쓰는 gate는 summary 안에 artifact path, fresh 여부, `payloadGitHead`, `gitHeadMatches`, `payloadStatus`가 함께 들어가야 하며 report의 git head가 sequence head와 다르면 artifact failure로 sequence를 실패시킨다. `product-quality-audit`의 10점은 `scoreKind: wiring-coverage`이며 `completionEligible: false`이므로 제품 100점이나 완료 선언으로 쓰지 않는다. 나머지 browser/runtime/curriculum artifact 계약과 live credential soft/hard failure 규칙은 각 개별 gate 설명을 따른다. 이 summary는 제품 SSOT가 아니라 사람이 읽는 완료 증거다.
183+
`quality-cycle`은 제품이 잘 만들어졌는지 보는 반복 검증 단위다. 순서는 `root-clean` → `docs` → `backend` → `architecture-boundary` → `design-system-contract` → `theme-runtime-browser` → `visual-accessibility-browser` → `visual-assets` → `learning-method` → `learning-evidence-contract` → `learning-efficacy-report` → `learning-system-readiness` → `dogfood-alpha-audit` → `product-quality-audit` → `automation-ide-audit` → `diagnostic-summary-contract` → `ai-live-smoke` → `provider-settings-browser` → `install-launcher-smoke` → `runtime-recovery-contract` → `runtime-recovery-browser` → `pyproc-assets-browser` → `pyproc-runtime-fs-browser` → `pyproc-asgi-browser` → `curriculum-quality-matrix` → `path-promotion-readiness` → `repository-simplification` → `curriculum-executability` → `curriculum-top-tier-audit` → `playwright-curriculum-runtime` → `onboarding-browser` → `web-learning` → `landing-public` → `local-studio-browser` → `run-local-state-browser` → `product-experience-browser` → `astryx-journey` → `frontend-performance-budget` → `landing-build` → `launcher-test` → `learning-content`다. 이 명령은 완료 선언을 대신하지 않고, provider, 학습, 자동화, runtime, Astryx 공용 디자인, 대표 실제 화면, 웹 파이썬 자산·파일·서버, 설치/런처, 온보딩, 프론트 성능, architecture-boundary가 한 사이클에서 함께 버티는지 확인한다. 묶음 실행이 끝나면 runner는 통과한 gate 수, soft failure 수, gate별 duration summary, gate별 command log path/size/freshness, 현재 `gitHead`, `startedAt`/`completedAt`, 그리고 gate별 artifact freshness를 `output/test-runner/quality-cycle/sequence-summary.json`에 남긴다. `product-quality-audit`, `design-system-contract`, `theme-runtime-browser`, `visual-accessibility-browser`, `run-local-state-browser`, `product-experience-browser`, `astryx-journey`를 포함해 report를 쓰는 gate는 summary 안에 artifact path, fresh 여부, `payloadGitHead`, `gitHeadMatches`, `payloadStatus`가 함께 들어가야 하며 report의 git head가 sequence head와 다르면 artifact failure로 sequence를 실패시킨다. `product-quality-audit`의 10점은 `scoreKind: wiring-coverage`이며 `completionEligible: false`이므로 제품 100점이나 완료 선언으로 쓰지 않는다. 나머지 browser/runtime/curriculum artifact 계약과 live credential soft/hard failure 규칙은 각 개별 gate 설명을 따른다. 이 summary는 제품 SSOT가 아니라 사람이 읽는 완료 증거다.
182184

183-
`product-release`는 별도 sequence다. machine gate와 Local·Web·Landing browser, launcher, 자동화, 제거 negative contract를 다시 실행한 뒤 `path-learning-signal`, `plan-quality`, strict `r10-independent-review`를 호출한다. E2 사람 근거나 R10 독립 평가가 없으면 마지막 strict gate에서 멈추고 `output/test-runner/product-release/sequence-summary.json`에 기록한다. `path-efficacy-confirmatory`는 shell 배포와 분리된 featured path E3 승격 gate다.
185+
`product-release`는 별도 sequence다. machine gate와 Local·Web·Landing browser, launcher, 자동화, 제거 negative contract를 다시 실행한다. `path-promotion-readiness`는 대표 6경로 M0를 먼저 확인하되 사람 근거를 대신하지 않으며, 이후 `path-learning-signal`, `plan-quality`, strict `r10-independent-review`를 호출한다. E2 사람 근거나 R10 독립 평가가 없으면 strict gate에서 멈추고 `output/test-runner/product-release/sequence-summary.json`에 기록한다. `path-efficacy-confirmatory`는 shell 배포와 분리된 featured path E3 승격 gate다.
184186

185187
`dogfood-alpha-audit/dogfood-alpha-report.json`도 같은 freshness·git head 규칙을 따른다. `ai-live-smoke`의 credential missing exit 2는 `softFailure: true`로 기록하고 `softFailureCount`에 포함하지만 sequence를 계속하며, 실제 provider 실패 exit 1은 hard failure로 중단한다.
186188

docs/skills/ops/product/learning-efficacy-operations.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,19 @@ whenToUse: 학습 경로 beta·featured 상태, formative study, learning signal
1111

1212
# Learning Efficacy Operations
1313

14-
학습 경로의 공개 상태는 `src/codaro/curriculum/efficacyStage.py`가 경로별로 판정한다. 여러 경로의 평균이나 전체 참가자 수로 실패한 한 경로를 승격하지 않는다.
14+
학습 경로의 공개 상태는 `src/codaro/curriculum/pathPromotion.py``efficacyStage.py`가 경로별로 판정한다. 여러 경로의 평균이나 전체 참가자 수로 실패한 한 경로를 승격하지 않는다.
1515

1616
| 단계 | 최소 근거 | 허용 claim |
1717
| --- | --- | --- |
18+
| M0 | 경로 구조, mastery·transfer·retrieval, capstone artifact, solution 실행, 저작 무결성 | `machineVerified`, provisional 유지 |
1819
| E0 | curriculum owner와 learning QA 승인, 현재 content hash | `contentApproved` |
1920
| E1 | 대표 사용자 8명 이상, usability report | `usable` |
2021
| E2 | 초보자 20명 이상, pre/post/unseen transfer, 완전한 연구 운영 계약 | `learningSignal` |
2122
| E3 | arm당 60명 이상, powered active/waitlist, effect report | `effectVerified` |
2223

2324
E2부터 `researchOwner`, `privacyOwner`, 모집 채널, 양수 예산 상한, 일정, consent, withdrawal route, encrypted raw store, access roster, 정확히 90일인 deletion job, preregistration URL·hash가 모두 필요하다. consent, withdrawal 동작, deletion job, secret·사용자 path redaction은 각각 SHA-256 receipt를 남긴다. owner 두 역할은 서로 달라야 하며 운영 계약에 secret, email, 사용자 filesystem path가 들어가면 실패한다. 하나라도 없으면 모집과 분석을 시작하지 않는다. content hash가 달라지면 이전 근거는 stale이며, E2는 인과효과 표현을 허용하지 않는다.
2425

25-
`PathReleaseState`는 E0을 internal, E1·E2를 beta, E3만 featured로 해석한다. `productReleaseAggregate`는 shell release 가능성과 모든 경로의 effect 검증을 별도 필드로 유지한다. 따라서 shell이 배포 가능해도 실패하거나 근거가 없는 경로는 featured로 승격되지 않는다.
26+
`PathPromotionState`는 M0를 사람 증거가 아니라 검수 입력 준비 완료로 해석한다. M0만 통과했거나 R10 round가 준비되지 않으면 공개 상태는 `provisional`이고 허용 claim은 `machineVerified`를 넘지 않는다. `PathReleaseState`는 E0을 internal, E1·E2를 beta, E3만 featured로 해석한다. M0, current-content E3, R10 round readiness가 모두 참일 때만 featured 승격이 가능하다. `productReleaseAggregate`는 shell release 가능성과 모든 경로의 effect 검증을 별도 필드로 유지한다. 따라서 shell이 배포 가능해도 실패하거나 근거가 없는 경로는 featured로 승격되지 않는다.
2627

2728
`src/codaro/releaseResearch.py``CompatibilityMilestone``verifyCompatibilityRelease`는 C0부터 목표 milestone까지 증거를 누적 검증한다. C1은 frozen `/app/`과 current `/run/` tree 분리, 하위 service worker scope, direct/deep reload, cold online Python, output collision 0을 요구한다. C2는 서로 다른 stable release 두 개, query·hash·back/forward, workflow 소유 cache와 두 tombstone path, exact release marker unregister를 요구한다. C3 telemetry threshold policy는 관측 전에 canonical hash로 봉인돼야 하고, 28일 이상 관측과 봉인된 표본·legacy request rate threshold를 만족한 뒤에만 asset retirement를 허용한다.
2829

@@ -31,4 +32,5 @@ E2부터 `researchOwner`, `privacyOwner`, 모집 채널, 양수 예산 상한,
3132
```powershell
3233
uv run pytest -q tests/product/testLearningEfficacyStage.py tests/product/testReleaseResearchCompatibility.py tests/product/testReleaseResearchOperations.py
3334
uv run python -X utf8 tests/product/verifyReleaseResearchOperations.py
35+
uv run python -X utf8 tests/run.py gate path-promotion-readiness
3436
```

0 commit comments

Comments
 (0)