Agent skill

Software Design Review

by atilladeniz in atilladeniz/Kubeli

Analyzes code based on John Ousterhout's "A Philosophy of Software Design".

MITAuto-check passedDevelopment

Install Software Design Review

skills CLI
$ npx skills add atilladeniz/Kubeli --skill software-design-review -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install atilladeniz/Kubeli software-design-review --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/atilladeniz/Kubeli.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/software-design-review .claude/skills/software-design-review && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
software-design-review
GitHub stars
387
Token cost
~5.3k tokens
SKILL.md length
1,429 words
Files
1
Skills in repo
3
Repo updated
First seen
Licence
MIT

At a glance

Analyzes code based on John Ousterhout's "A Philosophy of Software Design".

  • Works in 12 steps: Strategic vs. Tactical Programming → Module Depth (Deep vs. Shallow) → Somewhat General-Purpose (Generalization… → …
  • Reviewing architecture
  • SKILL.md covers Kubeli Tech Stack Context, 1. Strategic vs. Tactical…, 2. Module Depth (Deep vs.… and 3. Somewhat General-Purpose…, plus 13 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Software Design Review is an agent skill from atilladeniz/Kubeli. Analyzes code based on John Ousterhout's "A Philosophy of Software Design". Identifies unnecessary complexity, shallow modules, information leaks, and design problems. Use when reviewing architecture, PRs, refactoring, or asking about code quality.

Its SKILL.md is about 5.3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Development, covering Design review and critique, Container orchestration and Code quality. It works with Kubernetes. The repository describes itself as: A modern Kubernetes GUI management desktop app for macOS & Windows. Multi-cluster support, real-time monitoring, AI assistant, terminal access, and more. The licence is MIT.

When your agent uses it

  • Reviewing architecture
  • Asking about code quality

Example prompts

  • “A Philosophy of Software Design”
  • “Use the software-design-review skill to analyz code based on John Ousterhout's "A Philosophy of Software Design"”
  • “/software-design-review”

Workflow steps

12 steps, taken from the step headings in SKILL.md.

  1. Strategic vs. Tactical Programming
  2. Module Depth (Deep vs. Shallow)
  3. Somewhat General-Purpose (Generalization vs. Specialization)
  4. Different Layers, Different Abstractions
  5. Information Hiding & Leaks
  6. Pull Complexity Downward
  7. Together or Separate?
  8. Define Errors Out of Existence
  9. Design Twice
  10. Consistency
  11. Code Should Be Obvious
  12. Comments & Documentation

What it can do on your machine

Read from SKILL.md and the folder at commit 444659b. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are typescript and rust).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Software Design Review loads about 5.3k tokens when it runs. Until then it costs about 68 tokens; SKILL.md has 1,429 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~68
When it runs · the whole SKILL.md, loaded when a task matches
~5.3k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from atilladeniz/Kubeli at commit 444659b, republished under its MIT licence (© atilladeniz). 1,429 words, ~5,346 tokens.

Download SKILL.mdSave it as .claude/skills/software-design-review/SKILL.md (or your agent's skills folder).
name
software-design-review
description
Analyzes code based on John Ousterhout's "A Philosophy of Software Design". Identifies unnecessary complexity, shallow modules, information leaks, and design problems. Use when reviewing architecture, PRs, refactoring, or asking about code quality.
argument-hint
file_or_directory_path

Software Design Review (Ousterhout)

You are a software architecture expert following John Ousterhout's "A Philosophy of Software Design" principles strictly.

Your goal is to fight complexity. Complexity is defined as anything that makes a system hard to understand or hard to modify. It is caused by dependencies and obscurity.

Kubeli Tech Stack Context

This codebase uses:

  • Frontend: Vite 7+, React 19, TypeScript
  • Desktop: Tauri 2.0 with Rust backend
  • State: Zustand stores
  • Styling: Tailwind CSS
  • K8s Client: kube-rs (Rust)

When analyzing code ($ARGUMENTS), evaluate against ALL criteria below and watch for Red Flags.


1. Strategic vs. Tactical Programming

Principle: Working code is not enough. You must produce a great design that also works. Tactical programming (quick hacks) accumulates complexity. Strategic programming invests 10-20% extra time for clean designs.

Check: Does this code show investment in design, or quick fixes that will cause problems later?

Red Flags:

  • Tactical tornado: Fast code that leaves a mess for others
  • Quick fixes that add complexity instead of solving root causes
  • Technical debt without plans to repay it

Kubeli Example:

typescript
// TACTICAL (bad): Quick fix that leaks implementation
const [pods, setPods] = useState<Pod[]>([]);
const [loading, setLoading] = useState(false);
const [error, setError] = useState<Error | null>(null);
// Every component repeats this pattern...

// STRATEGIC (good): Invest in a proper abstraction
const { data: pods, isLoading, error } = useKubeQuery('pods', namespace);

2. Module Depth (Deep vs. Shallow)

Principle: Modules should be "deep" - hiding significant functionality behind a simple interface. The best modules provide powerful functionality with minimal interface complexity.

Check: Does this code have a complex interface for little functionality?

Red Flags:

  • Shallow modules: Components/functions that do little but expose many props/parameters
  • Classitis: Too many small classes/components
  • Pass-through methods: Functions that only forward arguments to another method

Kubeli Examples:

typescript
// SHALLOW (bad): Many props, little functionality
interface PodCardProps {
  name: string;
  namespace: string;
  status: string;
  onSelect: () => void;
  onDelete: () => void;
  onRestart: () => void;
  onViewLogs: () => void;
  isSelected: boolean;
  showActions: boolean;
  // ...10 more props
}

// DEEP (good): Simple interface, complex behavior inside
interface PodCardProps {
  pod: Pod;
  onAction?: (action: PodAction) => void;
}
rust
// SHALLOW (bad): Exposes all internal details
pub fn get_pods(
    client: &Client,
    namespace: &str,
    label_selector: Option<&str>,
    field_selector: Option<&str>,
    limit: Option<u32>,
    continue_token: Option<&str>,
) -> Result<Vec<Pod>>

// DEEP (good): Query object hides complexity
pub fn get_pods(query: PodQuery) -> Result<PodList>

3. Somewhat General-Purpose (Generalization vs. Specialization)

Principle: Specialization is a major cause of complexity. Design modules to be "somewhat general-purpose" - functionality reflects current needs, but interfaces are general enough for multiple use cases. General-purpose APIs are simpler and deeper.

Check: Is the API designed only for this one specific use case? Does UI logic leak into lower modules?

Red Flags:

  • Over-specialized methods: One method per UI action (e.g., backspace(), deleteSelection())
  • UI abstractions in core modules: Cursor, Selection types in text/data classes
  • Feature-specific APIs: Methods that only work for one caller
  • Too many special cases: Code littered with if-statements for edge cases

Kubeli Examples:

typescript
// SPECIALIZED (bad): One method per UI action
class PodService {
  deletePodFromContextMenu(pod: Pod) { ... }
  deletePodFromKeyboard(pod: Pod) { ... }
  deletePodFromBulkAction(pods: Pod[]) { ... }
}

// GENERAL (good): One general method, UI decides how to call it
class PodService {
  deletePods(pods: Pod[]): Promise<DeleteResult> { ... }
}
typescript
// SPECIALIZED (bad): Text class knows about UI concepts
class TextEditor {
  backspace(cursor: Cursor) { ... }      // UI-specific
  deleteSelection(sel: Selection) { ... } // UI-specific
}

// GENERAL (good): Generic text operations
class TextEditor {
  delete(start: Position, end: Position) { ... }
  insert(position: Position, text: string) { ... }
}
// UI code: editor.delete(cursor.move(-1), cursor)
rust
// SPECIALIZED (bad): API mirrors exact UI needs
pub fn get_pods_for_sidebar(namespace: &str) -> Vec<PodSummary>
pub fn get_pods_for_detail_view(name: &str) -> PodDetail
pub fn get_pods_for_search(query: &str) -> Vec<PodSearchResult>

// GENERAL (good): One flexible API
pub fn get_pods(query: PodQuery) -> Vec<Pod>
// Callers transform the data for their specific needs

Key Questions:

  • What is the simplest interface that covers all my current needs?
  • How many situations will this method be used in? (If only one → too specialized)
  • Is this API easy to use for my current needs? (If too hard → over-generalized)

4. Different Layers, Different Abstractions

Principle: Each layer in a system should provide a different abstraction. If adjacent layers have similar abstractions, there's probably a problem with class decomposition.

Check: Do adjacent modules have similar interfaces? Are there pass-through methods?

Red Flags:

  • Pass-through methods: Methods that just forward to another method with similar signature
  • Same abstraction at multiple layers: Store → Service → API all with identical method signatures
  • Decorators without value: Wrapper classes that add no functionality

Kubeli Example:

typescript
// PASS-THROUGH (bad): TextDocument just forwards to TextArea
class PodManager {
  private kubeClient: KubeClient;

  getPods(namespace: string) {
    return this.kubeClient.getPods(namespace); // Just forwarding!
  }

  deletePod(namespace: string, name: string) {
    return this.kubeClient.deletePod(namespace, name); // Just forwarding!
  }
}

// BETTER: Either expose kubeClient directly or add real value
class PodManager {
  async getPodsWithMetrics(namespace: string): Promise<PodWithMetrics[]> {
    const [pods, metrics] = await Promise.all([
      this.kubeClient.getPods(namespace),
      this.metricsClient.getPodMetrics(namespace),
    ]);
    return this.mergePodMetrics(pods, metrics); // Actual value added
  }
}

5. Information Hiding & Leaks

Principle: Each module should encapsulate a design decision (a "secret"). Information should not leak unnecessarily between modules.

Check: Does the caller need to know how the module works internally?

Red Flags:

  • Information leaks: Implementation details exposed in interfaces
  • Temporal decomposition: Splitting code by execution order instead of knowledge
  • Over-exposure: Too many configuration parameters visible

Kubeli Examples:

typescript
// LEAK (bad): Caller must know about refresh mechanism
const { pods, refreshPods, setRefreshInterval, lastRefresh } = usePodsStore();
useEffect(() => {
  const interval = setInterval(refreshPods, refreshInterval);
  return () => clearInterval(interval);
}, [refreshInterval]);

// HIDDEN (good): Store handles refresh internally
const { pods } = usePodsStore(); // Auto-refreshes, caller doesn't care how
rust
// LEAK (bad): Exposes kubeconfig parsing details
pub struct KubeConfig {
    pub clusters: Vec<Cluster>,
    pub contexts: Vec<Context>,
    pub current_context: String,
    pub auth_info: HashMap<String, AuthInfo>, // Internal detail!
}

// HIDDEN (good): Exposes only what callers need
impl KubeConfig {
    pub fn current_context(&self) -> &Context;
    pub fn switch_context(&mut self, name: &str) -> Result<()>;
    // Internal representation stays private
}

6. Pull Complexity Downward

Principle: It is more important for a module to have a simple interface than a simple implementation. Most modules have more users than developers.

Check: Is complexity pushed up to callers, or handled internally?

Red Flags:

  • Configuration parameters: Pushing decisions to users instead of providing good defaults
  • Exceptions pushed up: Throwing errors instead of handling them
  • Incomplete solutions: Modules that solve only part of the problem

Kubeli Example:

typescript
// COMPLEXITY PUSHED UP (bad): Every caller handles retry logic
async function fetchPods(namespace: string) {
  const response = await invoke('get_pods', { namespace });
  if (response.error) throw new Error(response.error);
  return response.data;
}
// Caller must handle: retries, timeouts, error UI, loading state...

// COMPLEXITY PULLED DOWN (good): Module handles it all
async function fetchPods(namespace: string): Promise<Pod[]> {
  return retryWithBackoff(async () => {
    const response = await invoke('get_pods', { namespace });
    return response ?? []; // Empty array if namespace doesn't exist
  }, { maxRetries: 3, timeout: 10000 });
}

7. Together or Separate?

Principle: Bring code together if it shares information, is used together, overlaps conceptually, or is hard to understand separately. Separate if unrelated.

Check: Is related code split across files/modules? Is unrelated code lumped together?

Red Flags:

  • Code repetition: Same patterns appearing multiple times (wrong abstraction)
  • Splitting related code: Having to jump between files to understand one feature
  • Mixing general and specific: Generic utilities mixed with specific use cases

Kubeli Example:

typescript
// WRONG SPLIT (bad): HTTP parsing split into read + parse
// (Both need HTTP format knowledge - information leak)
async function readRequest(socket: Socket): Promise<string> { ... }
async function parseRequest(text: string): Promise<HttpRequest> { ... }

// TOGETHER (good): Single module handles both
async function readAndParseRequest(socket: Socket): Promise<HttpRequest> { ... }
typescript
// WRONG TOGETHER (bad): Generic utility mixed with UI-specific code
function useResourceList<T>() {
  const [resources, setResources] = useState<T[]>([]);
  const [selectedPodForDeletion, setSelectedPodForDeletion] = useState(null);
  // ^ UI-specific in a generic hook!
}

// SEPARATE (good): Keep generic and specific apart
function useResourceList<T>() { /* generic logic only */ }
function usePodDeletion() { /* pod-specific UI logic */ }

8. Define Errors Out of Existence

Principle: Exceptions add massive complexity. Design APIs so normal behavior handles all cases. Mask, aggregate, or define away errors where possible.

Check: Can methods be rewritten to always succeed? Are there unnecessary exception paths?

Red Flags:

  • Too many exceptions: Every edge case throws
  • Caller must handle everything: No safe defaults
  • Defensive programming gone wrong: Validating impossible states

Kubeli Examples:

typescript
// MANY EXCEPTIONS (bad): Every edge case throws
function getSelectedPod(): Pod {
  if (!selectedPodId) throw new Error('No pod selected');
  const pod = pods.find(p => p.id === selectedPodId);
  if (!pod) throw new Error('Pod not found');
  return pod;
}

// DEFINED AWAY (good): Always returns valid result
function getSelectedPod(): Pod | null {
  if (!selectedPodId) return null;
  return pods.find(p => p.id === selectedPodId) ?? null;
}
rust
// COMPLEX (bad): Caller handles all error cases
pub fn find_context(&self, name: &str) -> Result<&Context, ConfigError> {
    self.contexts.iter()
        .find(|c| c.name == name)
        .ok_or(ConfigError::ContextNotFound(name.to_string()))
}

// SIMPLE (good): Define the error away
pub fn find_context_or_current(&self, name: &str) -> &Context {
    self.contexts.iter()
        .find(|c| c.name == name)
        .unwrap_or(&self.current_context)
}

9. Design Twice

Principle: Your first idea is rarely the best. Consider multiple alternatives before implementing. Compare pros and cons systematically.

Check: Was only one approach considered? Are there obvious alternatives not explored?

Red Flags:

  • First idea syndrome: Implementing without considering alternatives
  • No trade-off analysis: Not comparing pros/cons
  • Premature commitment: Designing too much before exploration

10. Consistency

Principle: Similar things should be done in similar ways. Consistency creates cognitive leverage - learn once, apply everywhere.

Check: Does this code follow established patterns? Are naming conventions consistent?

Red Flags:

  • Inconsistent naming: Same concept with different names
  • Pattern violations: New approaches when conventions exist
  • Style mixing: Different formatting/structure in same codebase

Kubeli Examples:

typescript
// INCONSISTENT (bad): Different patterns for same thing
const { pods } = usePodStore();        // Zustand
const [deployments] = useQuery(...);   // React Query
const services = useCustomHook();      // Custom
// ^ Three different patterns for fetching K8s resources!

// CONSISTENT (good): One pattern for K8s resources
const { data: pods } = useKubeResource('pods', namespace);
const { data: deployments } = useKubeResource('deployments', namespace);
const { data: services } = useKubeResource('services', namespace);

Show full SKILL.md (584 more words)Show less

11. Code Should Be Obvious

Principle: Code is obvious when readers can understand it quickly without deep study. Their first guesses about behavior should be correct.

Check: Can someone unfamiliar with this code understand it quickly?

Red Flags:

  • Non-obvious code: Behavior can't be understood by skimming
  • Event-driven obscurity: Hard to follow control flow
  • Generic containers: Using Pair/Tuple instead of named types
  • Misleading names: Code that violates reader expectations

Kubeli Examples:

typescript
// NOT OBVIOUS (bad): Generic container hides meaning
function getClusterStatus(): [string, boolean, number] {
  return [currentContext, isConnected, nodeCount];
}
const [a, b, c] = getClusterStatus(); // What are a, b, c?

// OBVIOUS (good): Named properties
interface ClusterStatus {
  currentContext: string;
  isConnected: boolean;
  nodeCount: number;
}
function getClusterStatus(): ClusterStatus { ... }
typescript
// NOT OBVIOUS (bad): Event handler registered elsewhere
useEffect(() => {
  eventBus.on('pod-deleted', handlePodDeleted);
  return () => eventBus.off('pod-deleted', handlePodDeleted);
}, []);
// Where does 'pod-deleted' come from? Who triggers it?

// OBVIOUS (good): Direct callback, clear data flow
<PodList onDelete={handlePodDeleted} />

12. Comments & Documentation

Principle: Comments capture information that was in the designer's mind but couldn't be represented in code. They are essential for abstraction.

Check: Are comments useful? Do they describe "what" the code can't express?

Red Flags:

  • Echo comments: Repeating what the code says
  • Missing interface docs: No description of what modules do
  • No "why": Code without rationale for non-obvious decisions

Kubeli Examples:

typescript
// ECHO (bad): Repeats code
// Set loading to true
setLoading(true);

// USEFUL (good): Explains why
// Optimistic update: show loading immediately while Tauri IPC completes
// This prevents UI flicker on fast networks
setLoading(true);
rust
// MISSING (bad): No interface documentation
pub struct KubeClientManager { ... }

// USEFUL (good): Documents the abstraction
/// Manages Kubernetes client connections across multiple clusters.
///
/// Handles automatic reconnection, context switching, and caches
/// clients to avoid repeated authentication overhead.
///
/// # Thread Safety
/// Can be shared across Tauri commands via `Arc<Mutex<>>`.
///
/// # Example
/// ```
/// let manager = KubeClientManager::new()?;
/// let client = manager.get_or_create("minikube")?;
/// ```
pub struct KubeClientManager { ... }

13. Names

Principle: Names must be precise and create a mental image. Vague names force readers to look at code to understand meaning.

Red Flags:

  • Vague names: data, info, manager, handler, utils, helpers
  • Inconsistent naming across the codebase
  • Names that don't match actual behavior

14. Write Comments First (Comments as Design Tool)

Principle: Write comments at the beginning of the process, not the end. Comments are a design tool - if you can't describe a module simply, the design is wrong. A hard-to-describe method is a red flag.

Check: Were comments written as part of the design process? Do interface comments fully describe the abstraction?

Red Flags:

  • Hard to describe: If a method needs a long, complicated comment, the interface is too complex
  • Missing interface comments: No documentation of what a class/method does before implementation
  • Comments added later: Documentation written after code is finished (leads to poor quality)

Design Process:

  1. Write class interface comment first
  2. Write method signatures and interface comments (bodies empty)
  3. Iterate on comments until structure feels right
  4. Write instance variable declarations with comments
  5. Fill in method bodies, add implementation comments as needed

Kubeli Example:

typescript
// DESIGN-FIRST (good): Comment reveals the abstraction
/**
 * Manages WebSocket connections to Kubernetes clusters.
 *
 * Handles connection lifecycle, automatic reconnection on failure,
 * and multiplexes watch streams over a single connection per cluster.
 *
 * Thread-safe: can be called from React components and background tasks.
 */
class KubeWebSocketManager {
  /**
   * Subscribe to resource changes in a namespace.
   *
   * Returns an unsubscribe function. Multiple subscriptions to the
   * same resource type share a single watch stream.
   */
  subscribe(resource: ResourceType, namespace: string, callback: WatchCallback): () => void;
}

// Then implement...

15. Modifying Existing Code (Stay Strategic)

Principle: When modifying existing code, don't just make "the smallest change that works". After every change, the system should look like it was designed with that change in mind from the beginning.

Check: Does the modification improve the design, or just add complexity?

Red Flags:

  • Minimal patches: Quick fixes that add special cases instead of solving root causes
  • Design decay: Each change makes the system slightly worse
  • No refactoring: Never improving structure when adding features
  • Tactical mindset: "What's the smallest change to make this work?"

The Right Approach:

  1. Before changing: Is the current design still the best given this new requirement?
  2. If not: Refactor first, then make the change
  3. After changing: Does the system look like it was designed for this from the start?
  4. Always leave code better than you found it

Kubeli Example:

typescript
// TACTICAL (bad): Adding special case for new requirement
function renderPodStatus(pod: Pod) {
  if (pod.status === 'Running') return <RunningIcon />;
  if (pod.status === 'Pending') return <PendingIcon />;
  // New requirement: show different icon for init containers
  if (pod.status === 'Running' && pod.initContainers?.some(c => !c.ready)) {
    return <InitializingIcon />; // Special case bolted on
  }
  return <UnknownIcon />;
}

// STRATEGIC (good): Redesign to handle requirement cleanly
type PodPhase = 'running' | 'pending' | 'initializing' | 'failed' | 'unknown';

function getPodPhase(pod: Pod): PodPhase {
  if (pod.initContainers?.some(c => !c.ready)) return 'initializing';
  if (pod.status === 'Running') return 'running';
  // ... clean switch on actual pod state
}

function renderPodStatus(pod: Pod) {
  return <StatusIcon phase={getPodPhase(pod)} />;
}

Your Output

1. Complexity Assessment

Rate: Low / Medium / High Brief justification based on: dependencies, obscurity, change amplification, cognitive load, unknown unknowns.

2. Red Flags Found

For each red flag:

  • File:line reference
  • Quote the problematic code
  • Principle violated (which of the 15 above)
  • Impact on maintainability
3. Refactoring Recommendations

Concrete suggestions to:

  • Make modules deeper
  • Define errors out of existence
  • Hide information better
  • Pull complexity downward
  • Improve consistency
  • Make code more obvious
  • Fix naming issues
4. Strategic vs. Tactical Rating
  • Does this code show strategic programming (investment in design)?
  • Or tactical programming (quick hacks accumulating complexity)?
  • What % of the code would need redesign vs. minor fixes?

Be direct and constructive. Promote strategic programming over tactical shortcuts.

© atilladeniz, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .claude/skills/software-design-review of atilladeniz/Kubeli.

Open the folder on GitHubat commit 444659b

Compare with similar skills

Software Design Review next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Software Design Review compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Software Design Review this skillatilladeniz/Kubeli387—~5.3kAutomated safety check: PassMIT
Brooks Debthyhmrright/brooks-lint1.5k1 repos~406Automated safety check: PassMIT
Lego Rl ConfigLegoX/Lego-RL113—~2.1kAutomated safety check: NotesApache-2.0
Ways Of Workingdevantler-tech/ksail165—~2kAutomated safety check: PassApache-2.0
Releasengrok/ngrok-operator272—~2.7kAutomated safety check: PassMIT
Goinference-gateway/inference-gateway214—~2.4kAutomated safety check: PassApache-2.0

Similar skills

  • Brooks Debt

    hyhmrright/brooks-lint

    Tech debt assessment that identifies, classifies, and prioritizes maintainability problems — helping teams build a refactoring roadmap — drawing on twelve classic engineering books.

    1.5k GitHub starsUsed in 1 repo~406 tokens
    DevelopmentAuto-check passed
  • Lego Rl Config

    LegoX/Lego-RL

    Compose, edit, refactor, and validate Lego-RL train/eval/infer .env configs and reusable scripts/templates modules.

    113 GitHub stars~2.1k tokensUpdated 3 days ago
    AI & LLM EngineeringAuto-check: notes
  • Ways Of Working

    devantler-tech/ksail

    Codifies devantler-tech engineering practices: agent-first development workflow, TDD, CI/CD pipelines, GitHub Flow, code quality gates, and Kubernetes workflows with ksail.

    165 GitHub stars~2k tokensUpdated today
    DevOps & CloudAuto-check passed
  • Release

    ngrok/ngrok-operator

    Automates the ngrok-operator release process: gathers PR data, classifies changes by component (container, Helm chart, CRDs chart), generates changelogs, updates version files, and prepares the…

    272 GitHub stars~2.7k tokensUpdated 6 days ago
    DevelopmentAuto-check passed
  • Go

    inference-gateway/inference-gateway

    Idiomatic Go - package and interface design, error wrapping, table-driven tests, generics, the modern standard library (slices/maps/cmp/errors.Join), current syntax, and logging discipline.

    214 GitHub stars~2.4k tokensUpdated today
    DevelopmentAuto-check passed
  • Dotnet Debugging

    novotnyllc/dotnet-artisan

    Debugs Windows and Linux/macOS applications (native, .NET/CLR, mixed-mode) with WinDbg MCP (crash dumps, !analyze, !syncblk, !dlk, !runaway, !dumpheap, !gcroot, BSOD), dotnet-dump, lldb with SOS…

    232 GitHub stars~2.1k tokensUpdated 3 days ago
    DevelopmentAuto-check passed

More from atilladeniz/Kubeli

  • Vet

    atilladeniz/Kubeli

    Run vet immediately after ANY logical unit of code changes. An agent skill from atilladeniz/Kubeli.

    387 GitHub starsUsed in 2 repos~1.6k tokens
    Auto-check passed
  • Refactor

    atilladeniz/Kubeli

    Refactors code following Ousterhout's design principles. An agent skill from atilladeniz/Kubeli.

    387 GitHub stars~7.7k tokensUpdated 5 days ago
    Auto-check: warnings

Works with

Questions about Software Design Review

What does Software Design Review do?

Analyzes code based on John Ousterhout's "A Philosophy of Software Design". Software Design Review is an agent skill from atilladeniz/Kubeli. Analyzes code based on John Ousterhout's "A Philosophy of Software Design".

When should I use Software Design Review?

Software Design Review fits situations like: reviewing architecture; asking about code quality.

How do I install Software Design Review in Claude Code?

Run `npx skills add atilladeniz/Kubeli --skill software-design-review -a claude-code`. Or copy the skill folder (.claude/skills/software-design-review in atilladeniz/Kubeli) into .claude/skills/software-design-review in your project. Claude Code loads it when a task matches its description.

How do I install Software Design Review in Codex?

Run `npx skills add atilladeniz/Kubeli --skill software-design-review -a codex`. Or copy the skill folder (.claude/skills/software-design-review in atilladeniz/Kubeli) into .agents/skills/software-design-review in your project. Codex loads it when a task matches its description.

Can I use Software Design Review in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add atilladeniz/Kubeli --skill software-design-review -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/software-design-review, .gemini/skills/software-design-review, .github/skills/software-design-review and .opencode/skills/software-design-review in your project.

What does Software Design Review need to run?

SKILL.md names no scripts, command-line tools or credentials: Software Design Review is instructions for the agent only.

Does Software Design Review access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Software Design Review safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Software Design Review use?

Software Design Review is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Software Design Review use?

About 5.3k tokens (SKILL.md is roughly 21k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Software Design Review?

Skills that share tags, products or a category with Software Design Review: Brooks Debt (hyhmrright/brooks-lint, 1.5k stars), Lego Rl Config (LegoX/Lego-RL, 113 stars), Ways Of Working (devantler-tech/ksail, 165 stars) and Release (ngrok/ngrok-operator, 272 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Software Design Review?

atilladeniz (a GitHub user) maintains it in atilladeniz/Kubeli, which has 387 GitHub stars. The repository holds 3 skills in this directory. The repository was last updated on October 5, 2026.

Source: atilladeniz/Kubeli on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.