@cxi-lmai/ci-agent-platform 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +219 -0
  3. package/bin/init.mjs +236 -0
  4. package/package.json +47 -0
  5. package/payload/INSTALL.md +113 -0
  6. package/payload/agents/agent-architect.md +101 -0
  7. package/payload/agents/code-reviewer.md +87 -0
  8. package/payload/agents/codebase-auditor.md +73 -0
  9. package/payload/agents/coder.md +56 -0
  10. package/payload/agents/decomposer.md +70 -0
  11. package/payload/agents/docs-sync.md +115 -0
  12. package/payload/agents/e2e-test-writer.md +47 -0
  13. package/payload/agents/migration-reviewer.md +100 -0
  14. package/payload/agents/orchestrator.md +50 -0
  15. package/payload/agents/performance-reviewer.md +82 -0
  16. package/payload/agents/postmortem.md +83 -0
  17. package/payload/agents/release-mr.md +274 -0
  18. package/payload/agents/security-reviewer.md +122 -0
  19. package/payload/agents/test-fix.md +33 -0
  20. package/payload/agents/test-writer.md +40 -0
  21. package/payload/ci-templates/claude-pipeline.gitlab-ci.yml +233 -0
  22. package/payload/ci-templates/github/README.md +76 -0
  23. package/payload/ci-templates/github/claude-issue-pipeline.yml +141 -0
  24. package/payload/ci-templates/github/claude-pipeline.yml +141 -0
  25. package/payload/ci-templates/github/claude-test-fix.yml +104 -0
  26. package/payload/ci-templates/scripts/code.sh +114 -0
  27. package/payload/ci-templates/scripts/lib/issue-loop.sh +430 -0
  28. package/payload/ci-templates/scripts/lib/pipeline-common.sh +280 -0
  29. package/payload/ci-templates/scripts/lib/platform.sh +177 -0
  30. package/payload/ci-templates/scripts/lib/usage-capture.sh +110 -0
  31. package/payload/ci-templates/scripts/orchestrate.sh +294 -0
  32. package/payload/ci-templates/scripts/postmortem.sh +45 -0
  33. package/payload/ci-templates/scripts/review-fix.sh +90 -0
  34. package/payload/ci-templates/scripts/review.sh +93 -0
  35. package/payload/ci-templates/scripts/test-fix.sh +58 -0
  36. package/payload/skills/fix-review-findings/SKILL.md +79 -0
  37. package/payload/skills/fix-tests/SKILL.md +70 -0
  38. package/payload/skills/implement-issue/SKILL.md +62 -0
  39. package/payload/skills/init-pipeline-config/SKILL.md +96 -0
  40. package/payload/skills/postmortem-mr/SKILL.md +50 -0
  41. package/payload/skills/review-mr/SKILL.md +82 -0
  42. package/payload/skills/triage-issue/SKILL.md +74 -0
  43. package/payload/templates/pipeline-config.template.md +98 -0
  44. package/payload/templates/review_suppressions.template.md +25 -0
  45. package/payload/templates/spec-issue.template.md +64 -0
@@ -0,0 +1,70 @@
1
+ ---
2
+ name: fix-tests
3
+ description: Fix a failing test stage in a CI merge request or pull request. Handles three cases from one entry point, failing tests reported in the test artifacts, a compilation error that stopped the tests from running, and a coverage drop. Respects the fix-loop cap, verifies the fix, and commits without pushing. Use this when a CI test job failed and needs an automated fix attempt.
4
+ ---
5
+
6
+ # fix-tests
7
+
8
+ Generic replacement for `test-fix.sh`. The CI job runs `claude "/fix-tests"` after a failed test stage. This skill diagnoses which of the three cases it is, delegates to the right agent, verifies, and commits. The runner keeps checkout, rebase, push, and the label and comment API calls.
9
+
10
+ ## Step 1: read the project configuration
11
+
12
+ Read `$PIPE_CONFIG_PATH` (default `.claude/pipeline-config.md`). You need the Build & Tests section (commands and report paths), the testing document from the Documentation Map, and the Domain Checks. If the file is missing, say so on the first line and continue generically.
13
+
14
+ ## Step 2: inputs
15
+
16
+ - `$PIPE_TEST_REPORT_GLOB`: glob for the test report files (for example JUnit XML). Read these to find failing cases.
17
+ - `$PIPE_COVERAGE_SIGNAL`: path to a coverage-drop signal file the coverage gate wrote, if any. Its content names the baseline and current coverage.
18
+ - `$PIPE_VERIFY_CMD`: full verification command (compile plus unit tests) to run after a fix.
19
+ - `$PIPE_COMPILE_CMD` (default: same as `$PIPE_VERIFY_CMD`): compile-only command, used to reproduce a compilation error and to check the coverage branch.
20
+ - `$PIPE_FIX_LOOP_CAP` (default `2`): maximum consecutive bot fix commits before escalating.
21
+ - `$PIPE_COMMIT_TESTFIX`: exact commit subject for a test fix. Its recurrence drives the cap count.
22
+ - `$PIPE_COMMIT_COVERAGE`: exact commit subject for a coverage-tests commit. Separate cap counter.
23
+ - `$PIPE_TARGET_BRANCH`: the branch the MR/PR targets, used as the base for the commit-history walk.
24
+ - `$PIPE_CONTEXT_DIR` (default `build/pipeline`): where you write the result marker.
25
+
26
+ ## Step 3: pick the case
27
+
28
+ In this order:
29
+
30
+ 1. **Failing tests.** Read the reports matched by `$PIPE_TEST_REPORT_GLOB`. If any report shows failures or errors, this is the test-fix case. Collect the failing class names, messages, and stack traces.
31
+ 2. **Coverage drop.** No failing tests, but `$PIPE_COVERAGE_SIGNAL` exists and is non-empty. This is the coverage case. Read the baseline and current values from it.
32
+ 3. **Compilation error.** No failing tests and no coverage signal, and no test reports were produced at all. The test stage crashed before tests ran, most likely a compilation error. Reproduce it by running `$PIPE_COMPILE_CMD` and capture the error output.
33
+ 4. **Nothing to do.** Tests produced results and all passed, no coverage signal. This was a false-alarm trigger. Write the marker with `FIX_BRANCH=none` and stop.
34
+
35
+ ## Step 4: cap check
36
+
37
+ Count consecutive commits from the branch tip back toward `$PIPE_TARGET_BRANCH` whose subject matches the relevant commit subject (`$PIPE_COMMIT_TESTFIX` for the test-fix and compilation cases, `$PIPE_COMMIT_COVERAGE` for the coverage case). Use local git, no token:
38
+
39
+ ```
40
+ git log "origin/$PIPE_TARGET_BRANCH"..HEAD --format="%s"
41
+ ```
42
+
43
+ Stop counting at the first subject that does not match. If the count is at or above `$PIPE_FIX_LOOP_CAP`, do not attempt another fix. Escalate instead: follow the postmortem-mr flow (spawn the `postmortem` agent with the failure text, the fix-attempt git log, and the changed files, then read `failure_category` from its report). Write the marker with `FIX_ESCALATE=true` and the `FAILURE_CATEGORY`, and stop. The job applies the stuck label and posts the diagnostic.
44
+
45
+ ## Step 5: delegate
46
+
47
+ - **Test-fix and compilation cases**: spawn the `test-fix` agent (Agent tool, `subagent_type: test-fix`). Pass the failure details (test failures or the compilation output) and the exact commit subject `$PIPE_COMMIT_TESTFIX`. The agent reads the config and the testing document itself, fixes the root cause in the implementation or the test, and commits.
48
+ - **Coverage case**: spawn the `test-writer` agent (`subagent_type: test-writer`). Pass the baseline and current coverage, the diff of new code (`git diff "origin/$PIPE_TARGET_BRANCH"..HEAD` scoped to source files), and the exact commit subject `$PIPE_COMMIT_COVERAGE`.
49
+
50
+ Tell the agent the commit subject must be exactly the value above, because the cap counter matches on it. Tell it not to run `git push`.
51
+
52
+ ## Step 6: verify
53
+
54
+ - Test-fix case: run `$PIPE_VERIFY_CMD` (compile plus unit tests).
55
+ - Coverage and compilation cases: run `$PIPE_COMPILE_CMD`. The pushed pipeline re-runs the full suite and re-measures coverage, so a compile check is enough here.
56
+
57
+ If verification fails, the agent's self-correcting loop should have handled it. Do not push a state that does not compile.
58
+
59
+ ## Step 7: emit the result marker
60
+
61
+ Write `$PIPE_CONTEXT_DIR/fix-tests.env` as dotenv:
62
+
63
+ ```
64
+ FIX_BRANCH=tests|coverage|compile|none
65
+ FIX_COMMIT_MADE=true|false
66
+ FIX_ESCALATE=true|false
67
+ FAILURE_CATEGORY=<category or empty>
68
+ ```
69
+
70
+ Set `FIX_COMMIT_MADE=true` only when the consecutive-commit count grew during this run, meaning the agent actually committed. The job pushes when a commit was made, escalates the labels when `FIX_ESCALATE=true`, and skips silently when `FIX_BRANCH=none`.
@@ -0,0 +1,62 @@
1
+ ---
2
+ name: implement-issue
3
+ description: Implement one issue in the autonomous issue-to-code loop. Delegates to the coder agent to write the code, tests, and a commit on the already-checked-out branch, confirms the coder did not push, and drafts the merge/pull request description from the diff. Writes a machine-readable result the CI runner acts on. Use this when a CI code job asks to implement an issue.
4
+ ---
5
+
6
+ # implement-issue
7
+
8
+ Generic replacement for the coder delegation in `code.sh`. The code job runs `claude "/implement-issue"` instead of building the delegation prompt in bash. This skill delegates to the coder and drafts the MR/PR body. The runner keeps only checkout, git identity, the push, and the MR/PR creation (all token or plumbing work).
9
+
10
+ ## Step 1: read the project configuration
11
+
12
+ Read the config file at `$PIPE_CONFIG_PATH` (default `.claude/pipeline-config.md`). From it you need the Project stack, the Git & Platform section (commit convention, MR/PR description format), and the Documentation Map. If the file is missing, say so on the first line of your output and continue with generic behavior.
13
+
14
+ ## Step 2: inputs
15
+
16
+ - `$PIPE_CONTEXT_DIR` (default `build/pipeline`): where the prepared context lives and where you write outputs.
17
+ - `$PIPE_CONTEXT_DIR/coder-input.md`: the issue IID, title, and description. The job wrote this from the platform API.
18
+ - `$PIPE_ISSUE_IID`: the issue number being implemented.
19
+ - `$PIPE_TARGET_BRANCH`: the integration branch the MR/PR will target. The runner has already checked out the feature branch on top of it.
20
+
21
+ The repository is already checked out on the feature branch. Git is local, no token needed.
22
+
23
+ ## Step 3: delegate to the coder
24
+
25
+ Spawn the `coder` agent (Agent tool, `subagent_type: coder`) with the issue IID, title, and description from the context file, instructing it to implement the issue. The coder reads the config and the Documentation Map itself, explores existing patterns, implements, writes tests through the test-writer agent, runs the project verify command in a self-correcting loop, and commits. Do not restate its internal rules.
26
+
27
+ The coder must NOT push. Pushing is the runner's job. After the coder returns, confirm no push happened: the coder has no push step, but if the working tree or branch state shows an attempted push, note it in your output. The commits stay local for the runner to push.
28
+
29
+ ## Step 4: check what the coder produced
30
+
31
+ Run `git rev-list "origin/$PIPE_TARGET_BRANCH..HEAD" --count` to count the commits the coder made this run. Write it to the result marker. If it is zero, the coder made no changes (nothing to implement, or it got stuck). Do not draft an MR/PR body in that case; the runner handles the no-commits path.
32
+
33
+ ## Step 5: draft the MR/PR body
34
+
35
+ Only when there is at least one commit, draft the description from the actual diff. Read it with `git diff "origin/$PIPE_TARGET_BRANCH..HEAD"` scoped to source paths. Do this in this session, do not spawn another claude process for it. Write `$PIPE_CONTEXT_DIR/mr-summary.md` using exactly this structure, no preamble, no extra headings:
36
+
37
+ ```
38
+ ## Summary
39
+ - <what changed and why, 2-4 bullets>
40
+
41
+ ## Testing
42
+ - <what was tested, 1-3 bullets>
43
+
44
+ ## Reviewer notes
45
+ - <decisions or non-obvious choices a reviewer should validate, 1-3 bullets; omit this whole section if nothing to flag>
46
+ ```
47
+
48
+ Bullet text only (no bold labels), one line per bullet. Omit a section that has nothing meaningful to say. Follow any MR/PR description convention the config's Git & Platform section defines.
49
+
50
+ ## Step 6: emit the result
51
+
52
+ Write `$PIPE_CONTEXT_DIR/implement.env`:
53
+
54
+ ```
55
+ IMPL_COMMITS=<integer count of commits this run>
56
+ IMPL_PUSHED=false
57
+ IMPL_SUMMARY_FILE=<path to mr-summary.md, or empty when no commits>
58
+ ```
59
+
60
+ ## What the CI job does after you
61
+
62
+ The runner reads `implement.env`, recounts the commits itself as the authoritative gate, and acts: with zero commits it comments on the issue and applies the stuck label (no MR/PR); otherwise it pushes the branch and opens the MR/PR titled by the closing-commit convention, with the issue's labels inherited (ready swapped for wip) and the drafted summary as the body. None of that is your job.
@@ -0,0 +1,96 @@
1
+ ---
2
+ name: init-pipeline-config
3
+ description: Onboard a repository to the ci-agent-platform pipeline, end to end. Scans the project and generates a prefilled pipeline-config.md, walks the human through every open TODO interactively, wires the CI template into the repo itself, and hands over a guided checklist for secrets and the smoke test. Use this when setting up the pipeline in a new repo, or when someone asks to generate or refresh the pipeline config.
4
+ ---
5
+
6
+ # init-pipeline-config
7
+
8
+ Guided onboarding wizard for the whole pipeline setup. One invocation takes the repository from "no pipeline" to "ready for the smoke test". The human answers questions and approves commits; the wizard does the work.
9
+
10
+ Ground rules for the whole run:
11
+
12
+ - Runs interactively, not inside CI. It calls no agent and makes no paid pipeline run.
13
+ - Never push. Commits happen only after the user approves them; pushing is offered, never done silently.
14
+ - Never accept secret values (API keys, tokens) into the conversation. Name them, say where the human sets them, and verify presence, not values.
15
+ - Do not overwrite an existing config or CI file without showing the diff and asking.
16
+ - Leave `TODO` for anything you cannot detect or the user cannot answer now. Do not invent values.
17
+ - Everything you write, in the config and on screen: plain factual sentences. No em dashes, no semicolons in prose, no filler. Any count you state (files, agents, skills, labels, and the like) comes from the output of a command you run in that same step (`ls <dir> | wc -l`, `git ...`, and so on), never from memory, a prior turn, or an estimate. When you cannot run the command, say the count is unknown rather than guess.
18
+ - Maintain `.claude/onboarding-state.md` as you go: after every phase, and after every completed step of phase 4, rewrite it with the phase you are in, the decisions made so far, and the exact next action. It is gitignored (`INSTALL.md` step 1.4), never committed, and you delete it at the end of phase 5. A session resuming an interrupted onboarding reads it first and continues by this skill, never by improvisation.
19
+
20
+ Source paths: `<root>` below means the first candidate that actually contains `templates/pipeline-config.template.md`, tested in this order: `.claude/` (a completed vendored install, see `INSTALL.md`), then `.ci-agent-platform-src/` (the folder the bootstrapper unpacked). Test for that file, never for the directory: do not choose `.claude/` merely because it exists. If neither candidate has it, search one level below the repository root for any directory containing `templates/pipeline-config.template.md` and use that. Matching on the file rather than on a directory name is deliberate, so a renamed or relocated source folder still resolves.
21
+
22
+ ## Phase 1: scan and draft
23
+
24
+ 1. Read the config template at `<root>/templates/pipeline-config.template.md`. It defines the required sections. The output keeps this structure.
25
+ 2. Scan the repository. Detect, without guessing where you can read the answer:
26
+ - **Language and build system.** The build manifest (Gradle or Maven build file, `package.json`, `pyproject.toml`, `go.mod`, `Cargo.toml`). Read the stack and versions from it. Derive the compile, test, and coverage commands from the same file and its scripts. The verify command must be runnable inside `PIPE_CI_IMAGE`: the default `node:22-bookworm` ships python3 but no pip and no ensurepip, so for a Python project on the default image compose `PIPE_VERIFY_CMD` with a pip bootstrap, `apt-get update -qq && apt-get install -y -qq python3-pip && python3 -m pip install --break-system-packages -q pytest && python3 -m pytest -q` (adapt the installed packages to the manifest), or record a `PIPE_CI_IMAGE` override instead.
27
+ - **Git platform and CLI.** Read the remote host without credentials: `git remote get-url origin | sed -E 's#//[^/@]+@#//#'`. Never print the raw remote URL, it may embed an access token. A GitLab host means the `glab` CLI, a GitHub host means `gh`. Record the platform; it drives phase 3.
28
+ - **Branch model.** Detect the default branch in this order: `git symbolic-ref refs/remotes/origin/HEAD` (the remote's default), else the current local branch. Record it as the proposed pipeline target branch; it is not a TODO. Also note a separate integration branch if one exists and the branch-naming convention if the docs state one. When local and remote disagree, or project files reference a branch that does not exist, keep your detected value as the proposal and mention the discrepancy in one sentence when confirming (phase 2), offering to fix it; do not present it as a blocker.
29
+ - **Documentation map.** Map the standard topics (testing, migrations, domain, integrations, security, performance, release, git workflow, e2e) to the files whose names or headings match.
30
+ - **Issue and PR templates.** The platform template directory (`.gitlab/issue_templates/`, `.github/`).
31
+ - **Test infrastructure.** Test report output path, coverage tool and its report path.
32
+ - **Labels.** Existing labels that can serve the six lifecycle roles (ready, wip, stuck, blocker, blocked, decomposed). When the project has none, propose the `pipe-*` defaults.
33
+ 3. Fill the template from what you detected. Prefer a link to an existing doc plus the key facts over copying content (anti-drift). Mark unused sections `not used`. Write the draft to `$PIPE_CONFIG_PATH` (default `.claude/pipeline-config.md`). Write plain factual sentences, in the config file and in everything you print to the user: no em dashes, no semicolons in prose, no filler.
34
+ 4. Show the user a short scan summary: what you detected, what is TODO and why.
35
+
36
+ ## Phase 2: human onboarding (interactive)
37
+
38
+ Do not hand the user a homework list. Walk them through it:
39
+
40
+ 1. Start with one confirmation of the detected basics in a single question: "The pipeline will target branch `<detected>` on `<platform>`. Correct?" Detected values are proposals to confirm, never open questions.
41
+ 2. Split the remaining `TODO`s into two groups. **Defaultable:** the repo gives a defensible answer (coverage tooling absent means the policy is `not used`, Domain Check candidates read from the code, standard paths). Apply these without asking and keep them for the summary in step 4. **Genuinely open:** the repo gives no signal at all (a convention nobody wrote down, a check only a human knows about). Only these earn a question. Branch naming is not a question: with no repository convention use `<issue-iid>-<kebab-title>`, which is exactly what the runner accepts.
42
+ 3. Ask one scheduling question because frequency is a project policy, not a detectable technical fact: should the issue loop stay manual/disabled, run nightly on selected days, or use a custom cron? Recommend manual/disabled until both smoke tests pass. For a schedule, record days, local time, and time zone. Convert to UTC only for GitHub Actions; GitLab stores the chosen cron time zone. Then ask the other genuinely open items one concrete question at a time, in config order, each with a suggested default when possible. In a typical repo this is one to three questions total. Do not ask for the bot account username: the runner resolves it from the token at runtime (`platform_resolve_bot_user`); the account itself gets created with the token in phase 4. Apply each answer to the config immediately; the user never edits the file by hand during this phase.
43
+ 4. Close with one review summary of everything that was set: detected, defaulted, and answered, with the applied Domain Checks listed item by item. Invite the user to add, remove, or change anything; apply the edits. This summary is the safety net that lets steps 2-3 default aggressively.
44
+ 5. Then show the final config. As part of the `INSTALL.md` install, do not commit yet: one commit at the end of phase 3 covers the installed files, the config, and the wiring together. Only when the skill runs standalone (config refresh in an already-installed repo) offer the commit here, message `ci: pipeline config`.
45
+
46
+ ## Phase 3: wire the CI template
47
+
48
+ Do this yourself; it is mechanical. The human only approves the diff. When the `INSTALL.md` step 1 already copied the template and scripts into place, skip the copies and only do the wiring edits.
49
+
50
+ **GitLab** (detected in phase 1):
51
+
52
+ 1. Create `.claude-pipeline/` and copy `<root>/ci-templates/claude-pipeline.gitlab-ci.yml` and `<root>/ci-templates/scripts/` into it.
53
+ 2. Edit the project `.gitlab-ci.yml`: ensure the stages the template needs (`orchestrate, code, test, review`), add the `include:` of the vendored template, and add the non-secret `PIPE_*` values from the config that differ from the template defaults (typically `PIPE_VERIFY_CMD`, `PIPE_TEST_REPORT_GLOB`) as top-level `variables:`. Always write `PIPE_TARGET_BRANCH` with the branch detected in phase 1, as a literal: a nested `$CI_DEFAULT_BRANCH` is not expanded inside `rules:` comparisons and would silently disable every MR job (E2E finding N-3). You know the values since phase 1; wiring them now keeps phase 4 free of commits. Do not touch the project's own jobs without asking.
54
+ 3. Check the project's own test job: when neither its `rules:` nor a `workflow:` block makes it run in `merge_request_event` pipelines, the template's `test-fix` job can never fire (its `needs: test` finds no test job in the MR pipeline, E2E finding N-4). Tell the user and offer a concrete diff that adds the missing rule. Apply it only after they agree.
55
+ 4. Copy `<root>/templates/spec-issue.template.md` to `.gitlab/issue_templates/Spec.md` (or the path the user chose in phase 2). When that file already exists, show the diff and ask before replacing it. An issue template is project-owned content, and the ground rule above covers the config and the CI file by name, so this one has to be said explicitly.
56
+
57
+ **GitHub:**
58
+
59
+ 1. Copy all three workflows from `<root>/ci-templates/github/` to `.github/workflows/`, and `<root>/ci-templates/scripts/` to `.claude-pipeline/scripts`. Ask before replacing any workflow file that already exists: `claude-pipeline.yml` is an ordinary enough name to collide with something the project wrote. The issue workflow always remains manually dispatchable. If phase 2 selected a schedule, enable its `schedule:` block with the converted UTC cron.
60
+ 2. Edit `claude-test-fix.yml`: set `workflows:` to the project's test workflow name. Check that the test workflow uploads its reports as the `test-reports` artifact and tell the user when it does not.
61
+ 3. Copy the spec template to `.github/ISSUE_TEMPLATE/spec.md`, asking first if it is already there.
62
+
63
+ Then show one diff summary of everything so far (installed files, config, wiring) and offer the single install commit. Commit message: `ci: install ci-agent-platform pipeline`. In the standalone case (rewiring the template in an already-installed repo) commit just the wiring as `ci: claude pipeline template`.
64
+
65
+ ## Phase 4: secrets and platform setup (human does, wizard guides)
66
+
67
+ Never take the values. And never dump the whole checklist at once: this phase is a guided walkthrough, one manual step at a time. For each step:
68
+
69
+ - Announce where the user is: `Step 2/6: bot token`, plus one line on what it is for.
70
+ - Give the shortest instruction that works: the exact UI path (Settings > CI/CD > ...), the exact name to type, the exact scopes to tick. No prose around it.
71
+ - Wait for the user to say done before showing the next step.
72
+ - When the platform CLI or API can see the result, verify it yourself before moving on (`glab variable list` / `gh variable list` and `gh secret list`, runner list, label list): presence, never values. A step that is already satisfied gets skipped with a one-line note.
73
+ - Steps the wizard can do itself are offered as "I can run this, ok?" instead of an instruction to the user.
74
+ - When the platform CLI (`glab`/`gh`) is not installed locally, offer once, at the start of the phase, to install it (it also serves the smoke test). If the user declines, do not derail: give the UI paths, skip the verifications, and trust the user's done.
75
+
76
+ The steps, in this order (GitLab has 7, GitHub 6, number the counter accordingly):
77
+
78
+ 1. `ANTHROPIC_API_KEY`: where to create it, set as a masked CI variable (GitLab: Settings > CI/CD > Variables, not protected when MR pipelines run from unprotected branches; GitHub: repository secret).
79
+ 2. `PIPE_BOT_TOKEN`: GitLab project access token with `api` + `write_repository`, masked and hidden but not protected when ordinary unprotected feature branches need MR review/fix jobs; GitHub PAT with issues, contents, pull-requests and Actions write. Explain that protected GitLab variables work only when the project's protected-MR conditions are satisfied.
80
+ 3. GitLab only: `PIPE_TRIGGER_TOKEN` (Settings > CI/CD > Pipeline trigger tokens) for the orchestrate-to-code dispatch.
81
+ 4. The non-secret `PIPE_*` variables that differ from the defaults: these were already wired into the CI file in phase 3, so this step is normally a one-line "already wired, skipping". Only when something changed during phase 4 edit the CI file again (part of the walkthrough, no extra approval beyond showing the diff).
82
+ 5. A runner: check Settings > CI/CD > Runners shows one available for this project. Instances without shared runners (common on self-hosted GitLab) need a project runner registered, or an existing one enabled for this project. GitHub-hosted runners need nothing.
83
+ 6. The six lifecycle labels (ready, wip, stuck, blocker, blocked, decomposed). On GitLab this step is OPTIONAL and skipped by default: the orchestrator creates each label on first API use (`issue_ensure_label`), so nothing has to exist up front. Offer it only as a nicety, since pre-creating them makes the labels clickable in the board UI sooner. On GitHub the step is REQUIRED: a label must exist before the API can apply it. Offer to run the exact `glab`/`gh` commands yourself, or give the UI path.
84
+ 7. Scheduling (GitLab only): when phase 2 selected a schedule, offer to create it through the authenticated `glab api` session with `PIPE_ORCHESTRATE=1` and the chosen cron time zone. Otherwise leave it disabled and explain the manual run path. On GitHub this was already wired in phase 3, so report it as the sixth and final setup item instead of creating external state here.
85
+
86
+ Close the phase with a one-line recap of what was created and verified.
87
+
88
+ ## Phase 5: smoke test (wizard drives) and final recap
89
+
90
+ The smoke tests are the last step and the wizard drives them. The review smoke requires one approval for its push and MR/PR creation. The full issue-loop smoke has a separate approval because it creates another issue, branch, and MR/PR and incurs another paid run.
91
+
92
+ 1. Announce it in one line and prepare it: a branch named by the phase 2 convention, one small harmless change, an MR/PR against the target branch carrying the wip label. Then ask the one question of this phase: confirm the push plus MR/PR creation (ground rule: never push silently). One yes covers both. On GitLab without `glab`, create the MR with git push options (`git push -o merge_request.create -o merge_request.target=<target> -o merge_request.label=<wip label> origin <branch>`), no token or CLI needed. When no `merge_request_event` pipeline appears within about a minute of the MR existing, create it yourself with `POST /projects/:id/merge_requests/:iid/pipelines` (the bot token is set by phase 4). On GitHub without `gh`, push and print the compare URL for the user to open the PR.
93
+ 2. Check the run yourself with a single status query (`glab ci status` / `gh run list` for the run), or one short bounded wait, then report. Do not launch a blind polling loop that blocks for many minutes. If the jobs have not started or finished yet, say so and give the user the one command to re-check, rather than waiting them out. Scheduled pipelines and crons are best-effort and can lag by minutes, so an unstarted scheduled run is expected, not a failure. Expect, once it runs: the `review` job runs, a review comment from the bot account appears on the MR/PR, `review.env` and a metrics JSON land in `$PIPE_CONTEXT_DIR`. Report the result with a link to the MR/PR and the bot comment.
94
+ 3. On failure, read the job log yourself and say what is wrong and what to change. The common causes are a missing `ANTHROPIC_API_KEY`, a `PIPE_BOT_TOKEN` without comment/write scope, and an explicitly set `PIPE_BOT_USER` not matching the token's account (leave it unset; the runner resolves it from the token).
95
+ 4. After the review smoke test passes, offer a separate end-to-end issue-loop smoke test. This is the only test that proves issue -> triage -> code -> MR/PR rather than only the review half, so it is worth running. Run it only after explicit approval, then watch it through MR/PR creation. Steps: create one small issue whose full spec sits in the issue DESCRIPTION following `spec-issue.template.md` (a spec pasted into a comment does not count, the pipeline reads the spec from the description), apply the ready label, then start orchestrate IMMEDIATELY with a manual run rather than a schedule. On GitLab that is Run pipeline on the target branch with variable `PIPE_ORCHESTRATE=1` (pipeline source `web`, which the orchestrate rule already allows), on GitHub the `workflow_dispatch` of the issue pipeline. Do not set up a cron schedule for this test. A cron is only for ongoing autonomy later and adds minutes of best-effort delay, while the manual run starts within seconds. It spends another triage plus coder run, pushes a feature branch, and opens an MR/PR.
96
+ 5. Close with the final recap, one table: every setting that matters (target branch, branch convention, labels, verify command, report path, image, caps, models, schedule), its value, and its origin (detected / default / answered). Under the table, state what was committed and pushed, both smoke-test results (or `not run`), and whether the issue schedule is active or manual. End with a clear "done": the user must never have to ask what state the repo is in.
@@ -0,0 +1,50 @@
1
+ ---
2
+ name: postmortem-mr
3
+ description: Produce a structured root-cause diagnostic for a stuck merge request or pull request when the automated fix loops are exhausted. Runs the postmortem agent, emits a failure_category and the recommended label changes in a machine-parsable form for CI. Use this when a fix job hit its cap and the MR/PR needs a human, or when another skill escalates.
4
+ ---
5
+
6
+ # postmortem-mr
7
+
8
+ Generic replacement for `diagnose.sh`. It is the shared escalation step. The `fix-tests` and `fix-review-findings` skills follow the same flow inline when they hit their cap. The CI job can also call `claude "/postmortem-mr"` directly, for example after a deploy fix exhausts its retries. The runner keeps the label and comment API calls.
9
+
10
+ ## Step 1: read the project configuration
11
+
12
+ Read `$PIPE_CONFIG_PATH` (default `.claude/pipeline-config.md`) for the Labels section (the stuck and wip label names) and the Project stack. If the file is missing, say so on the first line and continue generically.
13
+
14
+ ## Step 2: inputs
15
+
16
+ The calling job or skill provides the failure context. Read it from `$PIPE_CONTEXT_DIR/postmortem-input.md` (default `build/pipeline/postmortem-input.md`), or from these variables when the caller passed them directly:
17
+
18
+ - MR/PR iid and title.
19
+ - The original failure text (test failures, the review comment, or a deploy failure record).
20
+ - The git log of the fix attempts (`git log "origin/$PIPE_TARGET_BRANCH"..HEAD --oneline`).
21
+ - The context label naming which loop got stuck (for example a test-fix, a review-fix, or a deploy-fix).
22
+ - `$PIPE_LABEL_STUCK` and `$PIPE_LABEL_WIP` from the config or CI variables.
23
+
24
+ The changed-file list is available locally from `git diff --name-only "origin/$PIPE_TARGET_BRANCH"..HEAD`.
25
+
26
+ ## Step 3: run the postmortem agent
27
+
28
+ Spawn the `postmortem` agent (Agent tool, `subagent_type: postmortem`). Pass the MR/PR meta, the changed files, the fix-attempt git log, the original failure text, and the context label. The agent reads the config itself and produces the structured report, which includes the mandatory line:
29
+
30
+ ```
31
+ failure_category: <category>
32
+ ```
33
+
34
+ The categories are defined by the postmortem agent. Do not invent your own.
35
+
36
+ ## Step 4: emit the outputs
37
+
38
+ Write the diagnostic body to `$PIPE_CONTEXT_DIR/postmortem.md`. This is the text the job posts as the MR/PR comment, with the human-intervention note the job adds.
39
+
40
+ Write `$PIPE_CONTEXT_DIR/postmortem.env` as dotenv:
41
+
42
+ ```
43
+ FAILURE_CATEGORY=<category from the report, or "other" if none was emitted>
44
+ ADD_LABELS=<value of $PIPE_LABEL_STUCK>
45
+ REMOVE_LABELS=<value of $PIPE_LABEL_WIP>
46
+ ```
47
+
48
+ ## What the CI job does after you
49
+
50
+ The job applies the label change through the platform API, posts `postmortem.md` as the comment, and emits the `dev_stuck` metrics event with the `FAILURE_CATEGORY`. Label and comment writes need the token and stay in the runner.
@@ -0,0 +1,82 @@
1
+ ---
2
+ name: review-mr
3
+ description: Run the automated code review of a merge request or pull request in CI. Builds the review context, runs the code-reviewer agent plus the security, performance, and migration reviewers when the diff calls for them, merges the findings into one comment body, and emits a machine-readable verdict for the pipeline to gate on. Use this when a CI job asks to review an MR/PR.
4
+ ---
5
+
6
+ # review-mr
7
+
8
+ Generic replacement for `review.sh`. The CI job runs `claude "/review-mr"` instead of assembling a long prompt in bash. This skill does the reasoning. The runner keeps only checkout, the API reads that fetch the context, posting the comment, and gating the pipeline.
9
+
10
+ ## Step 1: read the project configuration
11
+
12
+ Read the config file at `$PIPE_CONFIG_PATH` (default `.claude/pipeline-config.md`). From it you need the Project stack, the Git & Platform section (target branch, bot account), the Documentation Map, the Domain Checks, and the Suppressions path. If the file is missing, say so on the first line of your output and continue with generic behavior.
13
+
14
+ From the Documentation Map, read only the documents whose "when to read" matches the change in front of you. Do not preload every document. The reviewers you spawn read their own docs through the same map.
15
+
16
+ ## Step 2: inputs
17
+
18
+ Everything comes from CI variables and a context file the job prepared with the platform token. Do not call the platform API yourself.
19
+
20
+ - `$PIPE_CONTEXT_DIR` (default `build/pipeline`): directory holding the prepared context and where you write outputs.
21
+ - `$PIPE_CONTEXT_DIR/mr-context.md`: MR/PR title, description, linked issue text, previous bot review comment, previous auto-fix activity. The job wrote this from the platform API. Read it for intent before judging the code.
22
+ - `$PIPE_DIFF_BASE`: the SHA to diff against. For an incremental re-review it is the previous push head. For the first review or after a rebase it is the merge base. The job computes it.
23
+ - `$PIPE_HEAD_SHA`: the current commit under review (the platform runtime SHA).
24
+ - `$PIPE_IS_INCREMENTAL`: `true` when the diff base is a previous push head, otherwise `false`.
25
+ - `$PIPE_TARGET_BRANCH`: the branch the MR/PR targets.
26
+ - `$PIPE_RESULT_REVIEW` (default `$PIPE_CONTEXT_DIR/code-review-result.txt`): where the code-reviewer writes and where you write the merged body.
27
+
28
+ ## Step 3: build the diff
29
+
30
+ Run `git diff "$PIPE_DIFF_BASE" "$PIPE_HEAD_SHA"` locally. Git is on the runner, no token needed. Scope the diff to reviewable source paths.
31
+
32
+ When `$PIPE_IS_INCREMENTAL` is `true`, the diff is only what changed since the previous review. Tell each reviewer to focus on these new changes and not re-raise earlier findings unless this diff reintroduces or modifies the problematic code. When it is `false`, this is the initial review of the full diff.
33
+
34
+ ## Step 4: run the code-reviewer
35
+
36
+ Spawn the `code-reviewer` agent (Agent tool, `subagent_type: code-reviewer`). Pass it:
37
+
38
+ - the MR/PR intent (title, description, linked issues) from the context file,
39
+ - the scope note (incremental or initial),
40
+ - the diff,
41
+ - the previous review comment and previous auto-fix activity, with the instruction to verify applied fixes are correct and not re-flag dismissed findings unless the diff reintroduces the problem.
42
+
43
+ The code-reviewer reads the config, the Documentation Map, and the Suppressions file itself, applies its confidence threshold and mandatory verification, and writes its result to `$PIPE_RESULT_REVIEW`. Do not restate its internal rules in the prompt. Do not preload docs into the prompt, that is what the Documentation Map is for.
44
+
45
+ ## Step 5: run the specialist reviewers when the diff calls for them
46
+
47
+ Inspect the diff paths and content, then spawn the specialists that apply. Each reads the config and its mapped documents itself. Decide from the Documentation Map and Domain Checks in the config, not from hardcoded paths:
48
+
49
+ - **migration-reviewer** when the diff touches database migration or schema-change files (the "database migrations" row of the Documentation Map, or the migration paths named in Domain Checks).
50
+ - **security-reviewer** when the diff touches authentication, authorization, request routing, secret handling, tenant or data isolation, or any area the Domain Checks security notes point at.
51
+ - **performance-reviewer** when the diff touches data access, ORM mappings, repository or query code, or the performance-critical methods named in Domain Checks.
52
+
53
+ If none apply, the code-reviewer result stands on its own. Run only the specialists that fit. Running all of them on every diff wastes tokens and invites noise.
54
+
55
+ ## Step 6: merge the findings
56
+
57
+ Combine the code-reviewer result and any specialist findings into one comment body. Rules:
58
+
59
+ - One status line first, exactly one of `**Status: blocking**`, `**Status: non-blocking**`, `**Status: clean**`. Blocking wins if any reviewer reports a blocking finding.
60
+ - Then a flat bullet list, blocking items first, then non-blocking. Each bullet keeps the `` `path:line` `` prefix and a one-sentence description. Blocking items carry a fix suggestion.
61
+ - Drop duplicates when two reviewers flag the same line. Keep the more specific finding.
62
+ - No section headers, no summaries, no prose around the list.
63
+
64
+ Write the merged body to `$PIPE_RESULT_REVIEW`.
65
+
66
+ ## Step 7: emit the verdict
67
+
68
+ Write `$PIPE_CONTEXT_DIR/review.env` as dotenv for the pipeline to gate on:
69
+
70
+ ```
71
+ REVIEW_STATUS=blocking|non-blocking|clean
72
+ REVIEW_HAS_BUGS=true|false
73
+ REVIEW_FINDINGS_TOTAL=<integer>
74
+ ```
75
+
76
+ `REVIEW_HAS_BUGS=true` only when the merged status is blocking and at least one finding is a concrete runtime defect (null dereference, broken query, wrong logic) or a confirmed security or data-loss issue. Do not set it true for style, pattern, or convention findings, missing annotations with no runtime effect, or anything phrased as "potential", "consider", "could", or "may". This verdict decides whether the fix-review-findings job runs, so it replaces the separate classification pass the old script made.
77
+
78
+ `REVIEW_FINDINGS_TOTAL` is the count of bullets in the merged body.
79
+
80
+ ## What the CI job does after you
81
+
82
+ The job reads `$PIPE_RESULT_REVIEW` and posts it as the review comment, reads `review.env` to gate the downstream fix job, emits the metrics event, and exits non-zero when `REVIEW_HAS_BUGS=true` to block the pipeline. None of that is your job.
@@ -0,0 +1,74 @@
1
+ ---
2
+ name: triage-issue
3
+ description: Triage one issue for the autonomous issue-to-code loop. Runs the orchestrator agent to classify the issue (implement, ask for clarification, or too large), and when too large runs the decomposer agent to split it into spec-compliant sub-issues. Writes a machine-readable decision the CI runner acts on. Use this when a CI orchestrate job asks to triage a ready issue.
4
+ ---
5
+
6
+ # triage-issue
7
+
8
+ Generic replacement for the awk prompt-extraction in `orchestrate.sh`. The orchestrate job runs `claude "/triage-issue"` once per ready issue instead of assembling agent prompts in bash. This skill does the reasoning. The runner keeps only the API reads that fetch the issue, and the API writes that create sub-issues, relabel, comment, and trigger the coder.
9
+
10
+ ## Step 1: read the project configuration
11
+
12
+ Read the config file at `$PIPE_CONFIG_PATH` (default `.claude/pipeline-config.md`). From it you need the Project stack, the Git & Platform section (branch naming, label names), the Labels section, the Spec Template section, and the Capacities section (issue-size heuristic for the orchestrator and decomposer). If the file is missing, say so on the first line of your output and continue with generic behavior.
13
+
14
+ ## Step 2: inputs
15
+
16
+ Everything comes from CI variables and a context file the job prepared with the platform token. Do not call the platform API yourself.
17
+
18
+ - `$PIPE_CONTEXT_DIR` (default `build/pipeline`): where the prepared context lives and where you write outputs.
19
+ - `$PIPE_CONTEXT_DIR/issue-context.md`: the issue IID, title, description, and non-system comments. The job wrote this from the platform API.
20
+ - `$PIPE_ISSUE_IID`: the issue number under triage.
21
+ - `$PIPE_SPEC_TEMPLATE_PATH`: path to the project's spec-issue template (the decomposer authors sub-issue bodies against it).
22
+
23
+ ## Step 3: run the orchestrator
24
+
25
+ Spawn the `orchestrator` agent (Agent tool, `subagent_type: orchestrator`). Pass it the issue context (IID, title, description, comments) from the context file. The orchestrator reads the config, applies the spec-structure check and the capacity heuristic itself, and returns valid JSON, exactly one of:
26
+
27
+ - `{"actionable":true,"branch":"IID-kebab-title"}`: right-sized, ready to implement.
28
+ - `{"actionable":true,"scope":"too_large","decomposition":"short paragraph"}`: clear but too big.
29
+ - `{"actionable":false,"question":"one clarifying question"}`: needs the author.
30
+
31
+ Do not restate the orchestrator's internal rules in the prompt.
32
+
33
+ ## Step 4: decompose when too large
34
+
35
+ Only when the orchestrator returned `scope:"too_large"`, spawn the `decomposer` agent (Agent tool, `subagent_type: decomposer`). Pass it the parent issue (IID, title, description, comments) and tell it the spec template path is `$PIPE_SPEC_TEMPLATE_PATH`. It reads the template and the config itself and returns JSON:
36
+
37
+ ```
38
+ {"confidence":"high|low","reason":"...","sub_issues":[{"key":"a","title":"...","spec_markdown":"...","depends_on":[]}]}
39
+ ```
40
+
41
+ Validate the decomposition before you emit it. It must satisfy the contract, otherwise treat it as failed:
42
+
43
+ - 2 to 5 sub-issues.
44
+ - `depends_on` references only keys present in the set, and the dependency graph is acyclic.
45
+ - Every `spec_markdown` contains all eight section headers (`## 1. Outcome` through `## 8. Out of Scope`) and no unfilled placeholder text.
46
+
47
+ The runner re-checks this deterministically as a gate, but you should not pass on a decomposition you already know is malformed. If it fails, emit the `decompose_failed` decision with a short human-readable suggestion (reuse the orchestrator's `decomposition` paragraph).
48
+
49
+ ## Step 5: emit the decision
50
+
51
+ Write two files. The JSON carries the payload, the dotenv lets the runner branch quickly.
52
+
53
+ `$PIPE_CONTEXT_DIR/triage.json`, exactly one of:
54
+
55
+ ```json
56
+ {"decision":"implement","branch":"12-add-csv-export"}
57
+ {"decision":"ask","question":"Sections 3 and 7 are empty; please complete them."}
58
+ {"decision":"decompose","confidence":"high","reason":"clean data/service/API seams","sub_issues":[{"key":"a","title":"...","spec_markdown":"...","depends_on":[]}]}
59
+ {"decision":"decompose_failed","suggestion":"Split into a data-model change, a service change, and an endpoint."}
60
+ ```
61
+
62
+ `$PIPE_CONTEXT_DIR/triage.env`:
63
+
64
+ ```
65
+ TRIAGE_DECISION=implement|ask|decompose|decompose_failed
66
+ TRIAGE_BRANCH=<branch for implement, else empty>
67
+ TRIAGE_CONFIDENCE=<high|low for decompose, else empty>
68
+ ```
69
+
70
+ The `branch` follows the branch-naming convention from the config. The runner sanitizes it (lowercase, `[a-z0-9-]`, max 100) and falls back if it is empty, so a best-effort value is fine.
71
+
72
+ ## What the CI job does after you
73
+
74
+ The runner reads `triage.env` and `triage.json` and does the platform work: for `implement` it queues the coder (respecting `PIPE_CODER_CAP`); for `ask` it posts the question and relabels the issue to the blocker label; for `decompose` it re-validates, creates the sub-issues with the right labels and blocking links, relabels the parent to the decomposed label, comments, and queues high-confidence unblocked children; for `decompose_failed` it posts the suggestion and relabels to blocker. It also emits the `orchestrator_decision` metric. None of that is your job.
@@ -0,0 +1,98 @@
1
+ # Pipeline config
2
+
3
+ <!-- Generated by /init-pipeline-config. Review every section before committing.
4
+ Agents read this file at runtime (path in PIPE_CONFIG_PATH, default .claude/pipeline-config.md).
5
+ Prefer links to existing docs plus key facts over copying content (anti-drift).
6
+ Mark unused sections as "not used" instead of deleting them. -->
7
+
8
+ ## Project
9
+ <!-- One sentence: what the app is + stack with versions. Agents quote this in their reasoning. -->
10
+ TODO
11
+
12
+ ## Git & Platform
13
+ - Platform: <!-- GitLab | GitHub --> TODO, CLI: <!-- glab | gh --> TODO
14
+ - Default branch: TODO. Target branch for MRs/PRs: TODO
15
+ - Branch naming: TODO
16
+ - Commit convention for closing an issue: TODO
17
+ - Bot account: autodetected from the token at runtime <!-- override with a username only when comments should be filtered by a different account -->. Commit identity: TODO <!-- defaults: Pipeline Bot / bot@pipeline.ci -->
18
+ - Issue-loop schedule: <!-- manual/disabled | cron + time zone --> TODO
19
+
20
+ ## Labels
21
+ | Label | Meaning |
22
+ |---|---|
23
+ | TODO | issue is ready for the autonomous pipeline (the single human action) |
24
+ | TODO | pipeline is working on the issue |
25
+ | TODO | automation exhausted, a human takes over |
26
+ | TODO | waiting for clarification from the reporter |
27
+ | TODO | waiting for a prerequisite issue |
28
+ | TODO | decomposed into child issues |
29
+
30
+ ## Build & Tests
31
+ - Compile: TODO
32
+ - Unit tests: TODO, full tests: TODO
33
+ - Test reports: TODO
34
+ - Coverage policy: TODO
35
+
36
+ ## Documentation Map
37
+ <!-- The core section. Topic -> file -> when an agent should read it. -->
38
+ | Topic | Document | When to read |
39
+ |---|---|---|
40
+ | overall conventions | CLAUDE.md | always |
41
+ | testing | TODO | writing or fixing tests |
42
+ | database migrations | TODO | any schema change |
43
+ | domain & entities | TODO | new entity, model changes |
44
+ | security | TODO | security review |
45
+ | performance | TODO | performance review |
46
+ | release & deploy | TODO | release MR |
47
+ | git workflow | TODO | branches, MRs, commits |
48
+
49
+ ## Spec Template
50
+ - Path: TODO
51
+ - Required sections: TODO
52
+
53
+ ## Capacities
54
+ <!-- The issue-size heuristic the orchestrator uses to decide implement vs.
55
+ decompose, and the decomposer uses to size each sub-issue. Lives here, not
56
+ in the agents, so a project can tune it without editing them. -->
57
+ - One coder session: ~15 files, ~600 changed lines. Larger issues must be decomposed.
58
+ - Orchestrator: an issue that clearly exceeds this, or spans many unrelated
59
+ subsystems, is `too_large` and goes to the decomposer.
60
+ - Decomposer: split into 2-5 sub-issues, each comfortably inside one session,
61
+ ordered along natural implementation seams (data before service before API/UI).
62
+
63
+ ## Domain Checks
64
+ <!-- Project-specific review checks that generic reviewer catalogs cannot know:
65
+ - Security: security-sensitive classes/filters, sensitive fields, tenant-isolation mechanism.
66
+ - Performance: performance-critical repository/helper methods and user inputs to watch.
67
+ - Migrations: changeset author, changelog path, project SQL conventions.
68
+ - Code review anti-false-positives: intentional code-generation annotations
69
+ (for example Lombok @Getter/@Setter/@RequiredArgsConstructor) that reviewers must NOT
70
+ flag as missing boilerplate; deliberate overrides of generated code.
71
+ - Testing gotchas: base test classes to extend, helpers to reuse, patterns to avoid.
72
+ - CVE / dependency pinning convention (how transitive-CVE pins are recorded, e.g. an inline
73
+ comment citing the CVE next to a pinned version). -->
74
+ TODO
75
+
76
+ ## Suppressions
77
+ - Path: .claude/memory/review_suppressions.md (sections: Code / Security / Migration / Performance)
78
+
79
+ ## Release
80
+ <!-- Used by the release agent. Mark "not used" if the project has no formal release flow. -->
81
+ - Release title format: <!-- e.g. "Update to x.y.z" --> TODO
82
+ - Release assignee: <!-- account to assign the release request to, or "none" --> TODO
83
+ - Release notes: directory TODO, index file TODO
84
+ - Deployment guide: TODO
85
+ - Environment templates: TODO
86
+ - Configuration files/dir: TODO
87
+ - Infrastructure/compose files: TODO
88
+ - Deploy version variable: <!-- the var in the deploy env file that pins the image tag --> TODO
89
+
90
+ ## E2E Tests
91
+ <!-- Only for projects with a generated e2e suite. Otherwise: not used.
92
+ Framework, test dir, fixture import module, test-data prefix, cleanup rules, required tags.
93
+ Also (the e2e-test-writer relies on these):
94
+ - frontend source dirs + selector strategy (real element IDs vs test-id attributes),
95
+ - spec-file naming/extension convention (one scenario per file),
96
+ - entity-type -> cleanup-method mapping,
97
+ - which tag marks data-writing (mutating) tests vs the required regression/smoke tags. -->
98
+ not used
@@ -0,0 +1,25 @@
1
+ # Review suppressions
2
+
3
+ <!-- Dismissed review findings, permanent across MRs. Reviewers must skip matching
4
+ patterns even at confidence 100. Written by the coder agent when the author
5
+ dismisses a finding as a false positive, or by hand.
6
+ Entry format:
7
+ - **Pattern:** what the finding looks like
8
+ **Why:** why it is not a real problem in this project
9
+ **Where:** file/area it applies to (or "everywhere") -->
10
+
11
+ ## Code Review Suppressions
12
+
13
+ (none yet)
14
+
15
+ ## Security Review Suppressions
16
+
17
+ (none yet)
18
+
19
+ ## Migration Review Suppressions
20
+
21
+ (none yet)
22
+
23
+ ## Performance Review Suppressions
24
+
25
+ (none yet)