Skip to main content

coding-principles

Use during implementation — loaded by build-loop before each task — whenever code is being written and should hold to universal quality standards, regardless of language or stack. Active while writing, not a post-hoc review checklist.

跳到安装

来源信息

仓库
xoai/sage
最近来源活动
2026年6月14日 05:17
检测到的 SKILL.md 语言
英语
星标
26
分支
7

安装方式

默认使用会先检查来源的 Prompt;你也可以切换为直接命令,或下载本地副本。

检查来源文件

决定是否安装前,请先阅读 SKILL.md,以及 SkillsMP 当前展示的配套文件。

文件资源管理器
2 个文件

正在显示 SKILL.md

SKILL.md
来源说明 · 只读预览
name
coding-principles
description
Use during implementation — loaded by build-loop before each task — whenever code is being written and should hold to universal quality standards, regardless of language or stack. Active while writing, not a post-hoc review checklist.
version
1.1.0
modes
["build","architect"]
skill_type
discipline
compliance_marker
Loading coding principles for implementation.
<!-- sage-metadata cost-tier: sonnet activation: auto tags: [execution, quality, principles, coding, implementation] inputs: [plan-task, codebase-context] outputs: [implementation] requires: [] --> # Coding Principles Seven universal principles for writing production-quality code. Apply these to every line, in every language. They are not a post-hoc checklist — they shape decisions AS you write. Stack skills (react, flutter, nextjs, etc.) add language-specific idioms on top. These principles are the foundation. ## Principle 1: Clarity Over Cleverness Write code a stranger can read without asking you what it does. **Do:** - Name things for what they DO: `fetchActiveUsers()`, `isExpired`, `MAX_RETRY_ATTEMPTS` - Functions do one thing. If you need "and" to describe it, split it. - Comments explain WHY, not WHAT. The code says what; the comment says why it's surprising or non-obvious. - Prefer explicit over implicit. `if (user.role === "admin")` not `if (checkAccess(user, 2))`. **Don't:** - Magic numbers: `if (retries > 3)` → `if (retries > MAX_RETRIES)` - Clever one-liners that save a line but cost a minute to read. - Names like `data`, `temp`, `flag2`, `processStuff`, `handleIt`. - Nested ternaries. Ever. ## Principle 2: Fail Loudly, Recover Gracefully Every external call can fail. Handle it explicitly. Never swallow errors. Give the caller something useful when things go wrong. **Do:** - Every `fetch`, `query`, `read`, `parse` has error handling. - Error messages include: what happened, what was expected, what to do about it. - Async operations have loading, success, AND error states. No async without all three. - Distinguish recoverable (retry, fallback) from fatal (log, alert, stop). **Don't:** - Empty catch blocks. Ever. If you truly ignore an error, comment WHY. - `console.log(err)` as the only error handling. - "Failed to load" with no context. WHO failed to load WHAT and WHY. - Retrying fatal errors. Crashing on recoverable ones. ## Principle 3: Guard the Boundaries Validate at every entry point. Don't trust input from users, APIs, files, or even your own internal modules. **Do:** - Public function parameters: validate type, range, presence. - API responses: check shape before accessing nested fields. `response?.data?.user?.id` not `response.data.user.id`. - User input: validate before processing. Reject early, clearly. - Configuration: fail at startup if config is invalid, not at 3am when the missing value is first accessed. - Database results: handle empty results, null fields, unexpected types. **Don't:** - Trust that an API response has the shape you expect. - Access nested properties without null checks. - Process user input without validation. - Assume config values exist without checking. ## Principle 4: Smallest Scope, Shortest Lifetime Variables close to where they're used. Functions close to what calls them. Reduce the blast radius of every change. **Do:** - Declare variables at first use, not at the top. - Prefer local over global. Prefer parameters over shared state. - Prefer pure functions (same input → same output) where practical. - Keep functions short. If you're scrolling, it's too long. Extract. - Modules have one reason to change. **Don't:** - Declare all variables at the top of the function. - Use global state when a parameter would work. - Write 200-line functions. Extract logical sections. - Put unrelated functionality in the same module because "it's convenient." ## Principle 5: Make the Right Thing Easy, the Wrong Thing Hard Design APIs and interfaces so correct usage is obvious and misuse requires effort. **Do:** - Required parameters come first. Optional parameters have defaults. - Return types that force the caller to handle success and failure. - Use the type system: enum not string, branded types for IDs, non-nullable when null is invalid. - Impossible states should be unrepresentable. **Don't:** - Return `null` to mean both "failed" and "empty." - Accept `any` or untyped dictionaries for structured data. - Design functions where the caller must remember to check a flag. - Allow invalid state combinations that crash at runtime. ## Principle 6: Consistency Beats Perfection Match the existing codebase. Consistency across the project matters more than your personal preference. **Do:** - Read existing code before writing new code. Match patterns. - Follow the project's error handling pattern. - Use the project's existing utilities before writing new ones. - If the project has no patterns, establish one and follow it. - Match naming: if the project uses `camelCase`, use `camelCase`. **Don't:** - Introduce a new style in your files because "it's better." - Write a utility function when one already exists in the project. - Mix patterns: callbacks in one file, promises in another, async/await in a third. ## Principle 7: Test What Matters, Not What's Easy Write tests that catch bugs, not tests that inflate coverage numbers. **Do:** - Test the contract: "given X input, expect Y output." - Test boundaries: min, max, zero, empty, one, many. - Test error paths: invalid input, timeout, permission denied. - One assertion per test when practical. - Test names describe the scenario: `test_expired_token_returns_401`. **Don't:** - Test implementation details: "function calls helper A then B." - Test only the happy path. - Name tests `test_1`, `test_auth_3`, `test_new`. - Write tests that pass regardless of the implementation being correct. - Mock everything — some integration is worth testing. ## How This Loads Build-loop loads this capability at Step 3, before each task: ``` Sage: Loading coding principles for implementation. Following: clarity, error handling, boundary guards, minimal scope, safe APIs, consistency, behavior testing. ``` These principles are active for every line written during the task. They are NOT a post-hoc checklist — they shape the code as it's written. The announcement `Loading coding principles for implementation.` is the compliance marker: it MUST appear before each task's implementation, making the standard active and observable rather than assumed. ## Rationalization table Derived from the RED baseline in `TESTS.md` — the excuses for skipping the load step and just coding. The marker must appear on every task, no size exception. | The excuse (observed) | Why it's wrong | The rule | |---|---|---| | "It's a tiny change, principles don't matter." | Small changes are exactly where magic numbers and swallowed errors slip in unnoticed. | Principles load before every task — there is no size exception. | | "I know clean code by heart." | The load isn't a reminder for you; it makes the standard active and observable for the task. | Announce and apply on every task, not only when you feel you need it. | | "I'll clean it up in review." | Principles shape code as it's written; review only catches what shaping would have prevented. | They are a mindset during implementation, not a post-hoc checklist. | | "The stack skill already covers quality." | Stack idioms sit on top of the universal foundation — they don't replace it. | Both apply; principles are the foundation. | ## Relationship to Other Capabilities - **Stack skills** (react, flutter, nextjs) add language-specific idioms. Principles provide the universal foundation. - **TDD capability** drives the test-first workflow. Principle 7 guides WHAT to test within that workflow. - **quality-review** (Gate 3) reviews AFTER implementation. Principles guide DURING implementation. Both are needed. - **auto-QA** verifies code against spec. Principles ensure the code is well-crafted regardless of spec compliance. ## Rules - Principles apply to ALL languages. No language-specific rules here. - Principles guide, they don't block. Pragmatic exceptions are fine when explicitly justified. - When principles conflict with project conventions, conventions win (Principle 6). - When principles conflict with each other, clarity wins (Principle 1).
在 GitHub 查看