OpenWork 기능 플래그를 코딩 전에 등록하고 조직 및 배포 환경별로 단계적으로 공개하며, 문제가 생기면 전체 배포에서 중단하고 공개 완료 후 임시 플래그를 제거합니다. 코드 검사와 진행 중인 작업, 저장 데이터, 기록을 중단 시 어떻게 처리할지도 다룹니다.
- 구현 전에 새 기능 등록
- 지정한 조직부터 단계적으로 공개
- 클라우드와 자체 호스팅 범위 분리
측정값으로 풀 리퀘스트 CI에서 시간이 많이 드는 작업과 단계를 찾고, 개선안을 하나씩 시험합니다. 전후 결과를 비교해 측정 오차를 넘는 효과가 있고 모든 검사가 같은 문제를 계속 찾아낼 때만 변경을 유지합니다.
CI is slow, time to green, how long do checks take, p50/p90, make CI faster, speed up a job or spec, hillclimb CI. Use to measure PR CI time, find where a job's seconds go, and land speedups one measured change at a time without weakening any check.
실행 점수 미검증
설치 방법 보기이 스킬은 느낌에 의존하지 않고 CI 시간을 측정합니다. 풀 리퀘스트를 푸시한 시점부터 필수 검사가 통과할 때까지, 그리고 모든 GitHub Actions 검사가 끝날 때까지 걸린 시간을 집계합니다. 중앙값과 상위 백분위수로 기준값을 기록하고, 작업과 단계별 소요 시간 및 테스트 기록을 살펴 시간이 쓰이는 곳을 찾습니다. 개선 가설을 한 번에 하나씩 시험하고 비슷한 조건의 실행 결과와 비교합니다.
CI가 느리지만 원인을 모를 때 작업이나 테스트 중 어디가 오래 걸리는지 찾는 데 도움이 됩니다. 측정 결과를 바탕으로 서비스 시작, 중복 빌드, 반복적인 준비 작업 같은 개선 후보를 찾을 수 있습니다. 속도를 높이면서 결함을 발견하는 검사와 병합 전 필수 검사를 유지하려는 경우에 적합합니다.
GitHub Actions 실행 정보와 저장소의 CI 측정 스크립트를 사용합니다. 비교하려면 같은 종류의 실행기에서 기준 실행이 필요합니다. 검사를 약화하거나 생략하면 안 되며, 변경 후에도 같은 문제를 찾아내야 합니다.
이 소개문은 공개된 SKILL.md를 바탕으로 AI(OpenAI Codex)가 작성했습니다. 정확한 사양은 아래 원문을 확인하세요.
AI가 SKILL.md의 내용에서 주의가 필요한 작업과 도입 전제를 확인했습니다. 점수는 실제로 실행한 결과(실행 검증)만으로 매깁니다.
점수에는 넣지 않았습니다. 2026년 10월 28일 기준으로 AI(OpenAI Codex)가 판정했습니다. 참고용이므로 설치 전에 원문도 확인해 주세요.
설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.
CI speed is a measured number, not a feeling. Measure it the same way every time, find where the seconds actually go, change one thing, measure again, keep it only if the number moved and every check still guards what it did.
node .github/scripts/ci-time-to-green.mjs --hours 24 # all PRs
node .github/scripts/ci-time-to-green.mjs --hours 6 --branch-prefix perf/ci-x --json
required: push → last merge-gating check green (openwork-tests-required, warden-clear).full: push → last GitHub Actions check green. "Evidence preview" is ignored (a link, not a test).Record the baseline (p50/p90/p99 and n) before changing anything. Compare
p50/p90 with at least ~20 commits; one PR's run is a data point, not a trend.
Never guess from YAML. Read the timings GitHub and the test kit already record.
# Every job and step of a run, with durations
gh run view <run-id> --json jobs --jq '.jobs[] | "\(.name)", (.steps[] | " \(.name)")'
gh api repos/different-ai/openwork/actions/jobs/<job-id> \
--jq '.steps[] | "\(((.completed_at|fromdate)-(.started_at|fromdate)))s \(.name)"'
# Full log (strip colours)
gh api --allow-escape-sequences repos/different-ai/openwork/actions/jobs/<job-id>/logs | sed 's/\x1b\[[0-9;]*m//g'
For e2e specs, download the run's pr-proof-* artifacts and read
test-runs/*/test-run.json: every trace entry has a stage, channel,
verb and ms. Sum ms by (stage, channel, verb):
world/seed/den|desktop|appWeb is time spent starting services; body/* is
the test. Compare createdAt/closedAt with the first and last trace entry
to see setup and teardown the trace does not cover.
Things that look slow but are not the cause until measured: runner pickup (usually ~3s), the test's own assertions. Things that usually are: starting services per test, rebuilding the same commit in several jobs, waiting on something no assertion uses, repeated setup in every matrix job.
Work down this list (the classic performance mantras) and stop at the first rung that reaches the target:
dev.Rung 7 alone rarely gets far: folding the Den API test schema DDL and an in-memory MySQL saved 18s on a 134s step. Rungs 1-3 remove minutes.
next dev
and recompiles per test"), never "try caching".dev, or the same job on
dev). Laptop wall times are not evidence: other work on the machine
moved the same suite between 94s and 147s.decision.tsv outside the repo:
id, hypothesis, change, before, after, delta, tests, verdict, note.git fetch --depth=1 in any
worktree writes .git/shallow for every worktree and the main checkout;
rebases then replay the whole history. CI scripts that fetch with depth 1
are for CI only. If it happens: confirm the parents of the shallow commit
exist (git cat-file -e), move .git/shallow aside, run
git fsck --connectivity-only.origin/dev; do not touch someone else's
checkout, branch or running containers. Start your own MySQL on a free
port with a unique name, and remove it afterwards.TZ=UTC, or the
hourly sign-in tests fail for reasons unrelated to your change.gh pr list), and
re-measure after rebasing onto a dev that changed the job you measured.dev invalidates every comparison: fix or wait for it first
(diagnose-a-red-run).Name the job and step, the control run and your run, and the seconds:
"Run Den API security tests: 134s → 116s (run A vs run B, same runner)."
State Release note: none. Follow open-a-pr.
아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.
로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.
아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.
OpenWork 기능 플래그를 코딩 전에 등록하고 조직 및 배포 환경별로 단계적으로 공개하며, 문제가 생기면 전체 배포에서 중단하고 공개 완료 후 임시 플래그를 제거합니다. 코드 검사와 진행 중인 작업, 저장 데이터, 기록을 중단 시 어떻게 처리할지도 다룹니다.
OpenCode 브라우저 도구를 로컬에서 실행 중인 OpenWork Electron 앱에 연결해 화면을 살펴보고, 작업을 입력해 전송한 뒤 응답을 확인합니다. CDP를 이용한 탐색과 디버깅을 지원합니다.
변경 사항의 추가된 줄에서 고객, 잠재 고객, 협력사 또는 외부 개인을 식별할 수 있는 정보를 확인합니다. 내용을 되풀이하지 않고 위치와 최소 수정 방안을 보고하며, 이미 공개된 정보는 상위 대응으로 넘깁니다.
Claude Code와 Codex 같은 AI 클라이언트를 OpenWork MCP Gateway에 연결해 조직의 스킬, 플러그인, 외부 연결을 사용하도록 안내합니다. 브라우저 인증을 진행하고 기능 검색·실행 도구가 로드되었는지 확인합니다.
외부 기여자의 풀 리퀘스트 코드를 실행하기 전에 난독화, 숨겨진 통신, 의심스러운 의존성, 설치 및 빌드 스크립트를 살펴봅니다. 파일 위치와 관리자가 확인할 사항을 함께 제시합니다.
OpenWork용 OpenCode 플러그인을 만들고 사용자 정의 도구와 훅, 설정 파일 항목을 구성합니다. 도구의 실행 로직을 작성하고 특정 시점에 코드를 실행하도록 설정할 수 있습니다.