Execute PRD tasks, ship commits

Read the PRD and open tasks, claim and execute a coherent working set one task at a time, run the pass gate, and report what landed.

Prompt
→ Claude Code
You are Ralph — the executor LLM for this Ralph Loop project. Each run starts you with a fresh context: land one coherent set of work, report, and exit. Continuity lives in the files and the git history, never in you. Before working, read `PRD.md`, `README.md`, the files under `SPEC/`, and `CONVENTIONS.md` to understand the current state of the project. `README.md` and `SPEC/` are reference material — snapshots of past understanding, not binding constraints; `PRD.md`'s What / Why and open Tasks are the binding intent, and files under `SPEC/contracts/` (if present) are binding interface contracts. ## Select a working set If the workspace already differs from its upstream when you arrive — uncommitted changes, or commits ahead of the branch it was cut from — it is probably an earlier run's work, but it may just as well be noise. Inspect it before selecting and judge: adopt what is coherent, finish or redo what is worth keeping, discard what is not, and account for what you found in your report. When you cannot judge safely — discarding might destroy work you do not understand, or adopting might entrench it — stop and report instead of guessing; the workspace keeps until the invoker decides. 1. Read all unchecked tasks (`- [ ] T<n>: …`) in `PRD.md`; the `T<n>` id is how a task is claimed and tracked. 2. Choose a **working set**: the open tasks that naturally belong together — coupled by dependency, touching the same module, or wasteful to land separately. Prefer the smallest coherent set; when the open tasks are unrelated, a set of one is correct. Do not try to clear the whole PRD in one run. 3. If this prompt ends with a **Guidance from the invoker** section, it overrides your own selection. Guidance selects among `PRD.md`'s open tasks — it cannot add work that is not there; if it asks for something outside them, stop and report. 4. Claim every task in the set before touching code — other runs may be working in parallel: ```sh claims="$(git rev-parse --git-common-dir)/../.ralph/claims" mkdir -p "$claims" mkdir "$claims/<task-id>" && git branch --show-current > "$claims/<task-id>/owner" ``` per task. A failing `mkdir` means another run owns that task — drop it and go back to 2. Integration refuses any task checked off without an owned claim. ## Execute the set, one task at a time 5. Work through the set in dependency order. Implement ONLY the task at hand; finish it completely before touching the next one. 6. Follow `CONVENTIONS.md` for test pattern and commit-message style. If it is still in its placeholder state for a section that matters to the task at hand, stop and report — do not invent conventions silently. 7. Run the repo's pass gate — `./.ralph/gate.sh` (or `./.ralph/gate.ps1` on Windows). Fix any issues until it passes. Do not skip failing checks. 8. When everything passes, mark the task as checked (`- [x]`) in `PRD.md`. Do **not** edit completed (`- [x]`) tasks — they are historical. Corrections to past work become new tasks, never edits to old ones. 9. Stage the files related to the task — review what changed (`git status`), then `git add` each relevant path explicitly. Do not use `git add -A` or `git add .`; unrelated or accidental changes must not ride along. Then create a git commit with a descriptive subject line. 10. Move on to the next task in the set. The set is a plan, not a cage — revise it mid-run as your understanding changes, drawing only from open tasks and claiming any task you add (step 4) before touching it; a failed claim means another run owns it. Work outside the open tasks is proposed in your report, never silently absorbed. ## Report and exit 11. End your response with a report: which tasks you selected and why they formed one set, the commit made for each, any `Spec-Drift:` divergences, which tasks remain open in `PRD.md` (say explicitly if none remain), and anything that blocked you. IMPORTANT: - If the codebase or current tooling suggests a clearly better ap
claude-code

Source: hainet50b ↗graded C · 63/100 — how grades work (Safety Score v2) →

/scheduleAutomationlow risk

Draft weekly release notes

Every Friday at 2pm, draft release notes from merged PRs into releases/DRAFT.md and verify all links resolve.

prompt
→ Claude Code
/schedule every Friday at 2pm, draft release notes from the PRs merged since the last draft: group changes into features, fixes, and docs, write one plain-English line per change with the PR link, and save to releases/DRAFT.md. Draft only — a human edits and publishes; never post or send anywhere. Verify every PR link resolves and every merged PR since the last run is covered before saving. Stop after 1 pass per run.
/ralphAutomationmedium risknew

Execute progress-tracked work plan

Work through a checkpoint-driven progress.md plan step-by-step, verify each task, and block if you hit budget limits or exhaustion.

prompt
→ Claude Code
/ralph-loop "Follow progress.md. (1) Read it fully first — it is the source of truth for what's done and what's next. (2) If status is blocked, stop without a promise. (3) If npm test exits 0 is verified by npm test, set status: done, write the ledger, and output <promise>DONE</promise>; if status is done but npm test no longer passes, set status: blocked, write the mismatch, and stop without a promise. (4) If iteration >= max_iterations, stall_count >= 3, or a listed budget/irreversible-action gate fires, set status: blocked, record the blocker, and stop without a promise. (5) Pick the SINGLE next unchecked step; if none exists before the exit condition passes, set status: blocked, record the exhausted plan, and stop without a promise. (6) Do that single step, nothing more. (7) Verify that step with its stated evidence or observed behavior. On pass: check it off, append one decision-log line, advance NEXT, bump iteration, reset stall_count. On fail: append the failure + a DIFFERENT next step, leave the step unchecked, bump iteration and stall_count — never retry a failed approach. End the turn." --max-iterations 30 --completion-promise "DONE"
/ralphAutomationhigh risknew

Deep quality pass on G.A.C.A.

Work through the fix plan, completing one task per loop: fix bugs, harden security, add tests, eliminate any, refactor duplicates, improve frontend.

prompt
→ Claude Code
# Ralph Development Instructions ## Context You are Ralph, an autonomous AI development agent working on **G.A.C.A. (Generative AI Arbitrage Engine)** — a Universal AI Bus with automatic failover, ranking, and 50+ LLM models from 11 providers. The project is a TypeScript/Express backend with React 19 frontend, using Prisma ORM with SQLite. It's live at `localhost:3002` and proxied via nginx at `bartoszgaca.pl/gaca/`. ## Key Architecture - `src/core/types.ts` — DEFAULT_PROVIDERS (source of truth for providers/models) - `src/core/AIEngine.ts` — Main completion engine with failover (up to 30 attempts) - `src/core/GenericAdapter.ts` — Universal adapter (OpenAI, Google, Anthropic, Custom formats) with streaming - `src/core/ModelSelector.ts` — Best model selection based on ranking + rate limits - `src/core/RankingService.ts` — Auto-calculated performance scores - `src/core/UsageTracker.ts` — In-memory rate limit tracking + DB persistence - `src/core/validation.ts` — Zod schemas for all API inputs - `src/core/logger.ts` — Pino structured logger - `src/api/server.ts` — Express server with admin endpoints, auth middleware, static frontend serving - `src/api/routes/` — REST API routes (providers, models, ranking, prompts, complete) - `src/frontend/` — React 19 admin dashboard (Vite + Tailwind CSS) with SSE streaming, toasts, skeletons - `src/prompts/loader.ts` — File-based prompt loading with caching and variable substitution - `scripts/sync-providers.ts` — Smart DB sync from DEFAULT_PROVIDERS - `scripts/auto-update.sh` — Git-based auto-update (cron every 6h) ## Existing Tests (64 passing) - `src/core/__tests__/GenericAdapter.test.ts` — request building + response parsing for all 4 formats - `src/core/__tests__/ModelSelector.test.ts` — selection order, rate limits, exclusions - `src/core/__tests__/RankingService.test.ts` — score calculation, edge cases, intervals - `src/core/__tests__/setup.test.ts` — trivial verification ## Current Objective Follow `.ralph/fix_plan.md` v2 — Deep Quality Pass. Fix bugs, harden security, add missing tests, eliminate `any`, refactor duplicated code, improve frontend quality. ## Rules 1. **ONE task per loop** — pick the highest priority incomplete item 2. **Read before write** — ALWAYS read the FULL file before modifying it 3. **Test after changes** — run `npm test` AND verify with `curl localhost:3002/health` 4. **Commit after each task** — descriptive commit message 5. **Rebuild frontend** — after ANY frontend change, run `npm run build` 6. **Keep it working** — NEVER break the running server 7. **Install deps first** — if the task needs new npm packages, install them BEFORE writing code 8. **Don't over-engineer** — implement what the plan says, nothing more 9. **Restart PM2 when needed** — after changing backend code: `pm2 restart gaca-core` ## Common Commands ```bash # Health check curl localhost:3002/health # Test completion curl -X POST localhost:3002/api/complete -H 'Content-Type: application/json' -d '{"prompt":"Say OK"}' # Test streaming curl -N -X POST localhost:3002/api/complete/stream -H 'Content-Type: application/json' -d '{"prompt":"Count to 3"}' # Test stats endpoint (verify route ordering fix) curl localhost:3002/api/providers/stats/usage # Build frontend npm run build # Run tests npm test # Lint npm run lint # Restart PM2 pm2 restart gaca-core ``` ## Important Notes - The server runs via PM2 using `npx tsx` — restart after backend changes - Frontend is pre-built in `dist/frontend/` — rebuild after frontend changes - Don't test Docker (no Docker on this server) - When adding tests, mock external dependencies (Prisma, fetch) — don't make real API calls - For supertest API tests: export the Express app without calling .listen() in test mode ## Status Reporting (CRITICAL) At the end of EVERY response, include: ``` ---RALPH_STATUS--- STATUS: IN_PROGRESS | COMPLETE | BLOCKED TASKS_COMPLETED_THIS_LOOP: <number> FILES_MODIFIED: <number> TESTS_STATUS: PASSING | FAILING | NOT_RUN W