name: ci
description: Use when running headless inside a GitLab CI job in the Gramax repo (the ai job). Establishes environment — repo checked out, glab/gh authenticated, what tools exist, how to read/post on GitLab, how to diagnose failed pipeline jobs. Triggers on "ci", "running in CI", "headless CI job", "ты в CI", "запущен в пайплайне".
Claude Code running headless in GitLab CI job for Gramax.
Environment
- Cwd = team workspace root (cloned fresh by
init.sh). Layout:gramax/— product repo, on MR source branch.cd gramaxfor code.docs/,board/— sibling repos (shallow)..claude/— workspace config + skills.
- GitLab host:
gitlab.ics-it.ru, projectics/doc-reader(id155). glabalready authed (GITLAB_HOST+GITLAB_TOKENset). Use for every GitLab op — read MRs, diffs, job logs, post notes.ghfor GitHub mirror (gram-ax/gramax, issues only).- Non-interactive: no prompts, no questions. Decide and act.
Tools in image
claude, glab, gh, git, bun, rg, fd, jq, uv/python3, openssh-client.
bun for JS/TS (bun run lint, bun run test <file>), rg/fd for search.
Current context
CI vars say where you are:
CI_MERGE_REQUEST_IID— MR (on MR pipeline).CI_MERGE_REQUEST_SOURCE_BRANCH_NAME/CI_MERGE_REQUEST_TARGET_BRANCH_NAME.CI_PIPELINE_ID— current pipeline.CI_PROJECT_ID(155),CI_PROJECT_PATH(ics/doc-reader),CI_SERVER_HOST.
CI vars omit MR body — pull live title/desc/diff with glab. Run from gramax/, or target -R ics/doc-reader:
glab mr view "$CI_MERGE_REQUEST_IID" -R ics/doc-reader
glab mr diff "$CI_MERGE_REQUEST_IID" -R ics/doc-reader
Diagnose failed pipeline jobs
Part of helping the dev: find which jobs failed and why, so you can propose a fix.
- List pipeline jobs, spot failed ones:
glab api "projects/155/pipelines/$CI_PIPELINE_ID/jobs?per_page=100" | jq -r '.[] | select(.status=="failed") | "\(.id)\t\(.name)\t\(.stage)"' - Read each failed job's log, find root cause (tail = error):
Quote shortest decisive error line. Map to source file/line in the diff.glab api "projects/155/jobs/<job-id>/trace" - Diagnose: lint break, test fail, type error, build error. Tie to the MR change that caused it.
- Tell dev concrete fix — file:line + what to change. If fix is small + safe, may commit it (attribution below).
Acting
- Reviews follow
merge-requestskill. Run first — checklist (description + task link +## Notes) is hard block before code review, defines comment style. - Prefer inline comments on exact lines (
merge-request→ REFERENCE.md → Inline comments), one thread = one finding, no status emoji. Summary MR note only for cross-file points not mapping to a line. Don't dump whole review in one note. - Output GitLab-flavored markdown. Reference files by path. Terse.
- Review: focus correctness bugs, security, clear simplifications. Skip style nits (Biome handles). Nothing material wrong → say so in one line.
- Attribution: commit or open MR → append the
Assisted-By: <model display name>footer (e.g.Assisted-By: Claude Opus 4.8). - Comment replies = bot. Any reply to an MR/review comment posts as the bot (bot token
GITLAB_CLAUDE_ACCESS_TOKEN). In CI that's the only token anyway; the rule matters when both tokens exist. - Conventions in
gramax/CLAUDE.md+ workspaceCLAUDE.md(cwd). Follow.
Persistent review context across runs
ai job persists context dir between runs on same MR (GitLab cache keyed by MR IID). CI script restores before start, saves after, exports:
AI_CONTEXT_DIR— abs path to persisted dir (always exists). Read/write state here.AI_REVIEW_MODE—fresh(first review) orcontinue(reviewed before).AI_LAST_REVIEWED_SHA— head reviewed last run (empty onfresh);AI_HEAD_SHA= current head.
State file: $AI_CONTEXT_DIR/review-state.md. Its presence + last-reviewed-sha flips next run to continue — always (re)write at end. Keep compact:
- Current head SHA + one-line MR summary.
- Findings table: finding → file:line → status (
open/fixed/wontfix/replied) → inline thread/discussion ID. - Open questions to author, waiting on.
- Latest MR note timestamp seen (detect new comments next run).
fresh mode
Full review. Read MR via glab (description, full diff), run merge-request checklist, post inline comments per finding, write review-state.md from scratch.
continue mode — resume, don't restart
- Read
$AI_CONTEXT_DIR/review-state.md— memory of prior review. - Read new MR comments since recorded timestamp (
glab mr view "$CI_MERGE_REQUEST_IID" --comments/ discussions API inmerge-request→ REFERENCE.md). Reply in-thread: resolve addressed, push back on wrong fixes, answer questions. - Review only new commits. Diff range, not whole MR:
git -C gramax diff "$AI_LAST_REVIEWED_SHA".."$AI_HEAD_SHA"(--statfirst to scope).AI_LAST_REVIEWED_SHA==AI_HEAD_SHA→ no new code, only process comments. Don't re-review unchanged code or re-post known findings. - Post new inline comments for new issues; update statuses of old findings as author fixes.
- Rewrite
review-state.md: bump head SHA + timestamp, merge new findings, update statuses.
last-reviewed-sha written by CI script after you finish — don't manage it yourself.
Architecte Docker Compose
DevOps
Concoit des configurations Docker Compose optimisees.
Rapport de Post-Mortem
DevOps
Rédige des rapports post-mortem d'incidents structurés et blameless.
Créateur de Runbooks
DevOps
Crée des runbooks opérationnels clairs pour les procédures DevOps courantes.