kubuszok/balticporter/consumer-ci
Claude Code and agent skill by kubuszok/balticporter
- community
Checking that the SKILL.md file is still in the repository.
Make a consumer PR (sge, ssg) green from the Baltic Porter side — the fix-all-locally-then-push loop over JVM, JS, Native and Android rows, the pin bump, the regenerate/compile/test chain, the covenant gate and its approval marker, and the list of things that count as cheating. Use whenever a sge/ssg CI job is red, before pushing to a consumer branch, and when a consumer file was patched to make generated code compile.
Install
npx vskill@latest install kubuszok/balticporter/consumer-ciSKILL.md
Consumer CI — the loop
CI is not the debugger. One push per cycle, every row green locally first.
1. The loop
- Collect EVERY failing job (JVM, JS, Native, Android,
packageSrc, scalafmt, covenant gate,
the cancelled dependents). Read each log to its root cause; group by cause.
- Classify each cause: engine (a), parameterised phase/policy (b), library rule (c), consumer
build (aliases, pins, markers), pre-existing drift. The fix goes where the cause is — almost always in Baltic Porter, never in the consumer's generated tree.
- Fix ALL known causes; measure the lanes (
iterate-lane); publish; pin; regenerate; the whole
chain locally (step 3); then push. A red CI after that returns to step 1 for ALL failures — never a one-line patch and another push.
2. What counts as cheating (each was tried, each was reverted)
@Ignore/.ignoreon a test, deleting a test, an empty suite,assert(true).- Editing a test to the generated spelling (
same.getOrElse(null), boxedFloat.valueOf) —
the test is master's; the generated spelling is wrong.
testFull→compile, a JS/Native row downgraded to compile-only, a module skipped in an alias.- Growing
.rescale/data/covenant-gate-baseline.tsv; a@nowarn,null.asInstanceOf,
.getOrElse(null) in a hand file (the scanner counts them: null-cast, get-or-else-null).
- A JVM-only dependency (jackson, ANTLR, reflection) to make a row pass.
- Patching an extension to the generated core's spelling (
u_=→setU,compare→compareTo):
the fix is the derivation/fold that made the core diverge from master; then git checkout <merge-base> -- <file> puts the extension back.
3. The chain (sge; ssg is the same shape)
Each command through tee (skill sbt2-client). Rows fail in order: fix the first row's root cause before reading the next; the same cause usually explains all three.
A hook refuses git push in a consumer until target/local-verification names HEAD (changes to docs and .github/ alone are exempt). A LOCAL pin is never pushed: push the engine ONCE, wait for its snapshot release to finish, probe the pom (skill generated-code), repin to that hash, verify, push.
What CI does with it (sge): one generate job runs Baltic Porter and stores the tree in the Actions cache; compile builds each platform row once into the remote cache; every other job restores both and only links and runs; the demos build against the snapshot release.yml publishes. After a push: ONE gh run watch <id>, then read every red job before touching anything — never poll, never re-push a one-line guess, never an empty commit to retrigger (gh run rerun <id> --failed).
4. The consumer's generator and dedup
project/BalticPorterGen.scala drops a generated file whose path exists under src/main (the hand file wins). So an "inject copy" living in src/main shadows the injected file and its covenant header shows up as missing-header: delete the copy (six were), never header it. "N fatal finding(s)" downgraded to a warning by the generator are pre-existing dropped-type references the hand tree replaces; new fatal kinds are yours.
Every generator input is a fixed object, never a branch name. sge's generator read the hand-written reference tree from master; the pull request was green because master still held that tree, and the merge itself removed it — master's first CI run failed to compile with hundreds of type mismatches naming no cause. A reference tree is pinned by commit hash in the generator source (so it is part of the generated tree's cache key), and a pull request's green run proves nothing about the push run on the default branch when an input is read from that branch — after a merge, read the default branch's own run.
5. The covenant gate
re-scale enforce verify --all / enforce shortcuts --covenanted behind .rescale/scripts/covenant-gate.sh. Growth vs merge-base (a new (file, kind) pair, a raised count, rows removed with a deleted file) needs covenant-baseline-approved: <reason> in EVERY commit that edits the baseline since merge-base; an uncommitted baseline edit can never be approved. methods-removed lists the names (re-scale enforce verify --all | grep 'methods removed'); each is a spelling the generated core lost against master — a derivation question first, a header edit never.
6. What to report
Per row: the count before → after, the root cause per group, which repository fixed it, and the residues left with their owner (pre-existing drift, parked engine items) — never "green" without the three rows' test totals.
Security
- Security scanPassed, 90 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingplugin/skills/consumer-ci/SKILL.md
Popularity
- 7-day trend score
- 0
Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/kubuszok/balticporter/consumer-ci)