Skip to content
Back to skills

Grill

ASecurity

Architecture fitness evaluation — optional, on-demand skill that challenges existing architecture and engineering decisions. Produces a scored report with ROI-ranked refactoring recommendations. Adversarial posture: challenges rather than describes. Systematically finds blindspots and loopholes. Prefers .understand/architecture-map.md as starting point but runs standalone if missing. Read-only.

  • 2 stars
  • 0 votes
  • 0 copies
  • 4 views
  • Added May 26, 2026
developmentpythonrustgobashsqlnoderefactoringcode-reviewgitapi

Works with

  • cli
  • api
  • mcp

Security analysis

A100/100

Pro scans all 2 files and shows the line behind each finding

Scanned May 27, 2026

npx -y skills add iamvonpasion/hashb --skill grill --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Grill?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Grill
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/iamvonpasion-grill/badge)](https://www.skillsdirectory.com/skills/iamvonpasion-grill)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
description: >
  Architecture fitness evaluation — optional, on-demand skill that challenges existing
  architecture and engineering decisions. Produces a scored report with ROI-ranked
  refactoring recommendations. Adversarial posture: challenges rather than describes.
  Systematically finds blindspots and loopholes. Prefers .understand/architecture-map.md
  as starting point but runs standalone if missing. Read-only.
argument-hint: "[scope or subsystem path]"
---

# Grill

Challenge the architecture and engineering decisions of an existing codebase.
Produce a scored fitness report with ROI-ranked refactoring recommendations.

**Writes `.grill/grill-{date}.md` only. No code changes.**

**This skill is OPTIONAL and on-demand.** It is never a required step in any recipe.
Users invoke it deliberately when they want an architecture fitness evaluation.

---

## When to Use

| Signal | Why grill? |
|--------|------------|
| "Is our architecture still fit for purpose?" | This is the core question grill answers |
| "Are we over-engineered?" | Simplicity audit identifies unjustified abstractions |
| "Should we refactor X?" | ROI matrix ranks which debts to pay down first |
| Before a major refactoring initiative | Challenge decisions before redesigning |
| Quarterly or annual architecture review | Periodic health check on the foundation |
| After significant growth (team, traffic, features) | Check whether original decisions still hold |
| Onboarding to a brownfield codebase (optional follow-up to `/understand`) | Go beyond mapping to evaluation |

**Don't use when:**
- You want a map of what exists — use `/understand`
- You want hashb rule compliance scoring — use `/audit`
- You want to design a new subsystem — use `/eng arch`
- You want to review code on a diff — use `/review`
- You want to simplify a specific file — use `/simplify`
- You have a specific question to investigate — use `/explore`

---

## Hard Boundaries

| Does NOT | Delegated to |
|----------|--------------|
| Do exhaustive architecture mapping | `/understand` (preferred upstream; grill builds minimal inventory if absent) |
| Score hashb rule compliance | `/audit` |
| Design the replacement architecture | `/eng arch` (handoff) |
| Review code-level quality on a diff | `/review` |
| Apply code simplification | `/simplify` (handoff) |
| Modify any files (other than `.grill/` report) | — |

**Core principle:** Grill surfaces decisions worth revisiting and estimates ROI.
It does NOT design the replacement. That is `/hashb:eng arch`'s job, fed by this skill's findings.

**Evidence principle:** Grill gathers its own evidence when it needs it. `/understand`'s
map is a starting point, not a ceiling. When a pass's claim rests on a stale or
missing map entry, grill reads the code, queries the graph, or runs git log
directly. No pass ships a conclusion that depends only on an unverified map entry.

---

## Execution Flow (MANDATORY)

> **This is the ONLY valid sequence. Never skip or reorder phases.**
> Each gate marked **STOP** requires completion before proceeding.

```
┌─────────────────────────────────────────────────┐
│ Phase 0: Prerequisites + MCP detect             │
└────────────────────┬────────────────────────────┘
                     │
┌────────────────────┴────────────────────────────┐
│ Phase 1: Inventory (map + graph verification)   │
└────────────────────┬────────────────────────────┘
                     │
┌────────────────────┴────────────────────────────┐
│ Phase 2: Grill (6 evaluation passes, incl. F)   │
└────────────────────┬────────────────────────────┘
                     │
              ■ STOP │ User reviews raw findings before synthesis
                     │
┌────────────────────┴────────────────────────────┐
│ Phase 3: Synthesize (Fowler quadrant + ROI)     │
└────────────────────┬────────────────────────────┘
                     │
┌────────────────────┴────────────────────────────┐
│ Phase 4: Report                                 │
└────────────────────┬────────────────────────────┘
                     │
              ■ STOP │ User reviews final report
```

Max 2 gates. Single session.

---

## Presentation Rules

1. **Wizard flow** — present one phase at a time. Never dump everything at once.
2. **Gate placement** — both gates (Phase 2 mid-skill, Phase 4 final) emit at the BOTTOM of their phase output, after raw findings / final report respectively. The reader has context to decide without scrolling back up.
3. **Progress indicator** — every output starts with the block below; **re-emit the full block at the start of any phase that contains a gate** (Phase 2 and Phase 4):

```
/grill ══════════════════════════════════════════════════════════

  ▸ Phase 0    Prerequisites
  ○ Phase 1    Inventory
  ○ Phase 2    Grill (6 passes)
  ○ Phase 3    Synthesize
  ○ Phase 4    Report

═════════════════════════════════════════════════════════════════
```

Update `▸` (current), `✓` (done), `○` (pending) as phases progress.
Completed phases show a status note on the right (e.g., `✓ 7 modules`, `✓ 6 passes`, `✓ {N} findings`, `✓ {score}/100`).

Also follow the shared formatting rules in `skills/shared/formatting.md`.

---

## Phase 0: Prerequisites

### Required Input

```bash
# The architecture map from /understand is a hard prerequisite.
ls .understand/architecture-map.md 2>/dev/null

# Project Profile for quality-attribute scenario selection
cat CLAUDE.md 2>/dev/null | head -80

# Existing ADRs (optional — enables Assumption Freshness pass)
ls -d docs/adr/ docs/adrs/ adr/ 2>/dev/null
ls docs/adr/*.md adr/*.md 2>/dev/null
```

### Prerequisite Gate

`/understand`'s map is a **starting point, not a ceiling**. Trust but verify —
spot-check the map against current code, and gather additional evidence when a
pass needs it (direct file reads, git log, or graph queries). Do not refuse to
run because an upstream artifact is missing or stale.

| Condition | Action |
|-----------|--------|
| `.understand/architecture-map.md` exists and is current | Use as starting point. Spot-check with graph queries or file reads where a pass needs more resolution. |
| Map exists but is stale (> 30 days old) | Warn user. Proceed but verify aggressively via graph queries and direct code scan. Treat map entries as hypotheses, not facts. |
| `.understand/architecture-map.md` missing | Proceed in **standalone mode**. Build minimal inventory via graphify MCP (if available) or direct code scan (module dirs, entry points, dependency manifests). Label report "Standalone — no architecture map." Never refuse. |
| Map contradicts observed code | Record the contradiction as a finding (Inadvertent + Reckless — the map is lying to the team). Trust current code. |
| No Project Profile | Proceed with degraded scenarios. Flag in report. |
| No ADRs found | Proceed. Assumption Freshness pass runs in "infer from code" mode. |

### Graphify MCP Integration

When the graphify MCP server is available, grill uses it to gather evidence
directly — not just to speed up `/understand`'s job. The graph provides
live, structural truth that a map may have drifted from.

Detect availability (same pattern as `/understand`):

```bash
python -c "import graphify; print('graphify installed')" 2>/dev/null || echo "not installed"
```

Check for `mcpServers.graphify` in Claude config. If configured, tools available:
`query_graph`, `get_node`, `get_neighbors`, `get_community`, `god_nodes`,
`graph_stats`, `shortest_path`.

| MCP Tool | Which Pass | Purpose |
|----------|------------|---------|
| `get_community` | C, F | Verify module boundaries vs. the map; detect communities the map omitted |
| `god_nodes` | C, F | Identify coupling hotspots directly — no reliance on map's coupling field |
| `get_neighbors` | C, E, F | Trace actual dependency direction per module; verify ADR coupling claims |
| `shortest_path` | C, F | Detect circular dependencies and unexpected inter-module links |
| `graph_stats` | C, F | Overall density / modularity metrics — sanity-check the map's scale claims |
| `query_graph` | F | Open-ended structural queries for blindspot detection |

**Budget:** Max 8 MCP queries total across all passes (3 more than `/understand`
because grill evaluates, not just describes). Reserve at least 2 for Pass F.
If `code-review-graph` MCP is also available, same budget counts both combined.

**If graphify is unavailable:** All passes run in standard mode — direct file
reads, grep, git log. Label affected findings "evidence: file read" so the user
can judge confidence. Do not refuse.

### Scope Card

Present before proceeding:

```
GRILL ──────────────────────────────────────────────────────────

  Repo             {name}
  Date             {date}
  Map source       {.understand/architecture-map.md (generated date) | standalone}
  Profile          {Architecture | Platform | Stack from CLAUDE.md — or "none"}
  ADRs             {count — or "none found"}
  Modules          {N from map | N from graphify | N from directory scan}
  Focus            {full system | user-specified subsystem}
  MCP              {graphify available — graph-accelerated | not configured | not installed}

  MODE: {map-guided | standalone | hybrid}

─────────────────────────────────────────────────────────────────
```

No gate. Proceed to Phase 1.

---

## Phase 1: Inventory

Build the Architecture Inventory from the map and codebase.

### Enumerate

For each module in the architecture map, collect:

| Column | Source |
|--------|--------|
| Module | From architecture map Module Boundaries |
| Declared pattern | From Project Profile Architecture field |
| Detected patterns | From convention detection — read 2-3 representative files per module |
| Dependencies | From architecture map Key Dependencies |
| Coupling level | From architecture map Coupling & Risk Areas |
| Age signal | Git history — first commit date, last substantive change |

Budget: max 5 files per module. Sample, don't exhaustively scan.

### Inventory Table

```
ARCHITECTURE INVENTORY
─────────────────────────────────────────────────
| Module | Pattern | Deps | Coupling | Age |
|--------|---------|------|----------|-----|
| {name} | {pattern} | {count} | {H/M/L} | {months} |
```

No gate. Proceed to Phase 2.

---

## Phase 2: Grill (6 Evaluation Passes)

> **All six passes are mandatory** unless prerequisites are missing (e.g., no ADRs).
> Skip a pass only by explicitly marking it "SKIPPED: {reason}" in the report.

> **Evidence discipline (I1, I8):** Each pass gathers its own evidence — don't
> stop at what the map says. If a pass's claim rests on a map entry that can't
> be re-verified against code or graph, label it `Inferred` or `Unverified`,
> not `Verified`.

See `references.md` for detailed per-pass checklists, signals, and scoring rubrics.

### Pass A — Simplicity Audit (Karpathy-inspired)

Challenge unjustified complexity. For each abstraction layer ask: "Is this justified
by actual variation, or is it speculative extensibility?"

**Countable signals** (every finding must cite a concrete signal, not vibes):

| Signal | What it suggests |
|--------|-------------------|
| Interface with 1 implementation | Speculative abstraction |
| Generic type instantiated with 1 concrete type | Speculative extensibility |
| Plugin/strategy system with 1 plugin | Speculative extensibility |
| Factory returning a single type | Unjustified indirection |
| Abstract class with 1 subclass | Premature abstraction |
| Wrapper functions that only call through | Accidental indirection |
| Configuration for values that never change | Speculative configurability |
| Layers beyond what the problem demands | "Layer cake" over-engineering |

**Senior Engineer Test per module:** "Would a senior engineer joining today say
this is overcomplicated for what it does?"

Record findings with file:line evidence.

### Pass B — Structural Fitness (ATAM-lite)

Define 3–5 quality-attribute scenarios derived from Project Profile. For each,
trace through the architecture: does the current structure support this well,
poorly, or not at all?

See `references.md` for scenario templates per stack (SaaS, CLI, API-only, library,
mobile, embedded).

**Per-scenario output:**

| Scenario | Support | Sensitivity Point | Trade-off |
|----------|---------|-------------------|-----------|
| {scenario} | {well/poor/none} | {where small changes cascade} | {what improving this would cost} |

### Pass C — Coupling / Cohesion Assessment

Go beyond `/understand`'s descriptive coupling map to evaluate: is this coupling
level *appropriate*?

| Check | Signal |
|-------|--------|
| Modules coupled but serving unrelated concerns | Should split |
| Modules decoupled but always changing together | Should merge (shotgun surgery) |
| God modules | Architectural hotspot, likely refactor target |
| Circular dependencies | Boundary violation |
| Dependency direction violations (e.g., domain → infrastructure) | Inverted dependency |
| Cross-module DB access | Leaky boundary |
| Public API surface disproportionate to module size | Missing encapsulation |

### Pass D — Technology Fit

For each major dependency / framework, evaluate fit against current constraints.

| Check | Signal |
|-------|--------|
| Over-powered tool for the problem | e.g., enterprise framework for CRUD app |
| Under-powered tool for the scale | e.g., SQLite for multi-tenant SaaS at scale |
| Deprecated / abandoned dependency still load-bearing | Hidden debt |
| Multiple libraries solving the same problem | Inconsistency, duplicate maintenance |
| Build/toolchain complexity disproportionate to app complexity | Meta-complexity tax |

If Context7 MCP is available, check deprecation status and current best practices
for each major dependency. Max 3 queries total.

### Pass E — Assumption Freshness

Challenge the original assumptions behind architectural decisions.

**If ADRs exist:** For each ADR, check whether the "Context" section is still true.
Flag ADRs where the stated constraint has changed (team size, scale, tech landscape,
business model).

**If no ADRs exist:** Infer likely original assumptions from the architecture itself.
Mark pass as degraded: "No ADRs — assumptions inferred from code structure, speculative."

| Assumption Type | Example |
|-----------------|---------|
| Scale assumption | "Designed for ~100 users" — is that still true? |
| Team assumption | "Designed for solo developer" — is the team now 10? |
| Tech assumption | "Designed when X library was the standard" — still is? |
| Business assumption | "Designed for single-tenant" — now multi-tenant? |

### Pass F — Blindspot & Loophole Detection

Passes A–E challenge *what is visible*. Pass F systematically surfaces *what is
not visible* — design holes, silent failure paths, implicit contracts, and
coupling that doesn't show up in the import graph. Every other pass relies on
reading the architecture; this one reads its shadow.

**Required. Never skipped.** Blindspots are where incidents start.

This pass gathers evidence directly. Do not satisfy with map or ADR contents —
verify against code, config, tests, and graph queries.

**Ten blindspot categories** (all are mandatory checks — report only categories
with findings, but trace each one before reporting):

| # | Category | What to look for | Countable signal |
|---|----------|------------------|------------------|
| 1 | **Trust boundaries** | Untrusted input crossing into trusted code without validation | Grep entry points; trace each to first typed/validated boundary. Gap = finding. |
| 2 | **Implicit contracts** | Callers must satisfy undocumented preconditions (order of calls, prior state, env vars) | Scan for `assert` / `if not initialized` / "must call X first" comments; check public API docs |
| 3 | **Non-obvious coupling** | Modules coupled via shared state, global config, DB rows, files, env, or temporal ordering — not imports | `god_nodes` on shared resources; grep for singletons/globals; check DB tables written by > 1 module |
| 4 | **Single points of failure** | Components whose failure cascades with no graceful degradation | Trace one critical flow; identify each dependency; check for retry/fallback/circuit breaker |
| 5 | **Concurrency hazards** | Race conditions, shared mutable state, missing locks, reentrancy | Grep for thread/async/worker patterns; check shared state writes; look for check-then-act sequences |
| 6 | **Silent failure paths** | Errors swallowed, defaulted, or logged-but-continued without user impact surfaced | Grep `catch.*pass`, `except: pass`, `\|\| null`, `.catch(() => {})`; trace error paths |
| 7 | **Observability gaps** | Failures that occur with no trace — no log, metric, or alert | For each critical flow: is success counted? Failure counted? Latency measured? Gap = finding. |
| 8 | **Deletion & cascade paths** | Removing a record / tenant / user leaves orphans, dangling refs, or invalid state | Grep `ON DELETE`; check every FK; trace what happens on resource removal |
| 9 | **Recovery paths** | What happens *after* a failure — is there a documented path back to healthy state? | Check for idempotency, replay, dead-letter queues, manual recovery scripts |
| 10 | **Scaling cliffs** | Load pattern where performance degrades non-linearly (N², exponential, lock contention) | Look for nested loops over unbounded inputs, unindexed queries, fanout without backpressure |

**Systematic traversal — not ad-hoc:**

For each category, follow this procedure:

1. **Scope** — name the category and the area of code to examine (module / flow / resource).
2. **Evidence gathering** — grep + read + (graph query if available). Record what was checked.
3. **Signal or clear** — either cite a countable signal (file:line + pattern), or state "no signal found" explicitly. No silent passes.
4. **Severity** — CRITICAL if exploitable or load-bearing; HIGH if likely incident trigger; MEDIUM if latent risk; LOW if theoretical.

**Blindspot output per finding:**

```
⚠ BLINDSPOT: {category} — {one-line summary}

  Where       {file:line or module}
  Evidence    {what was checked, what was found — cite signal}
  Risk        {what incident this enables}
  Hidden by   {why it escapes the other five passes — e.g., "not in import graph", "no ADR", "only triggered under concurrent load"}
  Severity    CRITICAL | HIGH | MEDIUM | LOW
```

**Loophole detection (paired with blindspots):**

A loophole is where a rule, invariant, or boundary *can* be violated even if it
currently isn't. Every declared invariant in the codebase has an implicit loophole
check: can an adversarial caller, a race, a retry, or a new feature bypass it?

| Invariant type | Loophole check |
|----------------|----------------|
| "Data is always validated before insert" | Find every insert path — is every one guarded? |
| "Tenant A never sees tenant B's data" | Every query, cache key, log line — is tenant_id enforced? |
| "This operation is idempotent" | Replay the same input twice — does state diverge? |
| "This can only be called by authenticated users" | Every entry point — is auth enforced before effect? |
| "Rate limit prevents abuse" | Is the limit per-IP? Per-user? Per-tenant? Can it be sidestepped? |
| "Transaction rollback is atomic" | Side effects outside the transaction (logs, events, external calls)? |

Report loopholes using the Blindspot format above, labeled `Category: Loophole`.

### Phase 2 Gate

> **STOP.** Present raw findings before synthesis.
>
> "Here are the raw findings from each pass. Before I synthesize and compute ROI,
> are there findings you want to override, dismiss as known trade-offs, or add
> context to?"

User may:
- Dismiss findings as deliberate trade-offs (mark "deliberate-prudent" in synthesis)
- Add context that changes severity
- Flag findings as blockers (force top of report)

---

## Phase 3: Synthesize

### Fowler Debt Quadrant Classification

Every finding is classified on two axes:

```
                    Deliberate           Inadvertent
                ┌─────────────────┬──────────────────┐
      Prudent   │ Known trade-off │ Honest learning  │
                │ (accept or plan)│ (fix when ready) │
                ├─────────────────┼──────────────────┤
    Reckless    │ Tech debt by    │ Carelessness     │
                │ choice (justify)│ (fix soon)       │
                └─────────────────┴──────────────────┘
```

See `references.md` for classification heuristics.

### ROI Scoring

For each finding:

| Axis | Values | Meaning |
|------|--------|---------|
| Effort | S / M / L | Rough refactoring cost (hours / days / weeks) |
| Value | H / M / L | Risk reduced + delivery unblocked |
| ROI rank | Derived | Sort: high-value + low-effort first |

> **AI-estimated effort is unreliable.** Label the Effort column explicitly as
> "rough estimate, validate with team before prioritizing."

### Fitness Scoring

Each pass scores 0–100. Deduction rubric in `references.md`.

- **Simplicity** — 100 − (N unjustified abstractions × weight)
- **Structural** — 100 − (N scenarios with poor/none support × weight)
- **Coupling** — 100 − (N coupling violations × weight)
- **Technology** — 100 − (N fitness concerns × weight)
- **Assumption Age** — 100 − (N stale assumptions × weight) or "degraded" if no ADRs
- **Blindspot Coverage** — 100 − (N blindspots/loopholes × weight). CRITICAL findings deduct more heavily.

**Overall** — weighted average (Simplicity 20 %, Structural 20 %, Coupling 20 %,
Technology 10 %, Assumption Age 15 %, Blindspots 15 %).

---

## Phase 4: Report

Write to `.grill/grill-{date}.md`:

```
GRILL REPORT ────────────────────────────────────────────────────

  Repo             {name}
  Date             {date}
  Source           .understand/architecture-map.md ({generated date})
  Architecture     {declared from Profile}
  Modules          {N evaluated}

  FITNESS SCORES
  ─────────────────────────────────────────────────
  Simplicity       {score}/100    {N unjustified abstractions}
  Structural       {score}/100    {N scenario concerns}
  Coupling         {score}/100    {N coupling issues}
  Technology       {score}/100    {N fitness concerns}
  Assumption Age   {score}/100    {N stale assumptions | degraded — no ADRs}
  Blindspots       {score}/100    {N blindspots + loopholes}
  ─────────────────────────────────────────────────
  Overall          {weighted}/100

  TOP FINDINGS
  ─────────────────────────────────────────────────
  1.  [{severity}] {finding} — {recommendation}
  2.  [{severity}] {finding} — {recommendation}
  3.  [{severity}] {finding} — {recommendation}

  REFACTORING ROI MATRIX
  ─────────────────────────────────────────────────
  | Rank | Finding | Debt Type | Effort* | Value | Handoff |
  |------|---------|-----------|---------|-------|---------|
  |  1   | {name}  | {quadrant}| S/M/L   | H/M/L | /eng arch / /simplify |
  |  2   | ...     | ...       | ...     | ...   | ...     |

  * Effort is a rough estimate — validate with the team before prioritizing.

  DECISIONS TO REVISIT
  ─────────────────────────────────────────────────
  1. {decision}
     Why: {reason it should be revisited}
     → /hashb:eng arch  {scope prompt}
  2. ...

  SIMPLIFICATIONS
  ─────────────────────────────────────────────────
  1. {module / layer}
     Signal: {countable signal — e.g., "interface with 1 impl"}
     → /hashb:simplify {target}

  STRENGTHS
  ─────────────────────────────────────────────────
  - {What the architecture gets right — evidence-based}
  - {Keep explicit: deficit-only reports lose credibility}

  Next: /hashb:{recommended-per-finding} (recommended — {finding phrase}){· signal-gated alternatives — only when flagged}

─────────────────────────────────────────────────────────────────
```

### Report Rules

- **Evidence is mandatory.** Every finding must cite a file:line, module, or pattern signal.
- **Strengths section is non-negotiable.** At least 2 strengths must be listed.
- **ROI matrix sorted by rank**, not alphabetical.
- **Handoff column is explicit.** Every actionable finding names `/hashb:eng arch` or `/hashb:simplify`.
- **Target 150–250 lines.** If longer, you are documenting implementation details
  — step back to system-level findings.

---

## Next: line resolution

Grill is opt-in and never auto-proceeds — the `Next:` line is advisory, not chain-driving. The `(recommended — reason)` marker swaps at emit time based on the highest-ROI finding actually surfaced.

| Condition detected | Recommended | Phrase |
|---|---|---|
| At least one decision to revisit (top of ROI matrix) | `/hashb:eng arch` | `design replacement for {top-ROI decision}` |
| No decisions to revisit, but simplifications identified | `/hashb:simplify` | `reduce complexity in {top simplification target}` |
| Only LOW-severity findings | `—` | `architecture healthy — no action needed` (emit no chain) |

Signal-gated alternatives (append on the same `Next:` line **only** when the trigger fired):

- `/hashb:simplify (if {N} simplifications also identified)` — append to `/hashb:eng arch` recommendation when both decisions and simplifications surfaced
- `/hashb:eng arch (if {N} decisions also worth revisiting)` — append to `/hashb:simplify` recommendation when only-simplifications path fired but a decision-level finding also exists at lower ROI
- `re-run /hashb:grill (after changes land)` — append when the user explicitly stated they want to track score trend over time

Examples (canonical form — pick one based on resolved findings):

```
Next: /hashb:eng arch (recommended — design replacement for distributed monolith pattern)  ·  /hashb:simplify (if 4 simplifications also identified)
Next: /hashb:simplify (recommended — reduce complexity in src/payments/)
Next: — architecture healthy — no action needed
```

**Interactive mode (default):** State the top handoff as a recommendation:
"Grill complete. Overall fitness {score}/100. Top recommendation: `/hashb:eng arch` for
{highest-ROI decision}."

**Autonomous mode:** Do NOT auto-proceed. Grill is opt-in by design — the user
initiates, the user decides what to act on.

---

## Rules

| Rule | Why |
|------|-----|
| Prefers `/understand` output, runs standalone if missing | Don't refuse when upstream artifact is absent or stale — gather evidence directly |
| Trust but verify the map | Map entries are hypotheses; verify with graph queries or file reads when a pass needs precision |
| Read-only | Only writes `.grill/grill-{date}.md` |
| Challenge, don't replace | Surface decisions; `/eng arch` designs the replacement |
| Evidence-based | Every finding cites a countable signal, file:line, or graph query — no vibes |
| Pass F is mandatory | Blindspot & Loophole detection is never skipped — the things not in the map are where incidents start |
| Use graphify MCP when available | Graph queries beat grep for structural questions (coupling, cycles, hotspots, blindspots) |
| Include Strengths | Deficit-only reports breed noise and lose credibility |
| ROI-ranked, not alphabetical | Top of report = highest-ROI refactoring opportunity |
| Single session, ≤ 2 gates | Not a multi-day workshop |
| Respect Project Profile | SaaS vs CLI vs library get different quality scenarios |
| Label effort estimates as rough | AI-estimated effort is unreliable — don't pretend otherwise |
| Never auto-invoke | Always user-initiated; never inserted into Feature/Bugfix/Release recipes |
| Idempotent | Re-running produces a new dated report; prior reports preserved |

---

## Common Rationalizations

| Rationalization | Reality |
|-----------------|---------|
| "We already know our architecture has issues — we don't need a report" | Implicit knowledge evaporates between sessions and disagrees across teammates. A scored report is falsifiable evidence that survives staff turnover. |
| "The `/understand` map already covers this" | `/understand` describes. Grill challenges. The map says "Module X has high coupling." Grill says "That coupling is unjustified because Y, and refactoring it has high ROI because Z." |
| "We'll just extend `/audit` instead" | `/audit` scores hashb rule compliance. Architecture fitness is a different question with a different methodology. Blurring them dilutes both. |
| "Effort estimates are too unreliable to include" | They are unreliable, which is why they are labeled as rough estimates. A rough estimate beats no estimate when ranking refactoring priority. |
| "The Senior Engineer Test is subjective" | Yes, which is why every Simplicity finding must cite a countable signal (1 impl, 1 plugin, etc.) rather than pure judgment. The test frames the question; the signal grounds the answer. |
| "We don't have ADRs, so Assumption Freshness is useless" | The pass degrades gracefully to "infer from code." The output is labeled as speculative, but still surfaces assumptions worth challenging. |
| "Grill should be part of every brownfield onboarding" | No. It's opt-in by design. Forcing it on every onboarding is exactly the workflow bloat this skill was scoped to avoid. |

Files in this skill

  • SKILL.md31.4 KB
  • references.md22.1 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.