본문으로 건너뛰기
cccskills
무료GitHub에 공개

ci

Run this repo's CI end-to-end — the kolu-specific procedure on top of the odu runner: the odu MCP front door, banned opt-out flags, linux-only platform pinning, venue-pool leasing, fail-fast surfacing, e2e timing evidence, and the green-gate. Triggers on "run CI", "drive CI", "re-run the pipeline", "close the red check", "warm the pool". Runner mechanics live in the `/odu` skill.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

연동 도구GitHub
설치 방법 보기

포함된 파일(4)

  • SKILL.md7.7 KB
  • pu/diagnose.sh3.2 KB
  • pu/pool.sh3.2 KB
  • smoke.sh12.9 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

CI

Drive CI through the odu MCP server — the single front door. The runner is odu (npins-pinned by ci/flake.nix, nix run ./ci#odu): mcp__odu__run spawns the coordinator, mcp__odu__wait_for_settle blocks until settle or first red node (its verdict is stamped sha7#seq; pass expected_sha to hard-check), the surface://collections/logs/{id} resource drills into a failure, mcp__odu__node_rerun closes a red check. Runner mechanics: /odu skill.

Banned flags: never --no-post, --no-strict, --no-snapshot. CI here is always strict and always posts commit statuses — a run that doesn't post isn't CI, it's a private dry-run that leaves the PR unverified.

Push before CI — remote lanes git fetch the pinned SHA from origin; an unpushed commit can't run.

Sync master before CI, every run, whoever is driving. Fetch and merge origin/<default> unless it's already an ancestor (git merge-base --is-ancestor). The changelog is merge=union and never conflicts; a real conflict is yours to resolve now. Never merge while a gauntlet round is mid-commit — it races the index.

Every run is x86_64-linux ONLY. Pin it explicitly — platforms=["x86_64-linux"] — never trust a machine-local default: a platform you don't name silently drops, and an unpinned run picks up whatever hosts.json happens to list (today that includes a darwin box). A linux green IS the green this repo gates on; master's required-status set is linux-only.

Never run aarch64-darwin unless the user asks for it in THIS conversation. Not "to be safe", not because a change looks platform-shaped, not because an older note called two-platform coverage mandatory. Darwin's Nix closure still gets built by .github/workflows/nix-cache.yml on every push — that lane is GitHub's to drive, not yours.

<details> <summary>Asked for a darwin lane explicitly? Then, and only then:</summary>

Add "aarch64-darwin" to platforms and --platform aarch64-darwin to just ci::protect. A named platform with no pool entry is refused loudly (juspay/odu#46).

Read hosts.json, never this skill, for the box. The darwin fleet is volatile (this file hard-named the live box three times and was stale each time) — ~/.config/odu/hosts.json (nix run ./ci#odu -- hosts) is the only source of truth; copy entries verbatim when pinning (user@ and tailnet suffixes differ). Durable rules: under a coordinator, ask it before every darwin dispatch (single-tenant); treat fs-watch-class reds on darwin as suspect box environment and report before chasing; a dead pool entry silently stalls the whole darwin lane — report it for removal rather than waiting it out.

A companion repo's darwin lane uses --host aarch64-darwin=<box>, never inline $ODU_HOSTS — odu reads $ODU_HOSTS as a file path, so inline JSON is silently ignored and burns a run on a dead host.

</details>

Linux lane: odu leases natively from the warm Incus pool (kolu-ci-1..8 in hosts.json) — picks a free box, holds it for the run, releases on settle. No manual leasing. Saturated pool waits in line (no_wait: true to fail fast instead); nix run ./ci#odu -- hosts shows free/busy. To keep the same hot box across fix→rerun cycles, take an agent-held lease with mcp__odu__lease first and mcp__odu__release when done. Pool upkeep: just ci::pool-ensure / just ci::pool-status; warm idle slots by running the linux lane against master with a hosts= pin (strict and posting, like every run).

Fail fast on the MCP; don't drain the pipeline. wait_for_settle returns on the first red node with {failed[], errored[]} — read the red node's log (the log resource, or .ci/<sha7>/<platform>/<recipe>.log) and start the fix → fmt → commit → retry loop immediately. Waiting IS wait_for_settle re-invoked: an unsettled return at timeout means call it again — never park the wait on a background shell watcher over .ci/<sha7>/runs/ or a gh pr checks poll. A hand-guessed ledger predicate hangs silently, and a watcher that only detects settle forfeits first-red. errored (vs failed) means infrastructure death — node_rerun it rather than hunting a test bug.

pu misbehaves → log it on juspay/kolu#1204 via .apm/skills/ci/pu/diagnose.sh <stage> <host> (best-effort, never blocks the run). Capture the stage's stderr: pu create "$host" 2> >(tee /tmp/pu-$host.err >&2).

After a green settle, post e2e metrics to the PR. Source of truth: the run ledger .ci/<sha7>/runs/<seq>.json for each ci::e2e@<platform> node's recipe-wall durationMs and host (never Cucumber's internal timer), and the LAST ^e2e: workers= line in that node's own log (an unsharded lane's is .ci/<sha7>/<platform>/ci::e2e.log) for resolved parallelism. Maintain one comment keyed by the <!-- kolu-ci-e2e-metrics --> marker (edit if present, create if absent) with the run identity <sha7>#<seq> and a table of platform · host · workers · cores · cap · shards · e2e duration. Fail loud rather than comment if any ingredient is missing. Post only after the full run settles green, before reporting the gate.

ci::e2e is sharded, so the ledger carries shard nodes and the comment has rows for them. [metadata("odu:shard=4")] lets odu borrow up to four free pool slots on Linux; the slices are ledger nodes ci::e2e[k-of-N]@<platform> (their burst dependency copies are ci::e2e[k-of-N]::ci::install and …::ci::nix), and they fold into the ONE logical ci::e2e@<platform> node whose duration is the slowest slice. So:

  • the shards column is obtained/ceiling (3/4) — read the obtained count from the shard nodes present in the ledger, never assume four;
  • add one row per shard (host · workers · cores · duration) under the logical row. A sharded ci::e2e.log holds only odu's fold bracket ([odu] N shards started…), so each shard's ^e2e: workers= and e2e: shard=<k>/<N> lines come from its OWN .ci/<sha7>/<platform>/ci::e2e[k-of-N].log;
  • a darwin lane (only ever present when explicitly requested) has a single-host pool: 1/4 and exactly one row;
  • node_rerun targets ONE shard node (ci::e2e[2-of-3]@x86_64-linux), not the logical context: re-running the fold would re-run every slice.

The green-gate: every required status check green on the PR's current HEAD. Source the required list from just ci::protect --dry-run — the script pins x86_64-linux itself, so no --platform flag is needed (pass --platform aarch64-darwin only on a run you were explicitly asked to take to darwin). Verify with gh pr checks (a green from a retry counts).

Code-scanning alerts block merge too, and gh pr checks doesn't show them. Query by PR number, never by branch ref — code scanning here is GitHub's default setup, which analyses only the default branch and refs/pull/<n>/*, so a ref=refs/heads/<branch> query answers "no alerts" about a ref nobody scanned (measured on #2017: branch ref → 0, pr=2017 → an open HIGH):

gh api "repos/{owner}/{repo}/code-scanning/alerts?state=open&pr=<n>" \
  --jq '.[] | "\(.rule.security_severity_level) \(.rule.id) \(.most_recent_instance.location.path):\(.most_recent_instance.location.start_line)"'

Fix every alert on code this PR introduced; name (don't silently ignore) any pre-existing alert on untouched code.

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

blog-post

무료

Write a kolu blog post grounded in the real build history — mine the Claude Code session logs behind a feature for the actual story (for large efforts, fan out over the transcripts with an ultracode workflow), draft it in the author's voice, and wire it into the Astro site. Use when asked to write a blog post or engineering essay about something that was built, especially one that should read as a narrative of what actually happened rather than invented marketing copy.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

juspay/kolu822026년 10월 19일 업데이트

Launch the kolu dev server on two RANDOM free ports so it never collides with the running production `kolu.service`, remember the ports for the rest of the session, and tear down only the dev instance. Load before running the app locally — for evidence capture, driving a live kolu with the chrome-devtools MCP, or any `just dev` you'd otherwise run by hand. Triggers on "run kolu locally", "launch the dev server", "boot kolu", "drive a live kolu", "start the app to screenshot it", or before pointing chrome-devtools at a local kolu.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

juspay/kolu822026년 10월 19일 업데이트

diataxis

무료

Classify, write, and audit documentation per Diátaxis (diataxis.fr) — the four-quadrant method (tutorials · how-to guides · reference · explanation). Encodes the compass as a decision procedure, each quadrant's contract as hard rules, and an executable mixed-mode audit. Project-agnostic; the per-repo doc-location mapping lives in a repo rule of the project's own (kolu: `.apm/instructions/diataxis.instructions.md`). Use when writing any user-facing doc, structuring a docs site, or auditing existing docs for mixed modes.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

juspay/kolu822026년 10월 19일 업데이트

evidence

무료

Produce visual PR evidence — a screenshot or video — whenever a change has on-screen impact. Tests are never a substitute; a change can be backend by cause and visible by effect. Capture via the project's e2e harness on a pu box, or by driving a live kolu with the chrome-devtools MCP; host on a GitHub release and post a `## Evidence` comment. Triggers on "post evidence", "screenshot the change", "record a video of this", "show it working", "prove it", or finishing any change whose effect is visible on screen.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

juspay/kolu822026년 10월 19일 업데이트

Create distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, artifacts, posters, or applications (examples include websites, landing pages, dashboards, React components, HTML/CSS layouts, or when styling/beautifying any web UI). Generates creative, polished code and UI design that avoids generic AI aesthetics.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

juspay/kolu822026년 10월 19일 업데이트

Audit an implementation against its plan with a hostile peer agent, debate findings to consensus, and drive fix waves until the auditor runs dry. Use when a done-claim needs verification the implementer cannot game ("hostile review", "adversarial audit", "is this PR faithful", "find the escape hatches") — the loop that beats the laziness bias with its own game theory.

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

juspay/kolu822026년 10월 19일 업데이트

juspay의 스킬 모두 보기

이 스킬의 문제 신고