{"id":"bd5b4931-dd6f-492a-9956-ec93436fe6a2","shortId":"HfLQyz","kind":"skill","title":"review","tagline":"Pre-landing PR review. Analyzes diff against the base branch for SQL safety, LLM trust\nboundary violations, conditional side effects, and other structural issues. Use when\nasked to \"review this PR\", \"code review\", \"pre-landing review\", or \"check my diff\".\nProactively suggest when","description":"## Preamble\n\n```bash\neval \"$(~/.vibestack/bin/vibe-slug 2>/dev/null)\" 2>/dev/null || SLUG=\"unknown\"\n_LEARN_FILE=\"${VIBESTACK_HOME:-$HOME/.vibestack}/projects/${SLUG:-unknown}/learnings.jsonl\"\nif [ -f \"$_LEARN_FILE\" ]; then\n  _LEARN_COUNT=$(wc -l < \"$_LEARN_FILE\" 2>/dev/null | tr -d ' ')\n  echo \"LEARNINGS: $_LEARN_COUNT entries loaded\"\n  if [ \"$_LEARN_COUNT\" -gt 5 ] 2>/dev/null; then\n    ~/.vibestack/bin/vibe-learnings-search --limit 5 2>/dev/null || true\n  fi\nelse\n  echo \"LEARNINGS: none yet\"\nfi\n```\n\n## Step 0: Detect platform and base branch\n\nFirst, detect the git hosting platform from the remote URL:\n\n```bash\ngit remote get-url origin 2>/dev/null\n```\n\n- If the URL contains \"github.com\" → platform is **GitHub**\n- If the URL contains \"gitlab\" → platform is **GitLab**\n- Otherwise, check CLI availability:\n  - `gh auth status 2>/dev/null` succeeds → platform is **GitHub** (covers GitHub Enterprise)\n  - `glab auth status 2>/dev/null` succeeds → platform is **GitLab** (covers self-hosted)\n  - Neither → **unknown** (use git-native commands only)\n\nDetermine which branch this PR/MR targets, or the repo's default branch if no\nPR/MR exists. Use the result as \"the base branch\" in all subsequent steps.\n\n**If GitHub:**\n1. `gh pr view --json baseRefName -q .baseRefName` — if succeeds, use it\n2. `gh repo view --json defaultBranchRef -q .defaultBranchRef.name` — if succeeds, use it\n\n**If GitLab:**\n1. `glab mr view -F json 2>/dev/null` and extract the `target_branch` field — if succeeds, use it\n2. `glab repo view -F json 2>/dev/null` and extract the `default_branch` field — if succeeds, use it\n\n**Git-native fallback (if unknown platform, or CLI commands fail):**\n1. `git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's|refs/remotes/origin/||'`\n2. If that fails: `git rev-parse --verify origin/main 2>/dev/null` → use `main`\n3. If that fails: `git rev-parse --verify origin/master 2>/dev/null` → use `master`\n\nIf all fail, fall back to `main`.\n\nPrint the detected base branch name. In every subsequent `git diff`, `git log`,\n`git fetch`, `git merge`, and PR/MR creation command, substitute the detected\nbranch name wherever the instructions say \"the base branch\" or `<default>`.\n\n---\n\n# Pre-Landing PR Review\n\nYou are running the `/review` workflow. Analyze the current branch's diff against the base branch for structural issues that tests don't catch.\n\n---\n\n## Step 1: Check branch\n\n1. Run `git branch --show-current` to get the current branch.\n2. If on the base branch, output: **\"Nothing to review — you're on the base branch or have no changes against it.\"** and stop.\n3. Run `git fetch origin <base> --quiet && git diff origin/<base> --stat` to check if there's a diff. If no diff, output the same message and stop.\n\n---\n\n## Step 1.5: Scope Drift Detection\n\nBefore reviewing code quality, check: **did they build what was requested — nothing more, nothing less?**\n\n1. Read `TODOS.md` (if it exists). Read PR description (`gh pr view --json body --jq .body 2>/dev/null || true`).\n   Read commit messages (`git log origin/<base>..HEAD --oneline`).\n   **If no PR exists:** rely on commit messages and TODOS.md for stated intent — this is the common case since /review runs before /ship creates the PR.\n2. Identify the **stated intent** — what was this branch supposed to accomplish?\n3. Run `git diff origin/<base>...HEAD --stat` and compare the files changed against the stated intent.\n\n4. Evaluate with skepticism (incorporating plan completion results if available from an earlier step or adjacent section):\n\n   **SCOPE CREEP detection:**\n   - Files changed that are unrelated to the stated intent\n   - New features or refactors not mentioned in the plan\n   - \"While I was in there...\" changes that expand blast radius\n\n   **MISSING REQUIREMENTS detection:**\n   - Requirements from TODOS.md/PR description not addressed in the diff\n   - Test coverage gaps for stated requirements\n   - Partial implementations (started but not finished)\n\n5. Output (before the main review begins):\n   \\`\\`\\`\n   Scope Check: [CLEAN / DRIFT DETECTED / REQUIREMENTS MISSING]\n   Intent: <1-line summary of what was requested>\n   Delivered: <1-line summary of what the diff actually does>\n   [If drift: list each out-of-scope change]\n   [If missing: list each unaddressed requirement]\n   \\`\\`\\`\n\n6. This is **INFORMATIONAL** — does not block the review. Proceed to the next step.\n\n---\n\n### Plan File Discovery\n\n1. **Conversation context (primary):** Check if there is an active plan file in this conversation. The host agent's system messages include plan file paths when in plan mode. If found, use it directly — this is the most reliable signal.\n\n2. **Content-based search (fallback):** If no plan file is referenced in conversation context, search by content:\n\n```bash\nsetopt +o nomatch 2>/dev/null || true  # zsh compat\nBRANCH=$(git branch --show-current 2>/dev/null | tr '/' '-')\nREPO=$(basename \"$(git rev-parse --show-toplevel 2>/dev/null)\")\n# Compute project slug for ~/.vibestack/projects/ lookup\n_PLAN_SLUG=$(git remote get-url origin 2>/dev/null | sed 's|.*[:/]\\([^/]*/[^/]*\\)\\.git$|\\1|;s|.*[:/]\\([^/]*/[^/]*\\)$|\\1|' | tr '/' '-' | tr -cd 'a-zA-Z0-9._-') || true\n_PLAN_SLUG=\"${_PLAN_SLUG:-$(basename \"$PWD\" | tr -cd 'a-zA-Z0-9._-')}\"\n# Search common plan file locations (project designs first, then personal/local)\nfor PLAN_DIR in \"$HOME/.vibestack/projects/$_PLAN_SLUG\" \"$HOME/.claude/plans\" \"$HOME/.codex/plans\" \".vibestack/plans\"; do\n  [ -d \"$PLAN_DIR\" ] || continue\n  PLAN=$(ls -t \"$PLAN_DIR\"/*.md 2>/dev/null | xargs grep -l \"$BRANCH\" 2>/dev/null | head -1)\n  [ -z \"$PLAN\" ] && PLAN=$(ls -t \"$PLAN_DIR\"/*.md 2>/dev/null | xargs grep -l \"$REPO\" 2>/dev/null | head -1)\n  [ -z \"$PLAN\" ] && PLAN=$(find \"$PLAN_DIR\" -name '*.md' -mmin -1440 -maxdepth 1 2>/dev/null | xargs ls -t 2>/dev/null | head -1)\n  [ -n \"$PLAN\" ] && break\ndone\n[ -n \"$PLAN\" ] && echo \"PLAN_FILE: $PLAN\" || echo \"NO_PLAN_FILE\"\n```\n\n3. **Validation:** If a plan file was found via content-based search (not conversation context), read the first 20 lines and verify it is relevant to the current branch's work. If it appears to be from a different project or feature, treat as \"no plan file found.\"\n\n**Error handling:**\n- No plan file found → skip with \"No plan file detected — skipping.\"\n- Plan file found but unreadable (permissions, encoding) → skip with \"Plan file found but unreadable — skipping.\"\n\n### Actionable Item Extraction\n\nRead the plan file. Extract every actionable item — anything that describes work to be done. Look for:\n\n- **Checkbox items:** `- [ ] ...` or `- [x] ...`\n- **Numbered steps** under implementation headings: \"1. Create ...\", \"2. Add ...\", \"3. Modify ...\"\n- **Imperative statements:** \"Add X to Y\", \"Create a Z service\", \"Modify the W controller\"\n- **File-level specifications:** \"New file: path/to/file.ts\", \"Modify path/to/existing.rb\"\n- **Test requirements:** \"Test that X\", \"Add test for Y\", \"Verify Z\"\n- **Data model changes:** \"Add column X to table Y\", \"Create migration for Z\"\n\n**Ignore:**\n- Context/Background sections (`## Context`, `## Background`, `## Problem`)\n- Questions and open items (marked with ?, \"TBD\", \"TODO: decide\")\n- Review report sections (`## VIBESTACK REVIEW REPORT`)\n- Explicitly deferred items (\"Future:\", \"Out of scope:\", \"NOT in scope:\", \"P2:\", \"P3:\", \"P4:\")\n- CEO Review Decisions sections (these record choices, not work items)\n\n**Cap:** Extract at most 50 items. If the plan has more, note: \"Showing top 50 of N plan items — full list in plan file.\"\n\n**No items found:** If the plan contains no extractable actionable items, skip with: \"Plan file contains no actionable items — skipping completion audit.\"\n\nFor each item, note:\n- The item text (verbatim or concise summary)\n- Its category: CODE | TEST | MIGRATION | CONFIG | DOCS\n\n### Cross-Reference Against Diff\n\nRun `git diff origin/<base>...HEAD` and `git log origin/<base>..HEAD --oneline` to understand what was implemented.\n\nFor each extracted plan item, check the diff and classify:\n\n- **DONE** — Clear evidence in the diff that this item was implemented. Cite the specific file(s) changed.\n- **PARTIAL** — Some work toward this item exists in the diff but it's incomplete (e.g., model created but controller missing, function exists but edge cases not handled).\n- **NOT DONE** — No evidence in the diff that this item was addressed.\n- **CHANGED** — The item was implemented using a different approach than the plan described, but the same goal is achieved. Note the difference.\n\n**Be conservative with DONE** — require clear evidence in the diff. A file being touched is not enough; the specific functionality described must be present.\n**Be generous with CHANGED** — if the goal is met by different means, that counts as addressed.\n\n### Output Format\n\n```\nPLAN COMPLETION AUDIT\n═══════════════════════════════\nPlan: {plan file path}\n\n## Implementation Items\n  [DONE]      Create UserService — src/services/user_service.rb (+142 lines)\n  [PARTIAL]   Add validation — model validates but missing controller checks\n  [NOT DONE]  Add caching layer — no cache-related changes in diff\n  [CHANGED]   \"Redis queue\" → implemented with Sidekiq instead\n\n## Test Items\n  [DONE]      Unit tests for UserService — test/services/user_service_test.rb\n  [NOT DONE]  E2E test for signup flow\n\n## Migration Items\n  [DONE]      Create users table — db/migrate/20240315_create_users.rb\n\n─────────────────────────────────\nCOMPLETION: 4/7 DONE, 1 PARTIAL, 1 NOT DONE, 1 CHANGED\n─────────────────────────────────\n```\n\n### Fallback Intent Sources (when no plan file found)\n\nWhen no plan file is detected, use these secondary intent sources:\n\n1. **Commit messages:** Run `git log origin/<base>..HEAD --oneline`. Use judgment to extract real intent:\n   - Commits with actionable verbs (\"add\", \"implement\", \"fix\", \"create\", \"remove\", \"update\") are intent signals\n   - Skip noise: \"WIP\", \"tmp\", \"squash\", \"merge\", \"chore\", \"typo\", \"fixup\"\n   - Extract the intent behind the commit, not the literal message\n2. **TODOS.md:** If it exists, check for items related to this branch or recent dates\n3. **PR description:** Run `gh pr view --json body -q .body 2>/dev/null` for intent context\n\n**With fallback sources:** Apply the same Cross-Reference classification (DONE/PARTIAL/NOT DONE/CHANGED) using best-effort matching. Note that fallback-sourced items are lower confidence than plan-file items.\n\n### Investigation Depth\n\nFor each PARTIAL or NOT DONE item, investigate WHY:\n\n1. Check `git log origin/<base>..HEAD --oneline` for commits that suggest the work was started, attempted, or reverted\n2. Read the relevant code to understand what was built instead\n3. Determine the likely reason from this list:\n   - **Scope cut** — evidence of intentional removal (revert commit, removed TODO)\n   - **Context exhaustion** — work started but stopped mid-way (partial implementation, no follow-up commits)\n   - **Misunderstood requirement** — something was built but it doesn't match what the plan described\n   - **Blocked by dependency** — plan item depends on something that isn't available\n   - **Genuinely forgotten** — no evidence of any attempt\n\nOutput for each discrepancy:\n```\nDISCREPANCY: {PARTIAL|NOT_DONE} | {plan item} | {what was actually delivered}\nINVESTIGATION: {likely reason with evidence from git log / code}\nIMPACT: {HIGH|MEDIUM|LOW} — {what breaks or degrades if this stays undelivered}\n```\n\n### Learnings Logging (plan-file discrepancies only)\n\n**Only for discrepancies sourced from plan files** (not commit messages or TODOS.md), log a learning so future sessions know this pattern occurred:\n\n```bash\n~/.vibestack/bin/vibe-learnings-log '{\n  \"type\": \"pitfall\",\n  \"key\": \"plan-delivery-gap-KEBAB_SUMMARY\",\n  \"insight\": \"Planned X but delivered Y because Z\",\n  \"confidence\": 8,\n  \"source\": \"observed\",\n  \"files\": [\"PLAN_FILE_PATH\"]\n}'\n```\n\nReplace KEBAB_SUMMARY with a kebab-case summary of the gap, and fill in the actual values.\n\n**Do NOT log learnings from commit-message-derived or TODOS.md-derived discrepancies.** These are informational in the review output but too noisy for durable memory.\n\n### Integration with Scope Drift Detection\n\nThe plan completion results augment the existing Scope Drift Detection. If a plan file is found:\n\n- **NOT DONE items** become additional evidence for **MISSING REQUIREMENTS** in the scope drift report.\n- **Items in the diff that don't match any plan item** become evidence for **SCOPE CREEP** detection.\n- **HIGH-impact discrepancies** trigger AskUserQuestion:\n  - Show the investigation findings\n  - Options: A) Stop and implement missing items, B) Ship anyway + create P1 TODOs, C) Intentionally dropped\n\nThis is **INFORMATIONAL** unless HIGH-impact discrepancies are found (then it gates via AskUserQuestion).\n\nUpdate the scope drift output to include plan file context:\n\n```\nScope Check: [CLEAN / DRIFT DETECTED / REQUIREMENTS MISSING]\nIntent: <from plan file — 1-line summary>\nPlan: <plan file path>\nDelivered: <1-line summary of what the diff actually does>\nPlan items: N DONE, M PARTIAL, K NOT DONE\n[If NOT DONE: list each missing item with investigation]\n[If scope creep: list each out-of-scope change not in the plan]\n```\n\n**No plan file found:** Use commit messages and TODOS.md as fallback sources (see above). If no intent sources at all, skip with: \"No intent sources detected — skipping completion audit.\"\n\n## Step 2: Read the checklist\n\nRead `.claude/skills/review/checklist.md`.\n\n**If the file cannot be read, STOP and report the error.** Do not proceed without the checklist.\n\n---\n\n## Step 2.5: Check for Greptile review comments\n\nRead `.claude/skills/review/greptile-triage.md` and follow the fetch, filter, classify, and **escalation detection** steps.\n\n**If no PR exists, `gh` fails, API returns an error, or there are zero Greptile comments:** Skip this step silently. Greptile integration is additive — the review works without it.\n\n**If Greptile comments are found:** Store the classifications (VALID & ACTIONABLE, VALID BUT ALREADY FIXED, FALSE POSITIVE, SUPPRESSED) — you will need them in Step 5.\n\n---\n\n## Step 3: Get the diff\n\nFetch the latest base branch to avoid false positives from stale local state:\n\n```bash\ngit fetch origin <base> --quiet\n```\n\nRun `git diff origin/<base>` to get the full diff. This includes both committed and uncommitted changes against the latest base branch.\n\n## Step 3.4: Workspace-aware queue status (advisory)\n\nCheck whether this PR's claimed VERSION still points at a free slot in the queue. Advisory only — never blocks review; just informs the reviewer about landing-order risk.\n\n```bash\nBRANCH_VERSION=$(git show HEAD:VERSION 2>/dev/null | tr -d '\\r\\n[:space:]' || echo \"\")\nBASE_BRANCH=$(gh pr view --json baseRefName -q .baseRefName 2>/dev/null || echo main)\nBASE_VERSION=$(git show origin/$BASE_BRANCH:VERSION 2>/dev/null | tr -d '\\r\\n[:space:]' || echo \"\")\nQUEUE_JSON=$(# bin/vibe-next-version (not yet implemented) \\\n  --base \"$BASE_BRANCH\" \\\n  --bump patch \\\n  --current-version \"$BASE_VERSION\" 2>/dev/null || echo '{\"offline\":true}')\nNEXT_SLOT=$(echo \"$QUEUE_JSON\" | jq -r '.version // empty')\nCLAIMED_COUNT=$(echo \"$QUEUE_JSON\" | jq -r '.claimed | length // 0')\nOFFLINE=$(echo \"$QUEUE_JSON\" | jq -r '.offline // false')\n```\n\n- If `OFFLINE=true`: skip this section (no signal to report).\n- Otherwise, include ONE line in the review output: `Version claimed: v<BRANCH_VERSION>. Queue: <CLAIMED_COUNT> PR(s) ahead. <VERDICT>` where VERDICT is either `Slot free` (if `BRANCH_VERSION >= NEXT_SLOT`) or `⚠ queue moved — rerun /ship to reconcile v<BRANCH_VERSION> → v<NEXT_SLOT>`.\n\n---\n\n## Step 3.5: Slop scan (advisory)\n\nRun a slop scan on changed files to catch AI code quality issues (empty catches,\nredundant `return await`, overcomplicated abstractions):\n\n```bash\n# slop scan: not available in vibestack — skip\ntrue\n```\n\nIf findings are reported, include them in the review output as an informational\ndiagnostic. Slop findings are advisory, never blocking. If slop:diff is not\navailable (e.g., slop-scan not installed), skip this step silently.\n\n---\n\n{{include lib/snippets/prior-learnings.md}}\n## Step 4: Critical pass (core review)\n\nApply the CRITICAL categories from the checklist against the diff:\nSQL & Data Safety, Race Conditions & Concurrency, LLM Output Trust Boundary, Shell Injection, Enum & Value Completeness.\n\nAlso apply the remaining INFORMATIONAL categories that are still in the checklist (Async/Sync Mixing, Column/Field Name Safety, LLM Prompt Issues, Type Coercion, View/Frontend, Time Window Safety, Completeness Gaps, Distribution & CI/CD).\n\n**Enum & Value Completeness requires reading code OUTSIDE the diff.** When the diff introduces a new enum value, status, tier, or type constant, use Grep to find all files that reference sibling values, then Read those files to check if the new value is handled. This is the one category where within-diff review is insufficient.\n\n**Search-before-recommending:** When recommending a fix pattern (especially for concurrency, caching, auth, or framework-specific behavior):\n- Verify the pattern is current best practice for the framework version in use\n- Check if a built-in solution exists in newer versions before recommending a workaround\n- Verify API signatures against current docs (APIs change between versions)\n\nTakes seconds, prevents recommending outdated patterns. If WebSearch is unavailable, note it and proceed with in-distribution knowledge.\n\nFollow the output format specified in the checklist. Respect the suppressions — do NOT flag items listed in the \"DO NOT flag\" section.\n\n## Confidence Calibration\n\nEvery finding MUST include a confidence score (1-10):\n\n| Score | Meaning | Display rule |\n|-------|---------|-------------|\n| 9-10 | Verified by reading specific code. Concrete bug or exploit demonstrated. | Show normally |\n| 7-8 | High confidence pattern match. Very likely correct. | Show normally |\n| 5-6 | Moderate. Could be a false positive. | Show with caveat: \"Medium confidence, verify this is actually an issue\" |\n| 3-4 | Low confidence. Pattern is suspicious but may be fine. | Suppress from main report. Include in appendix only. |\n| 1-2 | Speculation. | Only report if severity would be P0. |\n\n**Finding format:**\n\n\\`[SEVERITY] (confidence: N/10) file:line — description\\`\n\nExample:\n\\`[P1] (confidence: 9/10) app/models/user.rb:42 — SQL injection via string interpolation in where clause\\`\n\\`[P2] (confidence: 5/10) app/controllers/api/v1/users_controller.rb:18 — Possible N+1 query, verify with production logs\\`\n\n**Calibration learning:** If you report a finding with confidence < 7 and the user\nconfirms it IS a real issue, that is a calibration event. Your initial confidence was\ntoo low. Log the corrected pattern as a learning so future reviews catch it with\nhigher confidence.\n\n---\n\n## Step 4.5: Review Army — Specialist Dispatch\n\n### Detect stack and scope\n\n```bash\n# diff-scope not available — skip scope gating\n# Detect stack for specialist context\nSTACK=\"\"\n[ -f Gemfile ] && STACK=\"${STACK}ruby \"\n[ -f package.json ] && STACK=\"${STACK}node \"\n[ -f requirements.txt ] || [ -f pyproject.toml ] && STACK=\"${STACK}python \"\n[ -f go.mod ] && STACK=\"${STACK}go \"\n[ -f Cargo.toml ] && STACK=\"${STACK}rust \"\necho \"STACK: ${STACK:-unknown}\"\nDIFF_INS=$(git diff origin/<base> --stat | tail -1 | grep -oE '[0-9]+ insertion' | grep -oE '[0-9]+' || echo \"0\")\nDIFF_DEL=$(git diff origin/<base> --stat | tail -1 | grep -oE '[0-9]+ deletion' | grep -oE '[0-9]+' || echo \"0\")\nDIFF_LINES=$((DIFF_INS + DIFF_DEL))\necho \"DIFF_LINES: $DIFF_LINES\"\n# Detect test framework for specialist test stub generation\nTEST_FW=\"\"\n{ [ -f jest.config.ts ] || [ -f jest.config.js ]; } && TEST_FW=\"jest\"\n[ -f vitest.config.ts ] && TEST_FW=\"vitest\"\n{ [ -f spec/spec_helper.rb ] || [ -f .rspec ]; } && TEST_FW=\"rspec\"\n{ [ -f pytest.ini ] || [ -f conftest.py ]; } && TEST_FW=\"pytest\"\n[ -f go.mod ] && TEST_FW=\"go-test\"\necho \"TEST_FW: ${TEST_FW:-unknown}\"\n```\n\n### Read specialist hit rates (adaptive gating)\n\n```bash\n# specialist-stats not available in vibestack\n```\n\n### Select specialists\n\nBased on the scope signals above, select which specialists to dispatch.\n\n**Always-on (dispatch on every review with 50+ changed lines):**\n1. **Testing** — read `~/.claude/skills/review/specialists/testing.md`\n2. **Maintainability** — read `~/.claude/skills/review/specialists/maintainability.md`\n\n**If DIFF_LINES < 50:** Skip all specialists. Print: \"Small diff ($DIFF_LINES lines) — specialists skipped.\" Continue to Step 5.\n\n**Conditional (dispatch if the matching scope signal is true):**\n3. **Security** — if SCOPE_AUTH=true, OR if SCOPE_BACKEND=true AND DIFF_LINES > 100. Read `~/.claude/skills/review/specialists/security.md`\n4. **Performance** — if SCOPE_BACKEND=true OR SCOPE_FRONTEND=true. Read `~/.claude/skills/review/specialists/performance.md`\n5. **Data Migration** — if SCOPE_MIGRATIONS=true. Read `~/.claude/skills/review/specialists/data-migration.md`\n6. **API Contract** — if SCOPE_API=true. Read `~/.claude/skills/review/specialists/api-contract.md`\n7. **Design** — if SCOPE_FRONTEND=true. Use the existing design review checklist at `~/.claude/skills/review/design-checklist.md`\n\n### Adaptive gating\n\nAfter scope-based selection, apply adaptive gating based on specialist hit rates:\n\nFor each conditional specialist that passed scope gating, check the specialist stats output above:\n- If tagged `[GATE_CANDIDATE]` (0 findings in 10+ dispatches): skip it. Print: \"[specialist] auto-gated (0 findings in N reviews).\"\n- If tagged `[NEVER_GATE]`: always dispatch regardless of hit rate. Security and data-migration are insurance policy specialists — they should run even when silent.\n\n**Force flags:** If the user's prompt includes `--security`, `--performance`, `--testing`, `--maintainability`, `--data-migration`, `--api-contract`, `--design`, or `--all-specialists`, force-include that specialist regardless of gating.\n\nNote which specialists were selected, gated, and skipped. Print the selection:\n\"Dispatching N specialists: [names]. Skipped: [names] (scope not detected). Gated: [names] (0 findings in N+ reviews).\"\n\n---\n\n### Dispatch specialists in parallel\n\nFor each selected specialist, launch an independent subagent via the Agent tool.\n**Launch ALL selected specialists in a single message** (multiple Agent tool calls)\nso they run in parallel. Each subagent has fresh context — no prior review bias.\n\n**Each specialist subagent prompt:**\n\nConstruct the prompt for each specialist. The prompt includes:\n\n1. The specialist's checklist content (you already read the file above)\n2. Stack context: \"This is a {STACK} project.\"\n3. Past learnings for this domain (if any exist):\n\n```bash\n~/.vibestack/bin/vibe-learnings-search --type pitfall --query \"{specialist domain}\" --limit 5 2>/dev/null || true\n```\n\nIf learnings are found, include them: \"Past learnings for this domain: {learnings}\"\n\n4. Instructions:\n\n\"You are a specialist code reviewer. Read the checklist below, then run\n`git diff origin/<base>` to get the full diff. Apply the checklist against the diff.\n\nFor each finding, output a JSON object on its own line:\n{\\\"severity\\\":\\\"CRITICAL|INFORMATIONAL\\\",\\\"confidence\\\":N,\\\"path\\\":\\\"file\\\",\\\"line\\\":N,\\\"category\\\":\\\"category\\\",\\\"summary\\\":\\\"description\\\",\\\"fix\\\":\\\"recommended fix\\\",\\\"fingerprint\\\":\\\"path:line:category\\\",\\\"specialist\\\":\\\"name\\\"}\n\nRequired fields: severity, confidence, path, category, summary, specialist.\nOptional: line, fix, fingerprint, evidence, test_stub.\n\nIf you can write a test that would catch this issue, include it in the `test_stub` field.\nUse the detected test framework ({TEST_FW}). Write a minimal skeleton — describe/it/test\nblocks with clear intent. Skip test_stub for architectural or design-only findings.\n\nIf no findings: output `NO FINDINGS` and nothing else.\nDo not output anything else — no preamble, no summary, no commentary.\n\nStack context: {STACK}\nPast learnings: {learnings or 'none'}\n\nCHECKLIST:\n{checklist content}\"\n\n**Subagent configuration:**\n- Use `subagent_type: \"general-purpose\"`\n- Do NOT use `run_in_background` — all specialists must complete before merge\n- If any specialist subagent fails or times out, log the failure and continue with results from successful specialists. Specialists are additive — partial results are better than no results.\n\n---\n\n### Step 4.6: Collect and merge findings\n\nAfter all specialist subagents complete, collect their outputs.\n\n**Parse findings:**\nFor each specialist's output:\n1. If output is \"NO FINDINGS\" — skip, this specialist found nothing\n2. Otherwise, parse each line as a JSON object. Skip lines that are not valid JSON.\n3. Collect all parsed findings into a single list, tagged with their specialist name.\n\n**Fingerprint and deduplicate:**\nFor each finding, compute its fingerprint:\n- If `fingerprint` field is present, use it\n- Otherwise: `{path}:{line}:{category}` (if line is present) or `{path}:{category}`\n\nGroup findings by fingerprint. For findings sharing the same fingerprint:\n- Keep the finding with the highest confidence score\n- Tag it: \"MULTI-SPECIALIST CONFIRMED ({specialist1} + {specialist2})\"\n- Boost confidence by +1 (cap at 10)\n- Note the confirming specialists in the output\n\n**Apply confidence gates:**\n- Confidence 7+: show normally in the findings output\n- Confidence 5-6: show with caveat \"Medium confidence — verify this is actually an issue\"\n- Confidence 3-4: move to appendix (suppress from main findings)\n- Confidence 1-2: suppress entirely\n\n**Compute PR Quality Score:**\nAfter merging, compute the quality score:\n`quality_score = max(0, 10 - (critical_count * 2 + informational_count * 0.5))`\nCap at 10. Log this in the review result at the end.\n\n**Output merged findings:**\nPresent the merged findings in the same format as the current review:\n\n```\nSPECIALIST REVIEW: N findings (X critical, Y informational) from Z specialists\n\n[For each finding, in order: CRITICAL first, then INFORMATIONAL, sorted by confidence descending]\n[SEVERITY] (confidence: N/10, specialist: name) path:line — summary\n  Fix: recommended fix\n  [If MULTI-SPECIALIST CONFIRMED: show confirmation note]\n\nPR Quality Score: X/10\n```\n\nThese findings flow into Step 5 Fix-First alongside the CRITICAL pass findings from Step 4.\nThe Fix-First heuristic applies identically — specialist findings follow the same AUTO-FIX vs ASK classification.\n\n**Compile per-specialist stats:**\nAfter merging findings, compile a `specialists` object for the review-log entry in Step 5.8.\nFor each specialist (testing, maintainability, security, performance, data-migration, api-contract, design, red-team):\n- If dispatched: `{\"dispatched\": true, \"findings\": N, \"critical\": N, \"informational\": N}`\n- If skipped by scope: `{\"dispatched\": false, \"reason\": \"scope\"}`\n- If skipped by gating: `{\"dispatched\": false, \"reason\": \"gated\"}`\n- If not applicable (e.g., red-team not activated): omit from the object\n\nInclude the Design specialist even though it uses `design-checklist.md` instead of the specialist schema files.\nRemember these stats — you will need them for the review-log entry in Step 5.8.\n\n---\n\n### Red Team dispatch (conditional)\n\n**Activation:** Only if DIFF_LINES > 200 OR any specialist produced a CRITICAL finding.\n\nIf activated, dispatch one more subagent via the Agent tool (foreground, not background).\n\nThe Red Team subagent receives:\n1. The red-team checklist from `~/.claude/skills/review/specialists/red-team.md`\n2. The merged specialist findings from Step 4.6 (so it knows what was already caught)\n3. The git diff command\n\nPrompt: \"You are a red team reviewer. The code has already been reviewed by N specialists\nwho found the following issues: {merged findings summary}. Your job is to find what they\nMISSED. Read the checklist, run `git diff origin/<base>`, and look for gaps.\nOutput findings as JSON objects (same schema as the specialists). Focus on cross-cutting\nconcerns, integration boundary issues, and failure modes that specialist checklists\ndon't cover.\"\n\nIf the Red Team finds additional issues, merge them into the findings list before\nStep 5 Fix-First. Red Team findings are tagged with `\"specialist\":\"red-team\"`.\n\nIf the Red Team returns NO FINDINGS, note: \"Red Team review: no additional issues found.\"\nIf the Red Team subagent fails or times out, skip silently and continue.\n\n---\n\n## Step 5: Fix-First Review\n\n**Every finding gets action — not just critical ones.**\n\n### Step 5.0: Cross-review finding dedup\n\nBefore classifying findings, check if any were previously skipped by the user in a prior review on this branch.\n\n```bash\ntrue # vibe-review-read\n```\n\nParse the output: only lines BEFORE `---CONFIG---` are JSONL entries (the output also contains `---CONFIG---` and `---HEAD---` footer sections that are not JSONL — ignore those).\n\nFor each JSONL entry that has a `findings` array:\n1. Collect all fingerprints where `action: \"skipped\"`\n2. Note the `commit` field from that entry\n\nIf skipped fingerprints exist, get the list of files changed since that review:\n\n```bash\ngit diff --name-only <prior-review-commit> HEAD\n```\n\nFor each current finding (from both Step 4 critical pass and Step 4.5-4.6 specialists), check:\n- Does its fingerprint match a previously skipped finding?\n- Is the finding's file path NOT in the changed-files set?\n\nIf both conditions are true: suppress the finding. It was intentionally skipped and the relevant code hasn't changed.\n\nPrint: \"Suppressed N findings from prior reviews (previously skipped by user)\"\n\n**Only suppress `skipped` findings — never `fixed` or `auto-fixed`** (those might regress and should be re-checked).\n\nIf no prior reviews exist or none have a `findings` array, skip this step silently.\n\nOutput a summary header: `Pre-Landing Review: N issues (X critical, Y informational)`\n\n### Step 5a: Classify each finding\n\nFor each finding, classify as AUTO-FIX or ASK per the Fix-First Heuristic in\nchecklist.md. Critical findings lean toward ASK; informational findings lean\ntoward AUTO-FIX.\n\n**Test stub override:** Any finding that has a `test_stub` field (generated by a specialist)\nis reclassified as ASK regardless of its original classification. When presenting the ASK\nitem, show the proposed test file path and the test code. The user approves or skips the\ntest creation. If approved, write the fix + test file. Derive the test file path from\nthe finding's `path` using project conventions (`spec/` for RSpec, `__tests__/` for\nJest/Vitest, `test_` prefix for pytest, `_test.go` suffix for Go). If the test file\nalready exists, append the new test. Output: `[FIXED + TEST] [file:line] Problem -> fix + test at [test_path]`\n\n### Step 5b: Auto-fix all AUTO-FIX items\n\nApply each fix directly. For each one, output a one-line summary:\n`[AUTO-FIXED] [file:line] Problem → what you did`\n\n### Step 5c: Batch-ask about ASK items\n\nIf there are ASK items remaining, present them in ONE AskUserQuestion:\n\n- List each item with a number, the severity label, the problem, and a recommended fix\n- For each item, provide options: A) Fix as recommended, B) Skip\n- Include an overall RECOMMENDATION\n\nExample format:\n```\nI auto-fixed 5 issues. 2 need your input:\n\n1. [CRITICAL] app/models/post.rb:42 — Race condition in status transition\n   Fix: Add `WHERE status = 'draft'` to the UPDATE\n   → A) Fix  B) Skip\n\n2. [INFORMATIONAL] app/services/generator.rb:88 — LLM output not type-checked before DB write\n   Fix: Add JSON schema validation\n   → A) Fix  B) Skip\n\nRECOMMENDATION: Fix both — #1 is a real race condition, #2 prevents silent data corruption.\n```\n\nIf 3 or fewer ASK items, you may use individual AskUserQuestion calls instead of batching.\n\n### Step 5d: Apply user-approved fixes\n\nApply fixes for items where the user chose \"Fix.\" Output what was fixed.\n\nIf no ASK items exist (everything was AUTO-FIX), skip the question entirely.\n\n### Verification of claims\n\nBefore producing the final review output:\n- If you claim \"this pattern is safe\" → cite the specific line proving safety\n- If you claim \"this is handled elsewhere\" → read and cite the handling code\n- If you claim \"tests cover this\" → name the test file and method\n- Never say \"likely handled\" or \"probably tested\" — verify or flag as unknown\n\n**Rationalization prevention:** \"This looks fine\" is not a finding. Either cite evidence it IS fine, or flag it as unverified.\n\n### Greptile comment resolution\n\nAfter outputting your own findings, if Greptile comments were classified in Step 2.5:\n\n**Include a Greptile summary in your output header:** `+ N Greptile comments (X valid, Y fixed, Z FP)`\n\nBefore replying to any comment, run the **Escalation Detection** algorithm from greptile-triage.md to determine whether to use Tier 1 (friendly) or Tier 2 (firm) reply templates.\n\n1. **VALID & ACTIONABLE comments:** These are included in your findings — they follow the Fix-First flow (auto-fixed if mechanical, batched into ASK if not) (A: Fix it now, B: Acknowledge, C: False positive). If the user chooses A (fix), reply using the **Fix reply template** from greptile-triage.md (include inline diff + explanation). If the user chooses C (false positive), reply using the **False Positive reply template** (include evidence + suggested re-rank), save to both per-project and global greptile-history.\n\n2. **FALSE POSITIVE comments:** Present each one via AskUserQuestion:\n   - Show the Greptile comment: file:line (or [top-level]) + body summary + permalink URL\n   - Explain concisely why it's a false positive\n   - Options:\n     - A) Reply to Greptile explaining why this is incorrect (recommended if clearly wrong)\n     - B) Fix it anyway (if low-effort and harmless)\n     - C) Ignore — don't reply, don't fix\n\n   If the user chooses A, reply using the **False Positive reply template** from greptile-triage.md (include evidence + suggested re-rank), save to both per-project and global greptile-history.\n\n3. **VALID BUT ALREADY FIXED comments:** Reply using the **Already Fixed reply template** from greptile-triage.md — no AskUserQuestion needed:\n   - Include what was done and the fixing commit SHA\n   - Save to both per-project and global greptile-history\n\n4. **SUPPRESSED comments:** Skip silently — these are known false positives from previous triage.\n\n---\n\n## Step 5.5: TODOS cross-reference\n\nRead `TODOS.md` in the repository root (if it exists). Cross-reference the PR against open TODOs:\n\n- **Does this PR close any open TODOs?** If yes, note which items in your output: \"This PR addresses TODO: <title>\"\n- **Does this PR create work that should become a TODO?** If yes, flag it as an informational finding.\n- **Are there related TODOs that provide context for this review?** If yes, reference them when discussing related findings.\n\nIf TODOS.md doesn't exist, skip this step silently.\n\n---\n\n## Step 5.6: Documentation staleness check\n\nCross-reference the diff against documentation files. For each `.md` file in the repo root (README.md, ARCHITECTURE.md, CONTRIBUTING.md, CLAUDE.md, etc.):\n\n1. Check if code changes in the diff affect features, components, or workflows described in that doc file.\n2. If the doc file was NOT updated in this branch but the code it describes WAS changed, flag it as an INFORMATIONAL finding:\n   \"Documentation may be stale: [file] describes [feature/component] but code changed in this branch. Consider running `/document-release`.\"\n\nThis is informational only — never critical. The fix action is `/document-release`.\n\nIf no documentation files exist, skip this step silently.\n\n---\n\n## Step 5.7: Adversarial review (always-on)\n\nEvery diff gets adversarial review from both Claude and Codex. LOC is not a proxy for risk — a 5-line auth change can be critical.\n\n**Detect diff size and tool availability:**\n\n```bash\nDIFF_INS=$(git diff origin/<base> --stat | tail -1 | grep -oE '[0-9]+ insertion' | grep -oE '[0-9]+' || echo \"0\")\nDIFF_DEL=$(git diff origin/<base> --stat | tail -1 | grep -oE '[0-9]+ deletion' | grep -oE '[0-9]+' || echo \"0\")\nDIFF_TOTAL=$((DIFF_INS + DIFF_DEL))\nwhich codex 2>/dev/null && echo \"CODEX_AVAILABLE\" || echo \"CODEX_NOT_AVAILABLE\"\n# Legacy opt-out — only gates Codex passes, Claude always runs\nOLD_CFG=$(~/.vibestack/bin/vibe-config get codex_reviews 2>/dev/null || true)\necho \"DIFF_SIZE: $DIFF_TOTAL\"\necho \"OLD_CFG: ${OLD_CFG:-not_set}\"\n```\n\nIf `OLD_CFG` is `disabled`: skip Codex passes only. Claude adversarial subagent still runs (it's free and fast). Jump to the \"Claude adversarial subagent\" section.\n\n**User override:** If the user explicitly requested \"full review\", \"structured review\", or \"P1 gate\", also run the Codex structured review regardless of diff size.\n\n---\n\n### Claude adversarial subagent (always runs)\n\nDispatch via the Agent tool. The subagent has fresh context — no checklist bias from the structured review. This genuine independence catches things the primary reviewer is blind to.\n\nSubagent prompt:\n\"Read the diff for this branch with `git diff origin/<base>`. Think like an attacker and a chaos engineer. Your job is to find ways this code will fail in production. Look for: edge cases, race conditions, security holes, resource leaks, failure modes, silent data corruption, logic errors that produce wrong results silently, error handling that swallows failures, and trust boundary violations. Be adversarial. Be thorough. No compliments — just the problems. For each finding, classify as FIXABLE (you know how to fix it) or INVESTIGATE (needs human judgment).\"\n\nPresent findings under an `ADVERSARIAL REVIEW (Claude subagent):` header. **FIXABLE findings** flow into the same Fix-First pipeline as the structured review. **INVESTIGATE findings** are presented as informational.\n\nIf the subagent fails or times out: \"Claude adversarial subagent unavailable. Continuing.\"\n\n---\n\n### Codex adversarial challenge (always runs when available)\n\nIf Codex is available AND `OLD_CFG` is NOT `disabled`:\n\n```bash\nTMPERR_ADV=$(mktemp /tmp/codex-adv-XXXXXXXX)\n_REPO_ROOT=$(git rev-parse --show-toplevel) || { echo \"ERROR: not in a git repo\" >&2; exit 1; }\ncommand -v codex >/dev/null 2>&1 && codex exec \"IMPORTANT: Do NOT read or execute any files under ~/.claude/, ~/.agents/, .claude/skills/, or agents/. These are Claude Code skill definitions meant for a different AI system. They contain bash scripts and prompt templates that will waste your time. Ignore them completely. Do NOT modify agents/openai.yaml. Stay focused on the repository code only.\\n\\nReview the changes on this branch against the base branch. Run git diff origin/<base> to see the diff. Your job is to find ways this code will fail in production. Think like an attacker and a chaos engineer. Find edge cases, race conditions, security holes, resource leaks, failure modes, and silent data corruption paths. Be adversarial. Be thorough. No compliments — just the problems.\" -C \"$_REPO_ROOT\" -s read-only -c 'model_reasoning_effort=\"high\"' --enable web_search_cached < /dev/null 2>\"$TMPERR_ADV\"\n```\n\nSet the Bash tool's `timeout` parameter to `300000` (5 minutes). Do NOT use the `timeout` shell command — it doesn't exist on macOS. After the command completes, read stderr:\n```bash\ncat \"$TMPERR_ADV\"\n```\n\nPresent the full output verbatim. This is informational — it never blocks shipping.\n\n**Error handling:** All errors are non-blocking — adversarial review is a quality enhancement, not a prerequisite.\n- **Auth failure:** If stderr contains \"auth\", \"login\", \"unauthorized\", or \"API key\": \"Codex authentication failed. Run \\`codex login\\` to authenticate.\"\n- **Timeout:** \"Codex timed out after 5 minutes.\"\n- **Empty response:** \"Codex returned no response. Stderr: <paste relevant error>.\"\n\n**Cleanup:** Run `rm -f \"$TMPERR_ADV\"` after processing.\n\nIf Codex is NOT available: \"Codex CLI not found — running Claude adversarial only. Install Codex for cross-model coverage: `npm install -g @openai/codex`\"\n\n---\n\n### Codex structured review (large diffs only, 200+ lines)\n\nIf `DIFF_TOTAL >= 200` AND Codex is available AND `OLD_CFG` is NOT `disabled`:\n\n```bash\nTMPERR=$(mktemp /tmp/codex-review-XXXXXXXX)\n_REPO_ROOT=$(git rev-parse --show-toplevel) || { echo \"ERROR: not in a git repo\" >&2; exit 1; }\ncd \"$_REPO_ROOT\"\ncommand -v codex >/dev/null 2>&1 && codex review \"IMPORTANT: Do NOT read or execute any files under ~/.claude/, ~/.agents/, .claude/skills/, or agents/. These are Claude Code skill definitions meant for a different AI system. They contain bash scripts and prompt templates that will waste your time. Ignore them completely. Do NOT modify agents/openai.yaml. Stay focused on the repository code only.\\n\\nReview the diff against the base branch.\" --base <base> -c 'model_reasoning_effort=\"high\"' --enable web_search_cached < /dev/null 2>\"$TMPERR\"\n```\n\nSet the Bash tool's `timeout` parameter to `300000` (5 minutes). Do NOT use the `timeout` shell command — it doesn't exist on macOS. Present output under `CODEX SAYS (code review):` header.\nCheck for `[P1]` markers: found → `GATE: FAIL`, not found → `GATE: PASS`.\n\nIf GATE is FAIL, use AskUserQuestion:\n```\nCodex found N critical issues in the diff.\n\nA) Investigate and fix now (recommended)\nB) Continue — review will still complete\n```\n\nIf A: address the findings. Re-run `codex review` to verify.\n\nRead stderr for errors (same error handling as Codex adversarial above).\n\nAfter stderr: `rm -f \"$TMPERR\"`\n\nIf `DIFF_TOTAL < 200`: skip this section silently. The Claude + Codex adversarial passes provide sufficient coverage for smaller diffs.\n\n---\n\n### Persist the review result\n\nAfter all passes complete, persist:\n```bash\ntrue # vibe-review-log '{\"skill\":\"adversarial-review\",\"timestamp\":\"'\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\"'\",\"status\":\"STATUS\",\"source\":\"SOURCE\",\"tier\":\"always\",\"gate\":\"GATE\",\"commit\":\"'\"$(git rev-parse --short HEAD)\"'\"}'\n```\nSubstitute: STATUS = \"clean\" if no findings across ALL passes, \"issues_found\" if any pass found issues. SOURCE = \"both\" if Codex ran, \"claude\" if only Claude subagent ran. GATE = the Codex structured review gate result (\"pass\"/\"fail\"), \"skipped\" if diff < 200, or \"informational\" if Codex was unavailable. If all passes failed, do NOT persist.\n\n---\n\n### Cross-model synthesis\n\nAfter all passes complete, synthesize findings across all sources:\n\n```\nADVERSARIAL REVIEW SYNTHESIS (always-on, N lines):\n════════════════════════════════════════════════════════════\n  High confidence (found by multiple sources): [findings agreed on by >1 pass]\n  Unique to Claude structured review: [from earlier step]\n  Unique to Claude adversarial: [from subagent]\n  Unique to Codex: [from codex adversarial or code review, if ran]\n  Models used: Claude structured ✓  Claude adversarial ✓/✗  Codex ✓/✗\n════════════════════════════════════════════════════════════\n```\n\nHigh-confidence findings (agreed on by multiple sources) should be prioritized for fixes.\n\n---\n\n## Step 5.8: Persist Eng Review result\n\nAfter all review passes complete, persist the final `/review` outcome so `/ship` can\nrecognize that Eng Review was run on this branch.\n\nRun:\n\n```bash\ntrue # vibe-review-log '{\"skill\":\"review\",\"timestamp\":\"TIMESTAMP\",\"status\":\"STATUS\",\"issues_found\":N,\"critical\":N,\"informational\":N,\"quality_score\":SCORE,\"specialists\":SPECIALISTS_JSON,\"findings\":FINDINGS_JSON,\"commit\":\"COMMIT\"}'\n```\n\nSubstitute:\n- `TIMESTAMP` = ISO 8601 datetime\n- `STATUS` = `\"clean\"` if there are no remaining unresolved findings after Fix-First handling and adversarial review, otherwise `\"issues_found\"`\n- `issues_found` = total remaining unresolved findings\n- `critical` = remaining unresolved critical findings\n- `informational` = remaining unresolved informational findings\n- `quality_score` = the PR Quality Score computed in Step 4.6 (e.g., 7.5). If specialists were skipped (small diff), use `10.0`\n- `specialists` = the per-specialist stats object compiled in Step 4.6. Each specialist that was considered gets an entry: `{\"dispatched\":true/false,\"findings\":N,\"critical\":N,\"informational\":N}` if dispatched, or `{\"dispatched\":false,\"reason\":\"scope|gated\"}` if skipped. Include Design specialist. Example: `{\"testing\":{\"dispatched\":true,\"findings\":2,\"critical\":0,\"informational\":2},\"security\":{\"dispatched\":false,\"reason\":\"scope\"}}`\n- `findings` = array of per-finding records from Step 5. For each finding (from critical pass and specialists), include: `{\"fingerprint\":\"path:line:category\",\"severity\":\"CRITICAL|INFORMATIONAL\",\"action\":\"ACTION\"}`. ACTION is `\"auto-fixed\"` (Step 5b), `\"fixed\"` (user approved in Step 5d), or `\"skipped\"` (user chose Skip in Step 5c). Suppressed findings from Step 5.0 are NOT included (they were already recorded in a prior review entry).\n- `COMMIT` = output of `git rev-parse --short HEAD`\n\n## Capture Learnings\n\nIf you discovered a non-obvious pattern, pitfall, or architectural insight during\nthis session, log it for future sessions:\n\n```bash\n~/.vibestack/bin/vibe-learnings-log '{\"skill\":\"review\",\"type\":\"TYPE\",\"key\":\"SHORT_KEY\",\"insight\":\"DESCRIPTION\",\"confidence\":N,\"source\":\"SOURCE\",\"files\":[\"path/to/relevant/file\"]}'\n```\n\n**Types:** `pattern` (reusable approach), `pitfall` (what NOT to do), `preference`\n(user stated), `architecture` (structural decision), `tool` (library/framework insight),\n`operational` (project environment/CLI/workflow knowledge).\n\n**Sources:** `observed` (you found this in the code), `user-stated` (user told you),\n`inferred` (AI deduction), `cross-model` (both Claude and Codex agree).\n\n**Confidence:** 1-10. Be honest. An observed pattern you verified in the code is 8-9.\nAn inference you're not sure about is 4-5. A user preference they explicitly stated is 10.\n\n**files:** Include the specific file paths this learning references. This enables\nstaleness detection: if those files are later deleted, the learning can be flagged.\n\n**Only log genuine discoveries.** Don't log obvious things. Don't log things the user\nalready knows. A good test: would this insight save time in a future session? If yes, log it.\n\nIf the review exits early before a real review completes (for example, no diff against the base branch), do **not** write this entry.\n\n## Important Rules\n\n- **Read the FULL diff before commenting.** Do not flag issues already addressed in the diff.\n- **Fix-first, not read-only.** AUTO-FIX items are applied directly. ASK items are only applied after user approval. Never commit, push, or create PRs — that's /ship's job.\n- **Be terse.** One line problem, one line fix. No preamble.\n- **Only flag real problems.** Skip anything that's fine.\n- **Use Greptile reply templates from greptile-triage.md.** Every reply includes evidence. Never post vague replies.","tags":["review","vibestack","timurgaleev","agent-skills","ai-agents","claude-code","cursor-ide","developer-tools","kiro","mcp","prompt-engineering","slash-commands"],"capabilities":["skill","source-timurgaleev","skill-review","topic-agent-skills","topic-ai-agents","topic-claude-code","topic-cursor-ide","topic-developer-tools","topic-kiro","topic-mcp","topic-prompt-engineering","topic-slash-commands"],"categories":["vibestack"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/timurgaleev/vibestack/review","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add timurgaleev/vibestack","source_repo":"https://github.com/timurgaleev/vibestack","install_from":"skills.sh"}},"qualityScore":"0.457","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 15 github stars · SKILL.md body (46,481 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:06:23.643Z","embedding":null,"createdAt":"2026-05-18T19:06:23.643Z","updatedAt":"2026-05-18T19:06:23.643Z","lastSeenAt":"2026-05-18T19:06:23.643Z","tsv":"'+1':2699,3597 '+142':1359 '-1':874,892,913,2813,2832,5248,5267 '-10':2592,2598,6612 '-1440':902 '-2':2661,3645 '-4':2642,3635 '-4.6':4205 '-5':6635 '-6':2623,3621 '-8':2612 '-9':2817,2822,2836,2841,5252,5257,5271,5276,6625 '/.agents':5600,5920 '/.claude':5599,5919 '/.claude/skills/review/design-checklist.md':3038 '/.claude/skills/review/specialists/api-contract.md':3024 '/.claude/skills/review/specialists/data-migration.md':3015 '/.claude/skills/review/specialists/maintainability.md':2949 '/.claude/skills/review/specialists/performance.md':3006 '/.claude/skills/review/specialists/red-team.md':3928 '/.claude/skills/review/specialists/security.md':2994 '/.claude/skills/review/specialists/testing.md':2945 '/.vibestack/bin/vibe-config':5309 '/.vibestack/bin/vibe-learnings-log':1721,6547 '/.vibestack/bin/vibe-learnings-search':95,3257 '/.vibestack/bin/vibe-slug':50 '/.vibestack/projects':794 '/dev/null':52,54,78,93,99,133,158,170,249,267,296,311,325,501,766,777,789,805,866,872,884,890,906,911,1514,2166,2183,2195,2219,3266,5288,5314,5585,5722,5905,5980 '/document-release':5181,5192 '/learnings.jsonl':65 '/pr':620 '/projects':62 '/review':378,530,6288 '/ship':533,2290,6291,6771 '/tmp/codex-adv-xxxxxxxx':5562 '/tmp/codex-review-xxxxxxxx':5879 '0':109,2241,2816,2821,2824,2835,2840,2843,3072,3084,3167,3661,5251,5256,5259,5270,5275,5278,6441 '0.5':3668 '1':216,242,289,399,402,484,654,662,703,809,811,904,1034,1414,1416,1419,1440,1560,1905,1910,2591,2660,2942,3227,3500,3644,3921,4157,4537,4583,4773,4781,5124,5581,5587,5898,5907,6226,6611 '1.5':465 '10':3075,3600,3662,3671,6643 '10.0':6393 '100':2992 '18':2696 '2':51,53,77,92,98,132,157,169,228,248,260,266,295,300,310,324,414,500,537,743,765,776,788,804,865,871,883,889,905,910,1036,1487,1513,1578,1981,2165,2182,2194,2218,2946,3239,3265,3511,3665,3929,4164,4533,4558,4589,4777,4866,5142,5287,5313,5579,5586,5723,5896,5906,5981,6439,6443 '2.5':2005,4737 '20':947 '200':3895,5860,5865,6083,6181 '3':314,438,549,928,1038,1502,1589,2077,2641,2978,3247,3527,3634,3944,4595,4960 '3.4':2121 '3.5':2296 '300000':5734,5991 '4':565,2368,2995,3280,3759,4199,4998,6634 '4.5':2751,4204 '4.6':3480,3936,6383,6404 '4/7':1412 '42':2683,4540 '5':91,97,639,2075,2622,2968,3007,3264,3620,3748,4035,4078,4531,5227,5735,5813,5992,6458 '5.0':4092,6502 '5.5':5012 '5.6':5099 '5.7':5203 '5.8':3798,3885,6275 '5/10':2694 '50':1135,1145,2939,2953 '5a':4308 '5b':4445,6483 '5c':4477,6497 '5d':4610,6489 '6':686,3016 '7':2611,2714,3025,3612 '7.5':6385 '8':1740,6624 '8601':6336 '88':4561 '9':819,833,2597 '9/10':2681 'a-za-z0':815,829 'abstract':2319 'accomplish':548 'achiev':1300 'acknowledg':4813 'across':6148,6205 'action':1005,1014,1164,1172,1457,2061,4086,4162,4783,5190,6475,6476,6477 'activ':712,3850,3890,3904 'actual':669,1668,1763,1917,2638,3630 'adapt':2908,3039,3047 'add':1037,1042,1068,1077,1362,1372,1459,4547,4572 'addit':1816,2046,3471,4025,4061 'address':623,1281,1343,5051,6054,6737 'adjac':580 'adv':5560,5725,5759,5827 'adversari':5204,5212,5338,5351,5379,5475,5504,5537,5542,5698,5780,5841,6073,6091,6116,6208,6239,6247,6258,6353 'adversarial-review':6115 'advisori':2127,2144,2299,2346 'affect':5132 'agent':720,3186,3197,3911,5386,5603,5923 'agents/openai.yaml':5634,5954 'agre':6223,6264,6609 'ahead':2274 'ai':2309,5614,5934,6600 'algorithm':4764 'all-specialist':3134 'alongsid':3752 'alreadi':2064,3234,3942,3959,4427,4963,4969,6508,6683,6736 'also':2398,4135,5368 'alway':2932,3093,5207,5305,5381,5544,6132,6212 'always-on':2931,5206,6211 'analyz':7,380 'anyth':1016,3412,6789 'anyway':1862,4914 'api':2029,2532,2537,3017,3021,3130,3810,5798 'api-contract':3129,3809 'app/controllers/api/v1/users_controller.rb':2695 'app/models/post.rb':4539 'app/models/user.rb':2682 'app/services/generator.rb':4560 'appear':962 'append':4429 'appendix':2658,3638 'appli':1521,2373,2399,3046,3302,3608,3765,4454,4611,4616,6753,6759 'applic':3844 'approach':1290,6566 'approv':4383,4390,4614,6486,6762 'architectur':3394,6536,6575 'architecture.md':5120 'armi':2753 'array':4156,4288,6450 'ask':29,3776,4321,4334,4360,4369,4480,4482,4487,4598,4631,4805,6755 'askuserquest':1848,1883,4494,4604,4874,4976,6031 'async/sync':2410 'attack':5426,5676 'attempt':1575,1655 'audit':1176,1348,1979 'augment':1800 'auth':155,167,2497,2982,5229,5789,5794 'authent':5801,5807 'auto':3082,3773,4267,4318,4340,4447,4451,4468,4529,4637,4799,6480,6749 'auto-fix':3772,4266,4317,4339,4446,4450,4467,4528,4636,4798,6479,6748 'auto-g':3081 'avail':153,574,1648,2324,2354,2765,2915,5239,5291,5295,5547,5551,5834,5869 'avoid':2087 'await':2317 'awar':2124 'b':1860,4519,4556,4578,4812,4911,6046 'back':332 'backend':2987,2999 'background':1091,3444,3915 'base':11,113,208,338,366,388,418,428,746,939,2084,2118,2173,2186,2191,2208,2209,2216,2920,3044,3049,5651,5968,5970,6717 'basenam':780,825 'baserefnam':221,223,2179,2181 'bash':48,125,761,1720,2094,2158,2320,2760,2910,3256,4117,4185,5240,5558,5618,5728,5756,5876,5938,5985,6108,6303,6546 'batch':4479,4608,4803 'batch-ask':4478 'becom':1815,1837,5060 'begin':645 'behavior':2502 'behind':1480 'best':1532,2508 'best-effort':1531 'better':3475 'bias':3213,5395 'bin/vibe-next-version':2204 'blast':611 'blind':5409 'block':692,1637,2147,2348,3386,5770,5779 'bodi':497,499,1510,1512,4885 'boost':3594 'boundari':18,2392,4009,5472 'branch':12,114,189,198,209,254,272,339,359,367,383,389,401,405,413,419,429,545,770,772,870,957,1498,2085,2119,2159,2174,2192,2210,2282,4116,5152,5178,5418,5648,5652,5969,6301,6718 'break':916,1684 'bug':2605 'build':476 'built':1587,1627,2520 'built-in':2519 'bump':2211 'c':1866,4814,4839,4921,5706,5713,5971 'cach':1373,1377,2496,5721,5979 'cache-rel':1376 'calibr':2583,2705,2727 'call':3199,4605 'candid':3071 'cannot':1990 'cap':1131,3598,3669 'captur':6524 'cargo.toml':2798 'case':528,1267,1754,5446,5683 'cat':5757 'catch':397,2308,2314,2745,3364,5403 'categori':1189,2376,2403,2476,3328,3329,3338,3346,3560,3567,6471 'caught':3943 'caveat':2632,3624 'cd':814,828,5899 'ceo':1121 'cfg':5308,5323,5325,5330,5554,5872 'challeng':5543 'chang':433,560,586,608,679,1076,1242,1282,1331,1379,1382,1420,1946,2114,2305,2538,2940,4181,4226,4247,5128,5159,5175,5230,5645 'changed-fil':4225 'chao':5429,5679 'check':41,151,400,449,473,647,707,1221,1369,1492,1561,1895,2006,2128,2465,2516,3062,4101,4207,4277,4567,5102,5125,6015 'checkbox':1025 'checklist':1984,2003,2379,2409,2567,3036,3231,3290,3304,3428,3429,3926,3983,4016,5394 'checklist.md':4329 'choic':1127 'choos':4820,4838,4932 'chore':1474 'chose':4623,6493 'ci/cd':2427 'cite':1237,4659,4674,4712 'claim':2133,2232,2239,2269,4645,4654,4667,4680 'classif':1527,2059,3777,4365 'classifi':1225,2018,4099,4309,4315,4734,5486 'claud':5216,5304,5337,5350,5378,5506,5536,5606,5840,5926,6089,6163,6166,6230,6238,6255,6257,6606 'claude.md':5122 'claude/skills':5601,5921 'claude/skills/review/checklist.md':1986 'claude/skills/review/greptile-triage.md':2012 'claus':2691 'clean':648,1896,6144,6339 'cleanup':5822 'clear':1227,1309,3388,4909 'cli':152,286,5836 'close':5037 'code':34,471,1190,1582,1678,2310,2433,2603,3286,3957,4244,4380,4677,5127,5155,5174,5438,5607,5640,5668,5927,5960,6012,6249,6592,6622 'codex':5218,5286,5290,5293,5302,5311,5334,5371,5541,5549,5584,5588,5800,5804,5809,5817,5831,5835,5844,5854,5867,5904,5908,6010,6032,6060,6072,6090,6161,6171,6185,6244,6246,6259,6608 'coercion':2419 'collect':3481,3490,3528,4158 'column':1078 'column/field':2412 'command':185,287,355,3948,5582,5743,5752,5902,6000 'comment':2010,2038,2054,4723,4732,4748,4759,4784,4869,4878,4965,5000,6731 'commentari':3419 'commit':504,517,1441,1455,1482,1568,1604,1622,1706,1771,1956,2111,4167,4985,6135,6331,6332,6515,6764 'commit-message-deriv':1770 'common':527,835 'compar':557 'compat':769 'compil':3778,3786,6401 'complet':571,1175,1347,1411,1798,1978,2397,2424,2430,3448,3489,5630,5753,5950,6051,6106,6202,6284,6710 'compliment':5479,5702 'compon':5134 'comput':790,3547,3648,3654,6380 'concern':4007 'concis':1186,4890 'concret':2604 'concurr':2388,2495 'condit':20,2387,2969,3056,3889,4231,4542,4588,5448,5685 'confid':1543,1739,2582,2589,2614,2634,2644,2673,2680,2693,2713,2731,2749,3322,3344,3584,3595,3609,3611,3619,3626,3633,3643,3718,3721,6217,6262,6557,6610 'config':1193,4129,4137 'configur':3432 'confirm':2718,3591,3603,3735,3737 'conftest.py':2887 'conserv':1305 'consid':5179,6409 'constant':2449 'construct':3218 'contain':137,145,1161,1170,4136,5617,5793,5937 'content':745,760,938,3232,3430 'content-bas':744,937 'context':705,757,943,1090,1517,1607,1893,2773,3209,3241,3421,5077,5392 'context/background':1088 'continu':858,2965,3463,4076,5540,6047 'contract':3018,3131,3811 'contributing.md':5121 'control':1053,1261,1368 'convent':4408 'convers':704,717,756,942 'core':2371 'correct':2619,2737 'corrupt':4593,5457,5695 'could':2625 'count':72,84,89,1341,2233,3664,3667 'cover':163,175,4019,4682 'coverag':628,5849,6095 'creat':534,1035,1046,1083,1259,1356,1407,1462,1863,5056,6767 'creation':354,4388 'creep':583,1841,1939 'critic':2369,2375,3320,3663,3701,3712,3754,3822,3901,4089,4200,4304,4330,4538,5187,5233,6035,6318,6364,6367,6417,6440,6463,6473 'cross':1196,1525,4005,4094,5015,5027,5104,5847,6196,6603 'cross-cut':4004 'cross-model':5846,6195,6602 'cross-refer':1195,1524,5014,5026,5103 'cross-review':4093 'current':382,408,412,775,956,2214,2507,2535,3694,4194 'current-vers':2213 'cut':1598,4006 'd':80,855,2168,2197 'data':1074,2384,3008,3102,3127,3807,4592,5456,5694 'data-migr':3101,3126,3806 'date':1501,6119 'datetim':6337 'db':4569 'db/migrate/20240315_create_users.rb':1410 'decid':1101 'decis':1123,6577 'deduct':6601 'dedup':4097 'dedupl':3543 'default':197,271 'defaultbranchref':233 'defaultbranchref.name':235 'defer':1109 'definit':5609,5929 'degrad':1686 'del':2826,2849,5261,5284 'delet':2837,5272,6662 'deliv':661,1669,1735,1909 'deliveri':1727 'demonstr':2608 'depend':1639,1642 'depth':1550 'deriv':1773,1776,4396 'descend':3719 'describ':1018,1294,1324,1636,5137,5157,5171 'describe/it/test':3385 'descript':492,621,1504,2677,3331,6556 'design':840,3026,3034,3132,3397,3812,3857,6432 'design-checklist.md':3863 'design-on':3396 'detect':110,116,337,358,468,584,615,650,988,1434,1795,1805,1842,1898,1976,2021,2756,2769,2855,3164,3376,4763,5234,6656 'determin':187,1590,4768 'diagnost':2342 'diff':8,43,345,385,445,454,457,552,626,668,1199,1202,1223,1231,1252,1276,1313,1381,1829,1916,2080,2101,2107,2351,2382,2436,2439,2480,2762,2806,2809,2825,2828,2844,2846,2848,2851,2853,2951,2959,2960,2990,3295,3301,3307,3893,3947,3986,4187,4833,5107,5131,5210,5235,5241,5244,5260,5263,5279,5281,5283,5317,5319,5376,5415,5421,5655,5660,5858,5863,5965,6039,6081,6098,6180,6391,6714,6729,6740 'diff-scop':2761 'differ':967,1289,1303,1338,5613,5933 'dir':846,857,863,881,898 'direct':736,4457,6754 'disabl':5332,5557,5875 'discov':6528 'discoveri':702,6671 'discrep':1659,1660,1696,1700,1777,1846,1876 'discuss':5086 'dispatch':2755,2930,2934,2970,3076,3094,3156,3172,3817,3818,3830,3838,3888,3905,5383,6413,6422,6424,6436,6445 'display':2595 'distribut':2426,2558 'doc':1194,2536,5140,5145 'document':5100,5109,5166,5195 'doesn':1630,5091,5745,6002 'domain':3252,3262,3278 'done':917,1022,1226,1271,1307,1355,1371,1391,1398,1406,1413,1418,1556,1663,1813,1922,1927,1930,4981 'done/changed':1529 'done/partial/not':1528 'draft':4550 'drift':467,649,672,1794,1804,1824,1887,1897 'drop':1868 'dt':6123 'durabl':1789 'e.g':1257,2355,3845,6384 'e2e':1399 'earli':6705 'earlier':577,6234 'echo':81,103,920,924,2172,2184,2201,2220,2225,2234,2243,2802,2823,2842,2850,2898,5258,5277,5289,5292,5316,5321,5572,5889 'edg':1266,5445,5682 'effect':22 'effort':1533,4918,5716,5974 'either':2278,4711 'els':102,3408,3413 'elsewher':4671 'empti':2231,2313,5815 'enabl':5718,5976,6654 'encod':996 'end':3680 'eng':6277,6295 'engin':5430,5680 'enhanc':5785 'enough':1320 'enterpris':165 'entir':3647,4642 'entri':85,3795,3882,4132,4151,4171,6412,6514,6723 'enum':2395,2428,2443 'environment/cli/workflow':6583 'error':977,1997,2032,5459,5465,5573,5772,5775,5890,6067,6069 'escal':2020,4762 'especi':2493 'etc':5123 'eval':49 'evalu':566 'even':3111,3859 'event':2728 'everi':342,1013,2584,2936,4083,5209,6799 'everyth':4634 'evid':1228,1273,1310,1599,1652,1674,1817,1838,3353,4713,4850,4944,6802 'exampl':2678,4525,6434,6712 'exec':5589 'execut':5595,5915 'exhaust':1608 'exist':202,489,514,1249,1264,1491,1802,2026,2523,3033,3255,4175,4282,4428,4633,5025,5093,5197,5747,6004 'exit':5580,5897,6704 'expand':610 'explain':4889,4902 'explan':4834 'explicit':1108,5359,6640 'exploit':2607 'extract':251,269,1007,1012,1132,1163,1218,1452,1477 'f':67,246,264,2775,2780,2785,2787,2792,2797,2865,2867,2872,2877,2879,2884,2886,2891,5825,6078 'fail':288,303,317,330,2028,3455,4069,5440,5532,5670,5802,6021,6029,6177,6191 'failur':3461,4012,5453,5469,5690,5790 'fall':331 'fallback':281,748,1421,1519,1538,1961 'fallback-sourc':1537 'fals':2066,2088,2249,2628,3831,3839,4815,4840,4845,4867,4895,4937,5006,6425,6446 'fast':5346 'featur':595,970,5133 'feature/component':5172 'fetch':349,441,2016,2081,2096 'fewer':4597 'fi':101,107 'field':255,273,3342,3373,3552,4168,4352 'file':58,69,76,559,585,701,714,726,752,837,922,927,933,975,981,987,991,1000,1011,1055,1059,1154,1169,1240,1315,1351,1427,1432,1547,1695,1704,1743,1745,1809,1892,1904,1953,1989,2306,2455,2463,2675,3237,3325,3869,4180,4220,4227,4375,4395,4399,4426,4436,4470,4687,4879,5110,5114,5141,5146,5170,5196,5597,5917,6561,6644,6648,6659 'file-level':1054 'fill':1760 'filter':2017 'final':4649,6287 'find':896,1852,2330,2344,2453,2585,2670,2711,3073,3085,3168,3310,3399,3402,3405,3484,3494,3505,3531,3546,3569,3573,3580,3617,3642,3683,3687,3699,3709,3744,3756,3768,3785,3820,3902,3933,3971,3977,3993,4024,4031,4041,4055,4084,4096,4100,4155,4195,4215,4218,4236,4251,4262,4287,4311,4314,4331,4336,4346,4403,4710,4729,4790,5070,5088,5165,5435,5485,5501,5510,5524,5665,5681,6056,6147,6204,6222,6263,6328,6329,6346,6363,6368,6373,6415,6438,6449,6454,6461,6499 'fine':2651,4706,4716,6792 'fingerprint':3335,3352,3541,3549,3551,3571,3577,4160,4174,4210,6468 'finish':638 'firm':4778 'first':115,841,946,3713,3751,3763,4038,4081,4326,4796,5517,6350,6743 'fix':1461,2065,2491,3332,3334,3351,3728,3730,3750,3762,3774,4037,4080,4264,4268,4319,4325,4341,4393,4434,4439,4448,4452,4456,4469,4509,4516,4530,4546,4555,4571,4577,4581,4615,4617,4624,4628,4638,4752,4795,4800,4809,4822,4826,4912,4928,4964,4970,4984,5189,5493,5516,6043,6273,6349,6481,6484,6742,6750,6781 'fix-first':3749,3761,4036,4079,4324,4794,5515,6348,6741 'fixabl':5488,5509 'fixup':1476 'flag':2573,2580,3115,4699,4718,5065,5160,6667,6734,6785 'flow':1403,3745,4797,5511 'focus':4002,5636,5956 'follow':1620,2014,2560,3769,3968,4792 'follow-up':1619 'footer':4140 'forc':3114,3138 'force-includ':3137 'foreground':3913 'forgotten':1650 'format':1345,2563,2671,3691,4526 'found':733,935,976,982,992,1001,1157,1428,1811,1878,1954,2056,3271,3509,3966,4063,5838,6019,6023,6033,6152,6156,6218,6316,6357,6359,6588 'fp':4754 'framework':2500,2512,2857,3378 'framework-specif':2499 'free':2139,2280,5344 'fresh':3208,5391 'friend':4774 'frontend':3003,3029 'full':1150,2106,3300,5361,5762,6728 'function':1263,1323 'futur':1111,1714,2743,6544,6695 'fw':2864,2870,2875,2882,2889,2894,2900,2902,3380 'g':5852 'gap':629,1728,1758,2425,3991 'gate':1881,2768,2909,3040,3048,3061,3070,3083,3092,3144,3150,3165,3610,3837,3841,5301,5367,6020,6024,6027,6133,6134,6169,6174,6428 'gemfil':2776 'general':3437 'general-purpos':3436 'generat':2862,4353 'generous':1329 'genuin':1649,5401,6670 'get':129,410,801,2078,2104,3298,4085,4176,5211,5310,6410 'get-url':128,800 'gh':154,217,229,493,1506,2027,2175 'git':118,126,183,279,290,304,318,344,346,348,350,404,440,444,506,551,771,781,798,808,1201,1206,1444,1562,1676,2095,2100,2161,2188,2808,2827,3294,3946,3985,4186,5243,5262,5420,5565,5577,5654,5882,5894,6136,6518 'git-nat':182,278 'github':141,162,164,215 'github.com':138 'gitlab':146,149,174,241 'glab':166,243,261 'global':4862,4956,4994 'go':2796,2896,4422 'go-test':2895 'go.mod':2793,2892 'goal':1298,1334 'good':6686 'grep':868,886,2451,2814,2819,2833,2838,5249,5254,5268,5273 'greptil':2008,2037,2043,2053,4722,4731,4740,4747,4864,4877,4901,4958,4996,6794 'greptile-histori':4863,4957,4995 'greptile-triage.md':4766,4830,4942,4974,6798 'group':3568 'gt':90 'h':6124 'handl':978,1269,2471,4670,4676,4693,5466,5773,6070,6351 'harmless':4920 'hasn':4245 'head':509,554,873,891,912,1033,1204,1209,1447,1565,2163,4139,4191,6141,6523 'header':4296,4745,5508,6014 'heurist':3764,4327 'high':1680,1844,1874,2613,5717,5975,6216,6261 'high-confid':6260 'high-impact':1843,1873 'higher':2748 'highest':3583 'histori':4865,4959,4997 'hit':2906,3052,3097 'hole':5450,5687 'home':60 'home/.claude/plans':851 'home/.codex/plans':852 'home/.vibestack':61 'home/.vibestack/projects':848 'honest':6614 'host':119,178,719 'human':5498 'ident':3766 'identifi':538 'ignor':1087,4146,4922,5628,5948 'impact':1679,1845,1875 'imper':1040 'implement':634,1032,1215,1236,1286,1353,1385,1460,1617,1857,2207 'import':5590,5910,6724 'in':2807,2847,5242,5282 'in-distribut':2556 'includ':724,1890,2109,2261,2333,2365,2587,2656,3121,3139,3226,3272,3367,3855,4521,4738,4787,4831,4849,4943,4978,6431,6467,6505,6645,6801 'incomplet':1256 'incorpor':569 'incorrect':4906 'independ':3182,5402 'individu':4603 'infer':6599,6627 'inform':689,1780,1871,2150,2341,2402,3321,3666,3703,3715,3824,4306,4335,4559,5069,5164,5184,5528,5767,6183,6320,6369,6372,6419,6442,6474 'initi':2730 'inject':2394,2685 'inlin':4832 'input':4536 'insert':2818,5253 'insight':1731,6537,6555,6580,6690 'instal':2360,5843,5851 'instead':1388,1588,3864,4606 'instruct':363,3281 'insuffici':2483 'insur':3105 'integr':1791,2044,4008 'intent':523,541,564,593,653,1422,1438,1454,1466,1479,1516,1601,1867,1901,1967,1974,3389,4239 'interpol':2688 'introduc':2440 'investig':1549,1558,1670,1851,1936,5496,5523,6041 'isn':1646 'iso':6335 'issu':26,392,2312,2417,2640,2723,3366,3632,3969,4010,4026,4062,4302,4532,6036,6151,6157,6315,6356,6358,6735 'item':1006,1015,1026,1096,1110,1130,1136,1149,1156,1165,1173,1179,1182,1220,1234,1248,1279,1284,1354,1390,1405,1494,1540,1548,1557,1641,1665,1814,1826,1836,1859,1920,1934,2574,4370,4453,4483,4488,4497,4512,4599,4619,4632,5045,6751,6756 'jest':2871 'jest.config.js':2868 'jest.config.ts':2866 'jest/vitest':4414 'job':3974,5432,5662,6773 'jq':498,2228,2237,2246 'json':220,232,247,265,496,1509,2178,2203,2227,2236,2245,3313,3518,3526,3995,4573,6327,6330 'jsonl':4131,4145,4150 'judgment':1450,5499 'jump':5347 'k':1925 'kebab':1729,1748,1753 'kebab-cas':1752 'keep':3578 'key':1724,5799,6552,6554 'know':1716,3939,5490,6684 'knowledg':2559,6584 'known':5005 'l':74,869,887 'label':4503 'land':4,38,371,2155,4299 'landing-ord':2154 'larg':5857 'later':6661 'latest':2083,2117 'launch':3180,3188 'layer':1374 'leak':5452,5689 'lean':4332,4337 'learn':57,68,71,75,82,83,88,104,1691,1712,1768,2706,2741,3249,3269,3275,3279,3424,3425,6525,6651,6664 'legaci':5296 'length':2240 'less':483 'level':1056,4884 'lib/snippets/prior-learnings.md':2366 'library/framework':6579 'like':1592,1671,2618,4692,5424,5674 'limit':96,3263 'line':655,663,948,1360,1906,1911,2263,2676,2845,2852,2854,2941,2952,2961,2962,2991,3318,3326,3337,3350,3515,3521,3559,3562,3726,3894,4127,4437,4465,4471,4662,4880,5228,5861,6215,6470,6777,6780 'list':673,682,1151,1596,1931,1940,2575,3535,4032,4178,4495 'liter':1485 'llm':16,2389,2415,4562 'load':86 'loc':5219 'local':2092 'locat':838 'log':347,507,1207,1445,1563,1677,1692,1710,1767,2704,2735,3459,3672,3794,3881,6113,6308,6541,6669,6674,6679,6699 'logic':5458 'login':5795,5805 'look':1023,3989,4705,5443 'lookup':795 'low':1682,2643,2734,4917 'low-effort':4916 'lower':1542 'ls':860,878,908 'm':1923,6122,6125 'maco':5749,6006 'main':313,334,643,2185,2654,3641 'maintain':2947,3125,3803 'mark':1097 'marker':6018 'master':327 'match':1534,1632,1833,2616,2973,4211 'max':3660 'maxdepth':903 'may':2649,4601,5167 'md':864,882,900,5113 'mean':1339,2594 'meant':5610,5930 'mechan':4802 'medium':1681,2633,3625 'memori':1790 'mention':599 'merg':351,1473,3450,3483,3653,3682,3686,3784,3931,3970,4027 'messag':461,505,518,723,1442,1486,1707,1772,1957,3195 'met':1336 'method':4689 'mid':1614 'mid-way':1613 'might':4270 'migrat':1084,1192,1404,3009,3012,3103,3128,3808 'minim':3383 'minut':5736,5814,5993 'miss':613,652,681,1262,1367,1819,1858,1900,1933,3980 'misunderstood':1623 'mix':2411 'mktemp':5561,5878 'mmin':901 'mode':731,4013,5454,5691 'model':1075,1258,1364,5714,5848,5972,6197,6253,6604 'moder':2624 'modifi':1039,1050,1061,5633,5953 'move':2288,3636 'mr':244 'multi':3589,3733 'multi-specialist':3588,3732 'multipl':3196,6220,6267 'must':1325,2586,3447 'n':914,918,1147,1921,2170,2199,2698,3087,3157,3170,3323,3327,3698,3821,3823,3825,3963,4250,4301,4746,5642,5962,6034,6214,6317,6319,6321,6416,6418,6420,6558 'n/10':2674,3722 'name':340,360,899,2413,3159,3161,3166,3340,3540,3724,4189,4684 'name-on':4188 'nativ':184,280 'need':2071,3875,4534,4977,5497 'neither':179 'never':2146,2347,3091,4263,4690,5186,5769,6763,6803 'new':594,1058,2442,2468,4431 'newer':2525 'next':698,2223,2284 'node':2784 'nois':1469 'noisi':1787 'nomatch':764 'non':5778,6531 'non-block':5777 'non-obvi':6530 'none':105,3427,4284 'normal':2610,2621,3614 'note':1142,1180,1301,1535,2551,3145,3601,3738,4056,4165,5043 'noth':421,480,482,3407,3510 'npm':5850 'nreview':5643,5963 'number':1029,4500 'o':763 'object':3314,3519,3789,3854,3996,6400 'observ':1742,6586,6616 'obvious':6532,6675 'occur':1719 'oe':2815,2820,2834,2839,5250,5255,5269,5274 'offlin':2221,2242,2248,2251 'old':5307,5322,5324,5329,5553,5871 'omit':3851 'one':2262,2475,3906,4090,4460,4464,4493,4872,6776,6779 'one-lin':4463 'onelin':510,1210,1448,1566 'open':1095,5032,5039 'openai/codex':5853 'oper':6581 'opt':5298 'opt-out':5297 'option':1853,3349,4514,4897 'order':2156,3711 'origin':131,442,446,508,553,803,1203,1208,1446,1564,2097,2102,2190,2810,2829,3296,3987,4364,5245,5264,5422,5656 'origin/main':309 'origin/master':323 'otherwis':150,2260,3512,3557,6355 'out-of-scop':675,1942 'outcom':6289 'outdat':2545 'output':420,458,640,1344,1656,1784,1888,2267,2338,2390,2562,3066,3311,3403,3411,3492,3499,3502,3607,3618,3681,3992,4125,4134,4293,4433,4461,4563,4625,4651,4726,4744,5048,5763,6008,6516 'outsid':2434 'overal':4523 'overcompl':2318 'overrid':4344,5355 'p0':2669 'p1':1864,2679,5366,6017 'p2':1118,2692 'p3':1119 'p4':1120 'package.json':2781 'parallel':3175,3204 'paramet':5732,5989 'pars':307,321,784,3493,3513,3530,4123,5568,5885,6139,6521 'partial':633,1243,1361,1415,1553,1616,1661,1924,3472 'pass':2370,3059,3755,4201,5303,5335,6025,6092,6105,6150,6155,6176,6190,6201,6227,6283,6464 'past':3248,3274,3423 'patch':2212 'path':727,1352,1746,3324,3336,3345,3558,3566,3725,4221,4376,4400,4405,4443,5696,6469,6649 'path/to/existing.rb':1062 'path/to/file.ts':1060 'path/to/relevant/file':6562 'pattern':1718,2492,2505,2546,2615,2645,2738,4656,6533,6564,6617 'per':3780,4322,4859,4953,4991,6397,6453 'per-find':6452 'per-project':4858,4952,4990 'per-specialist':3779,6396 'perform':2996,3123,3805 'permalink':4887 'permiss':995 'persist':6099,6107,6194,6276,6285 'personal/local':843 'pipelin':5518 'pitfal':1723,3259,6534,6567 'plan':570,602,700,713,725,730,751,796,821,823,836,845,849,856,859,862,876,877,880,894,895,897,915,919,921,923,926,932,974,980,986,990,999,1010,1139,1148,1153,1160,1168,1219,1293,1346,1349,1350,1426,1431,1546,1635,1640,1664,1694,1703,1726,1732,1744,1797,1808,1835,1891,1903,1908,1919,1950,1952 'plan-delivery-gap-kebab':1725 'plan-fil':1545,1693 'platform':111,120,139,147,160,172,284 'point':2136 'polici':3106 'posit':2067,2089,2629,4816,4841,4846,4868,4896,4938,5007 'possibl':2697 'post':6804 'pr':5,33,218,372,491,494,513,536,1503,1507,2025,2131,2176,2272,3649,3739,5030,5036,5050,5055,6377 'pr/mr':191,201,353 'practic':2509 'pre':3,37,370,4298 'pre-land':2,36,369,4297 'preambl':47,3415,6783 'prefer':6572,6638 'prefix':4416 'prerequisit':5788 'present':1327,3554,3564,3684,4367,4490,4870,5500,5526,5760,6007 'prevent':2543,4590,4703 'previous':4105,4213,4255,5009 'primari':706,5406 'print':335,2957,3079,3153,4248 'prior':3211,4112,4253,4280,6512 'priorit':6271 'proactiv':44 'probabl':4695 'problem':1092,4438,4472,4505,5482,5705,6778,6787 'proceed':695,2000,2554 'process':5829 'produc':3899,4647,5461 'product':2703,5442,5672 'project':791,839,968,3246,4407,4860,4954,4992,6582 'prompt':2416,3120,3217,3220,3225,3949,5412,5621,5941 'propos':4373 'prove':4663 'provid':4513,5076,6093 'proxi':5223 'prs':6768 'purpos':3438 'push':6765 'pwd':826 'pyproject.toml':2788 'pytest':2890,4418 'pytest.ini':2885 'python':2791 'q':222,234,1511,2180 'qualiti':472,2311,3650,3656,3658,3740,5784,6322,6374,6378 'queri':2700,3260 'question':1093,4641 'queue':1384,2125,2143,2202,2226,2235,2244,2271,2287 'quiet':443,2098 'r':2169,2198,2229,2238,2247 'race':2386,4541,4587,5447,5684 'radius':612 'ran':6162,6168,6252 'rank':4854,4948 'rate':2907,3053,3098 'ration':4702 're':425,4276,4853,4947,6058,6629 're-check':4275 're-rank':4852,4946 're-run':6057 'read':485,490,503,944,1008,1579,1982,1985,1992,2011,2432,2461,2601,2904,2944,2948,2993,3005,3014,3023,3235,3288,3981,4122,4672,5017,5413,5593,5711,5754,5913,6064,6726,6746 'read-on':5710,6745 'readme.md':5119 'real':1453,2722,4586,6708,6786 'reason':1593,1672,3832,3840,5715,5973,6426,6447 'receiv':3920 'recent':1500 'reclassifi':4358 'recogn':6293 'recommend':2487,2489,2528,2544,3333,3729,4508,4518,4524,4580,4907,6045 'reconcil':2292 'record':1126,6455,6509 'red':3814,3847,3886,3917,3924,3953,4022,4039,4047,4051,4057,4066 'red-team':3813,3846,3923,4046 'redi':1383 'redund':2315 'ref':293 'refactor':597 'refer':1197,1526,2457,5016,5028,5083,5105,6652 'referenc':754 'refs/remotes/origin':299 'refs/remotes/origin/head':294 'regardless':3095,3142,4361,5374 'regress':4271 'relat':1378,1495,5073,5087 'relev':953,1581,4243 'reli':515 'reliabl':741 'remain':2401,4489,6344,6361,6365,6370 'rememb':3870 'remot':123,127,799 'remov':1463,1602,1605 'replac':1747 'repli':4756,4779,4823,4827,4842,4847,4899,4925,4934,4939,4966,4971,6795,6800,6806 'repo':195,230,262,779,888,5117,5563,5578,5707,5880,5895,5900 'report':1103,1107,1825,1995,2259,2332,2655,2664,2709 'repositori':5021,5639,5959 'request':479,660,5360 'requir':614,616,632,651,685,1064,1308,1624,1820,1899,2431,3341 'requirements.txt':2786 'rerun':2289 'resolut':4724 'resourc':5451,5688 'respect':2568 'respons':5816,5820 'result':205,572,1799,3465,3473,3478,3677,5463,6102,6175,6279 'return':2030,2316,4053,5818 'reusabl':6565 'rev':306,320,783,5567,5884,6138,6520 'rev-pars':305,319,782,5566,5883,6137,6519 'revert':1577,1603 'review':1,6,31,35,39,373,423,470,644,694,1102,1106,1122,1783,2009,2048,2148,2152,2266,2337,2372,2481,2744,2752,2937,3035,3088,3171,3212,3287,3676,3695,3697,3793,3880,3955,3961,4059,4082,4095,4113,4121,4184,4254,4281,4300,4650,5080,5205,5213,5312,5362,5364,5373,5399,5407,5505,5522,5781,5856,5909,6013,6048,6061,6101,6112,6117,6173,6209,6232,6250,6278,6282,6296,6307,6310,6354,6513,6549,6703,6709 'review-log':3792,3879 'risk':2157,5225 'rm':5824,6077 'root':5022,5118,5564,5708,5881,5901 'rspec':2880,2883,4411 'rubi':2779 'rule':2596,6725 'run':376,403,439,531,550,1200,1443,1505,2099,2300,3110,3202,3293,3442,3984,4760,5180,5306,5341,5369,5382,5545,5653,5803,5823,5839,6059,6298,6302 'rust':2801 'safe':4658 'safeti':15,2385,2414,2423,4664 'save':4855,4949,4987,6691 'say':364,4691,6011 'scan':2298,2303,2322,2358 'schema':3868,3998,4574 'scope':466,582,646,678,1114,1117,1597,1793,1803,1823,1840,1886,1894,1938,1945,2759,2763,2767,2923,2974,2981,2986,2998,3002,3011,3020,3028,3043,3060,3162,3829,3833,6427,6448 'scope-bas':3042 'score':2590,2593,3585,3651,3657,3659,3741,6323,6324,6375,6379 'script':5619,5939 'search':747,758,834,940,2485,5720,5978 'search-before-recommend':2484 'second':2542 'secondari':1437 'section':581,1089,1104,1124,2255,2581,4141,5353,6086 'secur':2979,3099,3122,3804,5449,5686,6444 'sed':297,806 'see':1963,5658 'select':2918,2926,3045,3149,3155,3178,3190 'self':177 'self-host':176 'servic':1049 'session':1715,6540,6545,6696 'set':4228,5327,5726,5983 'setopt':762 'sever':2666,2672,3319,3343,3720,4502,6472 'sha':4986 'share':3574 'shell':2393,5742,5999 'ship':1861,5771 'short':6140,6522,6553 'show':407,774,786,1143,1849,2162,2189,2609,2620,2630,3613,3622,3736,4371,4875,5570,5887 'show-curr':406,773 'show-toplevel':785,5569,5886 'sibl':2458 'side':21 'sidekiq':1387 'signal':742,1467,2257,2924,2975 'signatur':2533 'signup':1402 'silent':2042,2364,3113,4074,4292,4591,5002,5097,5201,5455,5464,5693,6087 'sinc':529,4182 'singl':3194,3534 'size':5236,5318,5377 'skeleton':3384 'skeptic':568 'skill':5608,5928,6114,6309,6548 'skill-review' 'skip':983,989,997,1004,1166,1174,1468,1971,1977,2039,2253,2327,2361,2766,2954,2964,3077,3152,3160,3390,3506,3520,3827,3835,4073,4106,4163,4173,4214,4240,4256,4261,4289,4385,4520,4557,4579,4639,5001,5094,5198,5333,6084,6178,6389,6430,6491,6494,6788 'slop':2297,2302,2321,2343,2350,2357 'slop-scan':2356 'slot':2140,2224,2279,2285 'slug':55,63,792,797,822,824,850 'small':2958,6390 'smaller':6097 'solut':2522 'someth':1625,1644 'sort':3716 'sourc':1423,1439,1520,1539,1701,1741,1962,1968,1975,6129,6130,6158,6207,6221,6268,6559,6560,6585 'source-timurgaleev' 'space':2171,2200 'spec':4409 'spec/spec_helper.rb':2878 'specialist':2754,2772,2859,2905,2912,2919,2928,2956,2963,3051,3057,3064,3080,3107,3136,3141,3147,3158,3173,3179,3191,3215,3223,3229,3261,3285,3339,3348,3446,3453,3468,3469,3487,3497,3508,3539,3590,3604,3696,3706,3723,3734,3767,3781,3788,3801,3858,3867,3898,3932,3964,4001,4015,4045,4206,4356,6325,6326,6387,6394,6398,6406,6433,6466 'specialist-stat':2911 'specialist1':3592 'specialist2':3593 'specif':1057,1239,1322,2501,2602,4661,6647 'specifi':2564 'specul':2662 'sql':14,2383,2684 'squash':1472 'src/services/user_service.rb':1358 'stack':2757,2770,2774,2777,2778,2782,2783,2789,2790,2794,2795,2799,2800,2803,2804,3240,3245,3420,3422 'stale':2091,5101,5169,6655 'start':635,1574,1610 'stat':447,555,2811,2830,2913,3065,3782,3872,5246,5265,6399 'state':522,540,563,592,631,2093,6574,6595,6641 'statement':1041 'status':156,168,2126,2445,4544,4549,6127,6128,6143,6313,6314,6338 'stay':1689,5635,5955 'stderr':5755,5792,5821,6065,6076 'step':108,213,398,464,578,699,1030,1980,2004,2022,2041,2074,2076,2120,2295,2363,2367,2750,2967,3479,3747,3758,3797,3884,3935,4034,4077,4091,4198,4203,4291,4307,4444,4476,4609,4736,5011,5096,5098,5200,5202,6235,6274,6382,6403,6457,6482,6488,6496,6501 'still':2135,2406,5340,6050 'stop':437,463,1612,1855,1993 'store':2057 'string':2687 'structur':25,391,5363,5372,5398,5521,5855,6172,6231,6256,6576 'stub':2861,3355,3372,3392,4343,4351 'subag':3183,3206,3216,3431,3434,3454,3488,3908,3919,4068,5339,5352,5380,5389,5411,5507,5531,5538,6167,6241 'subsequ':212,343 'substitut':356,6142,6333 'succeed':159,171,225,237,257,275 'success':3467 'suffici':6094 'suffix':4420 'suggest':45,1570,4851,4945 'summari':656,664,1187,1730,1749,1755,1907,1912,3330,3347,3417,3727,3972,4295,4466,4741,4886 'suppos':546 'suppress':2068,2570,2652,3639,3646,4234,4249,4260,4999,6498 'sure':6631 'suspici':2647 'swallow':5468 'symbol':292 'symbolic-ref':291 'synthes':6203 'synthesi':6198,6210 'system':722,5615,5935 'sz':6126 'tabl':1081,1409 'tag':3069,3090,3536,3586,4043 'tail':2812,2831,5247,5266 'take':2541 'target':192,253 'tbd':1099 'team':3815,3848,3887,3918,3925,3954,4023,4040,4048,4052,4058,4067 'templat':4780,4828,4848,4940,4972,5622,5942,6796 'ters':6775 'test':394,627,1063,1065,1069,1191,1389,1393,1400,2856,2860,2863,2869,2874,2881,2888,2893,2897,2899,2901,2943,3124,3354,3361,3371,3377,3379,3391,3802,4342,4350,4374,4379,4387,4394,4398,4412,4415,4425,4432,4435,4440,4442,4681,4686,4696,6435,6687 'test.go':4419 'test/services/user_service_test.rb':1396 'text':1183 'thing':5404,6676,6680 'think':5423,5673 'thorough':5477,5700 'though':3860 'tier':2446,4772,4776,6131 'time':2421,3457,4071,5534,5627,5810,5947,6692 'timeout':5731,5741,5808,5988,5998 'timestamp':6118,6311,6312,6334 'tmp':1471 'tmperr':5559,5724,5758,5826,5877,5982,6079 'todo':1100,1606,1865,5013,5033,5040,5052,5062,5074 'todos.md':486,520,619,1488,1709,1775,1959,5018,5090 'todos.md/pr':618 'told':6597 'tool':3187,3198,3912,5238,5387,5729,5986,6578 'top':1144,4883 'top-level':4882 'topic-agent-skills' 'topic-ai-agents' 'topic-claude-code' 'topic-cursor-ide' 'topic-developer-tools' 'topic-kiro' 'topic-mcp' 'topic-prompt-engineering' 'topic-slash-commands' 'toplevel':787,5571,5888 'total':5280,5320,5864,6082,6360 'touch':1317 'toward':1246,4333,4338 'tr':79,778,812,813,827,2167,2196 'transit':4545 'treat':971 'triag':5010 'trigger':1847 'true':100,502,767,820,2222,2252,2328,2977,2983,2988,3000,3004,3013,3022,3030,3267,3819,4118,4233,5315,6109,6304,6437 'true/false':6414 'trust':17,2391,5471 'type':1722,2418,2448,3258,3435,4566,6550,6551,6563 'type-check':4565 'typo':1475 'u':6120 'unaddress':684 'unauthor':5796 'unavail':2550,5539,6187 'uncommit':2113 'undeliv':1690 'understand':1212,1584 'uniqu':6228,6236,6242 'unit':1392 'unknown':56,64,180,283,2805,2903,4701 'unless':1872 'unread':994,1003 'unrel':589 'unresolv':6345,6362,6366,6371 'unverifi':4721 'updat':1464,1884,4553,5149 'url':124,130,136,144,802,4888 'use':27,181,203,226,238,258,276,312,326,734,1287,1435,1449,1530,1955,2450,2515,3031,3374,3433,3441,3555,3862,4406,4602,4771,4824,4843,4935,4967,5739,5996,6030,6254,6392,6793 'user':1408,2717,3118,4109,4258,4382,4613,4622,4819,4837,4931,5354,5358,6485,6492,6573,6594,6596,6637,6682,6761 'user-approv':4612 'user-st':6593 'userservic':1357,1395 'v':2270,2293,2294,5583,5903 'vagu':6805 'valid':929,1363,1365,2060,2062,3525,4575,4750,4782,4961 'valu':1764,2396,2429,2444,2459,2469 'verb':1458 'verbatim':1184,5764 'verdict':2276 'verif':4643 'verifi':308,322,950,1072,2503,2531,2599,2635,2701,3627,4697,6063,6619 'version':2134,2160,2164,2187,2193,2215,2217,2230,2268,2283,2513,2526,2540 'via':936,1882,2686,3184,3909,4873,5384 'vibe':4120,6111,6306 'vibe-review-log':6110,6305 'vibe-review-read':4119 'vibestack':59,1105,2326,2917 'vibestack/plans':853 'view':219,231,245,263,495,1508,2177 'view/frontend':2420 'violat':19,5473 'vitest':2876 'vitest.config.ts':2873 'vs':3775 'w':1052 'wast':5625,5945 'way':1615,5436,5666 'wc':73 'web':5719,5977 'websearch':2548 'wherev':361 'whether':2129,4769 'window':2422 'wip':1470 'within':2479 'within-diff':2478 'without':2001,2050 'work':959,1019,1129,1245,1572,1609,2049,5057 'workaround':2530 'workflow':379,5136 'workspac':2123 'workspace-awar':2122 'would':2667,3363,6688 'write':3359,3381,4391,4570,6721 'wrong':4910,5462 'x':1028,1043,1067,1079,1733,3700,4303,4749 'x/10':3742 'xarg':867,885,907 'y':1045,1071,1082,1736,3702,4305,4751,6121 'yes':5042,5064,5082,6698 'yet':106,2206 'z':875,893,1048,1073,1086,1738,3705,4753 'z0':818,832 'za':817,831 'zero':2036 'zsh':768","prices":[{"id":"d4a82e65-a50c-4581-80ac-85098a058c90","listingId":"bd5b4931-dd6f-492a-9956-ec93436fe6a2","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"timurgaleev","category":"vibestack","install_from":"skills.sh"},"createdAt":"2026-05-18T19:06:23.643Z"}],"sources":[{"listingId":"bd5b4931-dd6f-492a-9956-ec93436fe6a2","source":"github","sourceId":"timurgaleev/vibestack/review","sourceUrl":"https://github.com/timurgaleev/vibestack/tree/main/skills/review","isPrimary":false,"firstSeenAt":"2026-05-18T19:06:23.643Z","lastSeenAt":"2026-05-18T19:06:23.643Z"}],"details":{"listingId":"bd5b4931-dd6f-492a-9956-ec93436fe6a2","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"timurgaleev","slug":"review","github":{"repo":"timurgaleev/vibestack","stars":15,"topics":["agent-skills","ai-agents","claude-code","cursor-ide","developer-tools","kiro","mcp","prompt-engineering","slash-commands"],"license":"mit","html_url":"https://github.com/timurgaleev/vibestack","pushed_at":"2026-05-18T18:19:05Z","description":"vibestack is a portable skill pack for AI coding agents. Slash commands like /office-hours, /ship, /investigate, /tdd, /review install once and work across every agent that supports the Agent Skills open standard — Claude Code, Cursor, Kiro, and a growing list of others. ","skill_md_sha":"115e596fca557f19d65b97c9b354a0fd97a7c240","skill_md_path":"skills/review/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/timurgaleev/vibestack/tree/main/skills/review"},"layout":"multi","source":"github","category":"vibestack","frontmatter":{"name":"review","description":"Pre-landing PR review. Analyzes diff against the base branch for SQL safety, LLM trust\nboundary violations, conditional side effects, and other structural issues. Use when\nasked to \"review this PR\", \"code review\", \"pre-landing review\", or \"check my diff\".\nProactively suggest when the user is about to merge or land code changes."},"skills_sh_url":"https://skills.sh/timurgaleev/vibestack/review"},"updatedAt":"2026-05-18T19:06:23.643Z"}}