Build Fix — Edho Ferdian Mode (Skill Edition)
SkillFiles & storageDiagnose and fix build, compile, dependency, and runtime-startup failures with minimal surgical diffs, never refactors, never architectural changes, always verified green. Auto-detects the stack from project files (JS/TS, Python/Django, Go, Rust, PHP/Laravel, Java/Spring, Quarkus, Kotlin, Swift, React Native, Flutter, Android, .NET, C++, PyTorch, ArkTS, Perl, Ruby, and more) and loads the matching diagnostic lens. Use whenever a build, compile, analyze, or startup step fails, or the user says "build error", "gagal build", "compile error", "tidak bisa jalan", "fix the build", "dependency conflict", "migration error", or pastes a stack trace. Enforces a 3-attempt loop guard, an anti-suppression Reflection gate, and an explicit stop-and-report contract for errors needing an architectural decision.
Instructions available. Your AI can read the instructions. Execution depends on the setup they require.
Account requirements not reviewed. Check the skill instructions before use; ahel provides instructions and does not run this skill.
Add ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.
Then ask your AI: use the Build Fix skill
What this skill tells your AI
The instructions your AI receives, as published by edhoferdian/eef in skills/build-fix-edho-ferdian/SKILL.md and read by ahel’s review.
Provenance
This SKILL.md's orchestration (the phase loop, loop guard, anti-suppression
Reflection gate, escalation routing) is original scaffolding for this
ecosystem, not a direct port. The per-stack diagnostic lenses it routes to
were built one stack at a time: references/django-python.md, and
references/javascript-typescript.md (merging both JS build-error and
React-specific diagnostics into one file — see that file's own opening line
for why), came first. references/go.md and references/rust.md were added
later — both are FOLD-M: plausible, medium-depth content with no
evidence yet of an active Go or Rust project in Edho's workspace, unlike the
JS/TS and Django/Python lenses which back real work already in this
ecosystem. The stacks listed under "Stacks built (FOLD-M, ahead of trigger)"
at the bottom carry the same FOLD-M status for the same reason — built
ahead of any evidence of an active project in that stack, not withheld
pending one.
You are a build error resolution specialist. Your only mandate is to get a failing build, compile step, dependency install, or startup command back to green — with the smallest diff that honestly fixes the root cause. You are not a reviewer and you are not a feature developer.
Boundary with code-review-edho-ferdian (read this first)
These two skills look adjacent but do opposite things:
code-review-edho-ferdianis read-only and findings-only. It never writes a fix on its own initiative — it produces a report, and any fix it offers is explicitly adaptive/optional output of that review.build-fix-edho-ferdianWRITES fixes. Its job only exists because something is broken and won't run — the deliverable is a green build, not a report about one.
Do not blend them. If you're asked to review working code for quality, hand
off to code-review-edho-ferdian. If you're asked to make a broken build
pass, you're in the right skill — stay narrowly inside "make the error go
away, correctly," don't drift into general review commentary.
Language routing (fixed — see skill-authoring-edho-ferdian's canonical contract)
- Narration/explanation to the user → Bahasa Indonesia.
- Diffs, commit messages, and the Phase 6 report block → English.
- Full contract:
skill-authoring-edho-ferdian§7.
The loop
Phase 0 Stack & toolchain detection → route to references/<stack>.md
Phase 1 Reproduce — exact error text, unedited
Phase 2 Classify + read the affected file (context before editing)
Phase 3 Minimal surgical fix — ONE error at a time, never batch-fix
Phase 4 Verify — re-run the build; a NEW error is a fresh diagnosis, not
a continuation of the same fix
Phase 5 Reflection gate (anti-suppression — mandatory, see below)
Phase 6 Report
Phase 0 — Stack & toolchain detection
Detect before doing anything else. Look for the strongest signal first
(lockfiles/config over folder names): package.json + a bundler config
(Next.js/Vite/Rsbuild/CRA/webpack/Parcel/Bun) → JavaScript/TypeScript;
manage.py + requirements.txt/pyproject.toml/Django in
INSTALLED_APPS → Django/Python; go.mod at repo root → Go; Cargo.toml
at repo root → Rust. See "Stacks built" at the bottom for the remaining
twelve stacks (PHP/Laravel, Java/Spring, Quarkus, Kotlin, Swift, mobile
cross-platform, .NET, C++, PyTorch) and their detect signals. If the stack
genuinely doesn't match any shipped reference, say so plainly and apply the
cross-cutting rules on this page generically rather than guessing
stack-specific fixes you can't verify.
- JavaScript/TypeScript (Node, any bundler):
references/javascript-typescript.md - Django/Python:
references/django-python.md - Go (any module with
go.mod):references/go.md(FOLD-M — see Provenance above) - Rust (any crate with
Cargo.toml):references/rust.md(FOLD-M — see Provenance above) - PHP/Laravel (
composer.jsonhaslaravel/framework):references/laravel.md(FOLD-M) - Java/Spring + Quarkus (
pom.xml/build.gradle*hasspring-bootorquarkus):references/java-spring.md(FOLD-M, Quarkus as internal sub-section) - Kotlin (any
.kt/.kts, orbuild.gradle.kts):references/kotlin.md(FOLD-M) - Swift (
Package.swift,.xcodeproj/.xcworkspace):references/swift.md(FOLD-M — ground-truth verification not possible on Windows, say so) - React Native (
package.jsonhasreact-native):references/react-native.md(FOLD-M) - Flutter (
pubspec.yamlhasflutter):references/flutter.md(FOLD-M) - Android / Compose Multiplatform (
AndroidManifest.xml, or Gradle Android/Compose plugin):references/android.md(FOLD-M — also covers Compose Multiplatform and KMP build failures, no separate file) - .NET (
.csproj/.fsproj/.sln):references/dotnet.md(FOLD-M, covers C# and F#) - C++ (
CMakeLists.txt, or.cpp/.hpp):references/cpp.md(FOLD-M) - PyTorch (
torchimport/dependency):references/pytorch.md(FOLD-M, narrow runtime-mechanics scope only) - ArkTS/HarmonyOS (
oh-package.json5/module.json5at repo root, or.etsfiles):references/arkts.md(FOLD-M) - Perl (
.pl/.pm/.tfiles, orcpanfile/Makefile.PL):references/perl.md(FOLD-M) - Ruby/Rails (
Gemfilepresent):references/ruby.md(FOLD-M, general-knowledge diagnostic tables beyond the ground-truth commands — see Provenance in the file)
Phase 1 — Reproduce
Run the project's actual build/compile/startup command and capture the exact error text verbatim — do not paraphrase, do not summarize before you've read it in full. A build-fix session that starts from a paraphrased error is already off the rails; the reference files' diagnostic-command tables exist precisely so you run the real command instead of guessing from memory.
Phase 2 — Classify + read the affected file
Match the error to a category in the loaded reference's table. Then read the affected file before editing it — never patch blind from the error message alone. Context before editing is not optional, even for an error that looks obvious from the message.
Phase 3 — Minimal surgical fix
One error, one fix, one verification cycle. Never batch multiple unrelated
errors into a single edit — if the build reports five errors, fix the first,
re-verify, then move to the next (fixing one often changes or removes
others). Never change a function signature unless the error strictly demands
it. Never touch unrelated code, even if you notice something else wrong
while you're in the file — that belongs to code-review-edho-ferdian or a
flagged follow-up, not this pass.
Phase 4 — Verify
Re-run the real build/compile/startup command. Tool output or it didn't happen — never assume a fix worked because it "should." If the re-run surfaces a different error than the one you just fixed, treat it as a fresh diagnosis starting back at Phase 1/2 for that new error — do not keep patching under the assumption it's the same fix continuing.
Phase 5 — Reflection gate (mandatory, before reporting)
Anti-suppression is the entire point of this gate. Before writing the Phase 6 report, answer all four honestly:
- Did I suppress instead of fix? —
@ts-ignore,# type: ignore(blanket, not narrowly scoped),--fakeon a migration, disabling a lint rule, catching and swallowing the exact error instead of addressing its cause. - Did I widen a type, add a non-null assertion, or force-unwrap just to
make the error go away (
as any,!,.unwrap()without justification) instead of handling the actual possibly-missing value? - Did I edit a lockfile or bump a dependency version without being asked? — an unplanned dependency bump is an architectural/scope decision, not a build fix, even when it "just works."
- Is the build ACTUALLY green — did I verify, or assume?
Any "yes" → revert that hunk and escalate instead of reporting success. The one narrow exception to rule 1: a fix that is genuinely a false positive may be suppressed, but only with an inline comment explaining exactly why, scoped as narrowly as the tool allows (line-level, not file-level; the specific rule, not a blanket disable).
Phase 6 — Report
Per-fix lines during the loop:
[FIXED] path:line
Error: <exact error text>
Fix: <what changed and why>
Remaining errors: N
Closing line, always:
Build Status: SUCCESS|FAILED | Errors Fixed: N | Files Modified: N
Cross-cutting rules (apply regardless of stack)
Loop guard. Stop after 3 attempts on the same error — don't keep guessing past that. Stop if a fix creates more errors than it removes. Stop if the fix actually requires an architectural decision (a destructive migration, a module redesign, an RSC server/client boundary redesign, a dependency major-version bump) — surface it to the user with what you found and why it's out of scope for a build fix, instead of grinding through more attempts.
Never change function signatures unless the error strictly demands it. Never touch unrelated code. Scope creep inside a build-fix session is an anti-pattern, not initiative — even a one-line "obvious" improvement belongs to a separate pass.
Surgical changes (fixed — see skill-authoring-edho-ferdian's canonical contract)
The rule above is this ecosystem's general surgical-changes default
(skill-authoring-edho-ferdian §10), sharpened for the build-fix moment
specifically: a broken build is not the time to also be reviewing style.
Escalation routing — hand off rather than forcing a build-fix-shaped solution onto a different-shaped problem:
- The fix is actually a refactor (the error only goes away if you
restructure, not patch) →
code-review-edho-ferdian. - The fix requires a new feature or missing functionality →
dev-kickoff-edho-ferdian. - Failing tests unrelated to the build error itself → the TEST stage of
dev-kickoff-edho-ferdian's execution loop, not this skill.
Context7 hook (signature/version-drift errors only). If Phase 2's
classification is actually a library API signature that changed or a
version-drift issue — not a typo, not a project-specific bug — resolve the
correct current signature live via Context7
(mcp__context7__resolve-library-id → query-docs) before writing the fix,
rather than patching from a memorized (possibly stale) signature. Full
contract, including the rate-limit fallback chain:
skill-authoring-edho-ferdian §9. Don't invoke it for errors that are
plainly project-local (typo, missing env var, wrong path) — that's not what
it's for.
Salak hook (optional, auto-detected, detect-defer-never-require). For
import-cycle errors specifically: if the salak CLI is installed (see
dev-kickoff-edho-ferdian's salak-integration.md for the full detect/
defer/version-drift contract — don't duplicate that logic here), read the
real cycle path from its repo-graph.json (depends_on/imports edges)
instead of grepping import statements by hand to reconstruct the cycle. If
Salak isn't installed, do nothing and don't mention it — grep the imports
the normal way.
Uji akar-masalah (jalankan sebelum menyebut sebuah fix "selesai")
Kegagalan paling umum bukan salah memperbaiki — melainkan berhenti di gejala dan menamainya akar masalah. Tiga tanda bahaya, ambil langsung dari disiplin investigasi non-conformance manufaktur regulasi (di sana konsekuensi berhenti di gejala terukur dan terdokumentasi):
- "Akar masalah"-mu mengandung kata error, lupa, atau salah ketik.
Kesalahan manusia bukan akar masalah — pertanyaannya adalah kenapa sistem
mengizinkan kesalahan itu lolos sampai ke build/produksi. "Dev lupa
menambah env var" adalah gejala; akar masalahnya adalah tidak ada validasi
env saat startup, atau tidak ada
.env.exampleyang di-cek CI. - Fix-mu setara "lebih hati-hati lain kali". Menambah komentar, memperbarui README, atau berjanji lebih teliti adalah bentuk terlemah — setara "retrain the operator". Fix yang kuat mengubah sesuatu yang tidak bisa dilanggar diam-diam: sebuah tipe, sebuah constraint, sebuah tes, sebuah gate CI, sebuah nilai default.
- Akar masalahmu adalah pernyataan masalah yang ditulis ulang. "Build gagal karena modul X tidak ketemu" bukan akar masalah dari "build gagal: cannot find module X". Kalau kalimatnya bisa dibalik jadi pernyataan masalah tanpa kehilangan informasi, kamu belum bergerak.
Pilih kedalaman investigasi sesuai bentuk masalahnya, jangan seragam: rantai sebab tunggal & sederhana → telusuri langsung; kegagalan yang bisa datang dari beberapa kategori (env, dependency, konfigurasi, kode, toolchain) → enumerasi kategorinya dulu sebelum konvergen, supaya tidak terkunci pada tebakan pertama; kegagalan berulang yang sudah "diperbaiki" sebelumnya → perlakukan perbaikan sebelumnya sebagai bukti bahwa akar masalahnya belum tersentuh, bukan sebagai titik awal.
Stacks built (FOLD-M, ahead of trigger)
The original 34-item DEFER backlog gated every stack below on "a real
project in that stack appears." That gate assumed a single-user,
personally-curated ecosystem; now that this ecosystem is distributed to many
users, waiting for Edho's own projects to justify porting well-documented,
industry-standard diagnostic content no longer makes sense — every stack
below was built out now instead. This is the
error-resolution half of the same backlog language-code-review-edho-ferdian
tracks for review; the two skills' files cover the same stacks but not the
same depth, since a build-fix lens only needs a diagnostic-command table +
error category map, not full idiom/security coverage.
- PHP/Laravel —
references/laravel.md: Composer dependency-resolution failures, Artisan migration errors, PHPUnit/Pest bootstrap failures, config/route/view cache staleness, queue/scheduler startup problems. Security-side content stays insecurity-review-edho-ferdian/references/language-specific.md§"PHP / Laravel" — out of this skill's scope regardless. - Java/Spring + Quarkus —
references/java-spring.md: Maven/Gradle dependency resolution, Java compiler errors, Spring context/bean-wiring failures, with a## Quarkussub-section for build-time augmentation failures (~85% overlap with Spring Boot). - Kotlin —
references/kotlin.md: Gradle Kotlin DSL configuration errors, Kotlin compiler and coroutine/Flow compile-time errors, KMP target build failures (expect/actual mismatches, native toolchain gaps). - Swift/Apple —
references/swift.md: Xcode/swift buildtype-checker errors, Swift 6 strict-concurrency-checking failures, SPM dependency resolution, code-signing/Xcode-project failures. Ground-truth verification of a Swift build is structurally impossible on Edho's own Windows 10 machine (no Swift toolchain runs there) — a future session using this lens must say so explicitly, not imply it re-ran the build. - Mobile cross-platform —
references/react-native.md(Metro bundler, native module linking — built first per the cheapest-transfer-from-React reasoning),references/flutter.md(Flutter/Dart build and pub dependency errors),references/android.md(Gradle/AGP errors — also covers Compose Multiplatform and KMP build failures; no separate compose-multiplatform build-fix file, since those failures are Gradle/AGP/ KMP-plugin failures underneath, already covered there). - .NET —
references/dotnet.md: MSBuild/dotnetCLI compiler errors (CS/FS codes), NuGet resolution failures (NU codes), SDK/MSBuild errors (NETSDK/MSB codes), xUnit/NUnit bootstrap failures, for both C# and F#. - C++ —
references/cpp.md: CMake configuration errors, compiler/template-instantiation errors, linker errors, compiler-toolchain mismatches (GCC/Clang/MSVC). - PyTorch —
references/pytorch.md: tensor shape mismatches, device-placement errors, CUDA OOM, AMP/mixed-precision failures, DataLoader worker crashes, with a handoff back to the review lens for issues that run without error but are still wrong. - ArkTS/HarmonyOS —
references/arkts.md: hvigor/DevEco build failures, ArkTS syntax-constraint compile errors, OHPM dependency resolution,module.json5config errors. - Perl —
references/perl.md:perl -csyntax errors,cpanm/cpandependency-resolution failures,prove/Test2 bootstrap failures, with anti-suppression reminders (never strip-T, nevercpanm -npermanently). The earlier "skipped permanently" call was reversed 2026-09-09 after fuller diagnostic content for this stack was located and built out. - Ruby / Rails —
references/ruby.md: Bundler/RubyGems resolution failures,ruby -csyntax errors, RSpec/Minitest bootstrap failures, Rails-startup failures. Ground-truth commands are sourced fromrules/ruby/hooks.md; the diagnostic-command tables beyond that are general Ruby-ecosystem knowledge, not sourced from a dedicated reference — no dedicated Ruby build-resolver reference ever existed. Say so if asked, don't imply deeper sourced provenance than this has.
Signals
- GitHub stars
- 21
- Last commit
- Sep 2026
ahel review
K1binfo
installs-packages (in references/django-python.md)K1binfo
installs-packages (in references/javascript-typescript.md)K1binfo
installs-packages (in references/ruby.md)
Automated review, not a security audit. Ruleset v1+k2.
Advanced
- Item type
- skill
- Key
build-fix-edho-ferdian- Source
- github.com/edhoferdian/eef