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.
Analyzes code based on John Ousterhout's "A Philosophy of Software Design".
$ npx skills add atilladeniz/Kubeli --skill software-design-review -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install atilladeniz/Kubeli software-design-review --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ 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-srcUse ~/.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/
Install the "software-design-review" agent skill from https://github.com/atilladeniz/Kubeli/tree/main/.claude/skills/software-design-review into .claude/skills/software-design-review/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "software-design-review", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/atilladeniz/Kubeli/tree/main/.claude/skills/software-design-reviewType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add atilladeniz/Kubeli --skill software-design-review -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install atilladeniz/Kubeli software-design-review --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/atilladeniz/Kubeli.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/software-design-review .agents/skills/software-design-review && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "software-design-review" agent skill from https://github.com/atilladeniz/Kubeli/tree/main/.claude/skills/software-design-review into .agents/skills/software-design-review/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "software-design-review", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add atilladeniz/Kubeli --skill software-design-review -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install atilladeniz/Kubeli software-design-review --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/atilladeniz/Kubeli.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/software-design-review .cursor/skills/software-design-review && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "software-design-review" agent skill from https://github.com/atilladeniz/Kubeli/tree/main/.claude/skills/software-design-review into .cursor/skills/software-design-review/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "software-design-review", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/atilladeniz/Kubeli.git --path .claude/skills/software-design-review--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add atilladeniz/Kubeli --skill software-design-review -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install atilladeniz/Kubeli software-design-review --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/atilladeniz/Kubeli.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/software-design-review .gemini/skills/software-design-review && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "software-design-review" agent skill from https://github.com/atilladeniz/Kubeli/tree/main/.claude/skills/software-design-review into .gemini/skills/software-design-review/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "software-design-review", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install atilladeniz/Kubeli software-design-reviewInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add atilladeniz/Kubeli --skill software-design-review -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/atilladeniz/Kubeli.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/software-design-review .github/skills/software-design-review && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "software-design-review" agent skill from https://github.com/atilladeniz/Kubeli/tree/main/.claude/skills/software-design-review into .github/skills/software-design-review/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "software-design-review", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add atilladeniz/Kubeli --skill software-design-review -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install atilladeniz/Kubeli software-design-review --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/atilladeniz/Kubeli.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/software-design-review .opencode/skills/software-design-review && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "software-design-review" agent skill from https://github.com/atilladeniz/Kubeli/tree/main/.claude/skills/software-design-review into .opencode/skills/software-design-review/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "software-design-review", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
software-design-reviewAnalyzes 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". 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.
12 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 444659b. It shows what the files ask for, not the result of running them.
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.
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.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
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.
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.
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.
The full file from atilladeniz/Kubeli at commit 444659b, republished under its MIT licence (© atilladeniz). 1,429 words, ~5,346 tokens.
.claude/skills/software-design-review/SKILL.md (or your agent's skills folder).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.
This codebase uses:
When analyzing code ($ARGUMENTS), evaluate against ALL criteria below and watch for Red Flags.
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:
Kubeli Example:
// 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);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:
Kubeli Examples:
// 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;
}// 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>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:
backspace(), deleteSelection())Kubeli Examples:
// 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> { ... }
}// 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)// 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 needsKey Questions:
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:
Kubeli Example:
// 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
}
}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:
Kubeli Examples:
// 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// 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
}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:
Kubeli Example:
// 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 });
}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:
Kubeli Example:
// 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> { ... }// 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 */ }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:
Kubeli Examples:
// 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;
}// 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)
}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:
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:
Kubeli Examples:
// 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);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:
Kubeli Examples:
// 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 { ... }// 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} />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:
Kubeli Examples:
// 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);// 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 { ... }Principle: Names must be precise and create a mental image. Vague names force readers to look at code to understand meaning.
Red Flags:
data, info, manager, handler, utils, helpersPrinciple: 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:
Design Process:
Kubeli Example:
// 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...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:
The Right Approach:
Kubeli Example:
// 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)} />;
}Rate: Low / Medium / High Brief justification based on: dependencies, obscurity, change amplification, cognitive load, unknown unknowns.
For each red flag:
Concrete suggestions to:
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
Just SKILL.md in .claude/skills/software-design-review of atilladeniz/Kubeli.
Open the folder on GitHubat commit 444659b
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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Software Design Review this skillatilladeniz/Kubeli | 387 | — | ~5.3k | Automated safety check: Pass | MIT | |
| Brooks Debthyhmrright/brooks-lint | 1.5k | 1 repos | ~406 | Automated safety check: Pass | MIT | |
| Lego Rl ConfigLegoX/Lego-RL | 113 | — | ~2.1k | Automated safety check: Notes | Apache-2.0 | |
| Ways Of Workingdevantler-tech/ksail | 165 | — | ~2k | Automated safety check: Pass | Apache-2.0 | |
| Releasengrok/ngrok-operator | 272 | — | ~2.7k | Automated safety check: Pass | MIT | |
| Goinference-gateway/inference-gateway | 214 | — | ~2.4k | Automated safety check: Pass | Apache-2.0 |
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.
LegoX/Lego-RL
Compose, edit, refactor, and validate Lego-RL train/eval/infer .env configs and reusable scripts/templates modules.
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.
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…
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.
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…
Works with
Categories
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".
Software Design Review fits situations like: reviewing architecture; asking about code quality.
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.
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.
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.
SKILL.md names no scripts, command-line tools or credentials: Software Design Review is instructions for the agent only.
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.
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.
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.
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.
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.
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.