[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6BV6Z6NFYQZ83NRTKSW8Z5B":3,"skill-same:01M6BV6Z6NFYQZ83NRTKSW8Z5B":147},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":28,"publishedAt":54,"linkOnly":55,"markdownContent":56,"markdownBody":57,"frontMatter":58,"refName":59,"commitSha":60,"skillDirectory":61,"forksCount":14,"repositoryHtmlUrl":62,"repositoryHomepageUrl":6,"ownerHtmlUrl":63,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":64,"install":65,"resources":78},"01M6BV6Z6NFYQZ83NRTKSW8Z5B","miren-house-style",null,"Write Go that is indistinguishable from the Miren runtime team's house style, and review code\u002FPRs the way Miren maintainers phinze and evanphx do — the substantive code adjustments they request and how the house style turns into review findings (not just comment tone). Use when writing, editing, or reviewing Go in the mirendev\u002Fruntime codebase (or any Miren repo), when a change needs to \"look like Miren wrote it,\" when deciding what to flag or request in a Miren PR review, or when drafting review comments and replies to suggestions. Built from an evidence-backed survey of the codebase and ~1,600 real review comments.","bnferguson\u002Fdotfiles","bnferguson","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F47749?v=4","01M6BV4H2TJKK8P14W86V1ZCPP","Brandon Ferguson","01M6BV4H7GJWTZJ1BVHQ1TX11Y",0,"MIT","https:\u002F\u002Fgithub.com\u002Fbnferguson\u002Fdotfiles\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fmiren-house-style\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000018","写作与文案","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53],"style","miren house style","repo","drafting","when","prs","review findings","comments","runtime","tone","do","evidence","survey","use","writing","editing","just","how","team","code","pr","pr review","change","go","review","2026-11-10 10:12:30",false,"---\nname: miren-house-style\ndescription: Write Go that is indistinguishable from the Miren runtime team's house style, and review code\u002FPRs the way Miren maintainers phinze and evanphx do — the substantive code adjustments they request and how the house style turns into review findings (not just comment tone). Use when writing, editing, or reviewing Go in the mirendev\u002Fruntime codebase (or any Miren repo), when a change needs to \"look like Miren wrote it,\" when deciding what to flag or request in a Miren PR review, or when drafting review comments and replies to suggestions. Built from an evidence-backed survey of the codebase and ~1,600 real review comments.\n---\n\n# Miren House Style\n\n## Overview\n\nThis skill captures how the Miren team actually writes and reviews Go — derived from reading the `mirendev\u002Fruntime` codebase and 1,119 inline review comments, 302 PR review summaries, and 234 conversation comments by **phinze** (Paul Hinze) and **evanphx** (Evan Phoenix). It has two modes: **writing** Go that passes as Miren-authored, and **reviewing** the way they do.\n\nTwo deep references back this skill — load the relevant one before doing substantial work:\n- `references\u002Fwriting-go.md` — the full Go house-style profile, 8 dimensions, with `file:line` evidence and called-out inconsistencies.\n- `references\u002Freviewing.md` — phinze & evanphx review values, blocking calculus, suggestion-reply taxonomy, and per-reviewer voice, every claim quoted with a PR number.\n\n## The meta-rule\n\nEverything reduces to one principle the team states for itself: **comment the non-obvious, keep wiring terse, and let verbosity scale with subtlety.** Density tracks complexity, not a fixed ratio. When unsure, match the surrounding file.\n\n---\n\n## Mode 1: Writing Go like Miren\n\n### The LLM \"tells\" to eliminate\n\nThese are the giveaways that make Go read as AI-generated rather than Miren-authored. Hunt them down:\n\n1. **Free-floating file-overview prose blocks.** A narrative paragraph after the imports explaining \"what this file does\" is the #1 tell — **zero of the 147 `cli\u002Fcommands` files have one.** File-level docs, when they exist at all (~3% of files), are a standard godoc `\u002F\u002F Package ...` block directly above the `package` clause. Relocate the genuine \"why\" into the nearest function\u002Ftype doc comment; never leave an essay header.\n2. **Essayistic comment register.** Miren's why-comments are clipped constraint notes, not teaching paragraphs. Cut multi-clause parentheticals and \"which keeps it unit-testable\"-style asides down to the load-bearing clause. Compare: house style writes `\u002F\u002F the default route has no host`, not a three-line explanation of routing.\n3. **Reflexive doc comments on trivial wiring.** Command handlers (`func AppList(...)`) are *normally left undocumented* — they are framework wiring dispatched by reflection. Don't add `\u002F\u002F AppList lists apps` that just restates the name. (Documenting a non-obvious helper, by contrast, is correct and common.) **Exception — match the sibling family:** if a command's siblings are already documented (e.g. the `logs.go` `LogsApp`\u002F`LogsSandbox`\u002F`LogsBuild`\u002F`LogsSystem` family all carry one-line name-restating docs), keep the new one documented too. Consistency within the file beats the bare-handler default, and stripping the doc from one of three identical siblings reads *more* like an LLM touched it, not less.\n4. **`_ struct{}` for a no-flag command.** House style is a named `opts struct{}` (e.g. `func Server(ctx *Context, opts struct{}) error`).\n5. **Over-uniform comment density.** Real Miren ranges from `route_list.go` (118 lines, 0 comments) to orchestration files at ~17%. A flat, evenly-narrated file looks generated; vary density by how subtle the code is.\n\n### What is already house style — do NOT \"fix\" these\n\nStripping these makes code *less* like Miren. The team explicitly praises why-comments (\"Real love for the comments throughout... 'Explain the constraint, not the code' ages well\").\n- Why-comments on non-obvious unexported helpers and on subtle struct fields \u002F const entries (including trailing line comments).\n- Best-effort error handling that returns `nil`\u002Fempty on failure where a degraded path is correct (e.g. completion, background work) — with a one-line note saying so.\n- A size-1 buffered result\u002Ferror channel plus a comment explaining why a goroutine isn't a leak.\n- Two-group imports (stdlib, then one merged block), unaliased `*_v1alpha` packages, table-driven `tests` slices with testify `require`\u002F`assert`.\n\n### Quick checklist (the universal conventions)\n\n- **Commands:** `func PascalCasePath(ctx *Context, opts struct{ ... }) error` with an **inline anonymous** opts struct; name = command path words concatenated (`env set` → `EnvSet`); register in `commands.go RegisterAll` via `d.Dispatch(path, Infer(...))`. Compose options by embedding `FormatOptions`\u002F`ConfigCentric`\u002F`AppCentric`. Flags via mflags struct tags.\n- **Errors:** wrap with `fmt.Errorf(\"verb noun: %w\", err)`; in CLI handlers return bare `err` and let `printError` format it. Guard-clause early returns. Domain errors that cross RPC use `pkg\u002Fcond`. Never `github.com\u002Fpkg\u002Ferrors.Wrap` in new code. slog error key is `\"error\"`.\n- **Naming:** single-letter receivers, same name across a type's methods; terse conventional abbreviations (`ctx`, `cfg`, `opts`, `eac`, `ic`); `NewX`\u002F`newX` constructors; no `Get-` on pure accessors. All-caps acronyms in hand-written code (`URL`, `JSON`, `WAF`) — **but** generated entity code uses title-case-per-segment (`Id`, `Http`, `WafProfile`) and the accessor is `Id()`, never `ID()`. `ID` vs `Id` is genuinely mixed; match the file.\n- **Tests:** table-driven `tests` slice (`name`\u002F`want`\u002F`wantXxx`), `t.Run(tt.name, ...)`, no loop-var rebind (Go 1.25). Prefer testify (`require` to halt, `assert` to keep going) but plain `t.Errorf`\u002F`t.Fatalf` is equally house style for pure-function tables. Hand-write fakes; no gomock; no golden files. `t.TempDir`\u002F`t.Setenv`\u002F`t.Cleanup`.\n- **Concurrency:** entrypoints own an `errgroup.WithContext`; components own their goroutines (`ctx` child + `WaitGroup`, prefer `wg.Go`). Every long-lived loop selects on `ctx.Done()`. Pair `context.WithTimeout`\u002F`WithCancel` with immediate `defer cancel()`.\n- **Imports\u002Flayout:** stdlib group first; default two groups (three in `controllers\u002F`). Exported entry point first, unexported helpers below; one command per `\u003Cnoun>_\u003Cverb>.go`.\n\nThe reference file has the evidence, prevalence, and the documented inconsistencies (acronym casing, two-vs-three import groups, testify-vs-plain, `interface{}` vs `any`, timeout literals vs consts). Read `references\u002Fwriting-go.md` before non-trivial work.\n\n---\n\n## Mode 2: Reviewing like Miren\n\nThis is about the **substance of the review** — what to change and why — not the comment tone. A Miren review is a trace that produces concrete adjustments. Mode 1 (writing-go) IS the review rubric: a deviation from a universal convention is a finding; a sanctioned inconsistency is not. Read `references\u002Freviewing.md` for the evidenced detail.\n\n### The substantive adjustments to look for (most → least common)\n1. **Reuse over reinvention** — the single most common note. A new helper\u002Ftype that duplicates an existing one gets sent back to it (and often promoted to `pkg\u002Fui`\u002F`pkg\u002F*`). Grep for an existing helper before accepting a new one; flag re-implemented stdlib (`url.JoinPath`, `net.JoinHostPort`).\n2. **Delete, don't comment out; cut the unneeded.** Dead code, commented-out blocks, unused helpers\u002Fparams, and speculative machinery get a delete request (\"nuke the TTL stuff for now\").\n3. **Scope error handling; fail closed.** A blanket `if err != nil { return nil }` that meant *not-found* should be `errors.Is(err, cond.ErrNotFound{})`. Auth\u002Fsecurity paths must fail closed.\n4. **Concurrency:** every server call time-bounded; every goroutine has a `ctx.Done()` arm and can't leak (size-1 buffered result channel); read-modify-write on shared\u002Fetcd state is transactional or justified; no nil-deref on a hot path.\n5. **State machines \u002F event handling:** transitions match their guards; handlers branch on operation\u002Ftype, not on a proxy like \"entity is nil.\"\n6. **Lifecycle:** anything with a TTL\u002Fexpiry has a traced renewal path and sane post-expiry behavior.\n7. **Security:** no host-FS leakage into containers; no injection\u002Fredirect on user-controlled strings; auth headers stripped\u002Fset at the boundary.\n8. **Scope discipline:** split a PR that's \"actually 3 things\"; defer gold-plating orthogonal to the goal.\n9. **Data-model \u002F abstraction pressure:** when `if x == \"\"` guards pile up or a bool is copied onto a sub-entity, propose the entity\u002Finterface reshape, not the local patch.\n10. **Backward compat:** removed flags\u002Ffields degrade to no-ops so upgrades don't break.\n11. **Tooling:** new checks go into the existing `golangci-lint` pipeline, not a bolted-on step.\n\n### Enforce the house style — writing-go → findings\n**Flag (universal):** free-floating file-overview comment block; command handler not `func Name(ctx *Context, opts struct{…}) error` with inline named opts; re-declared flags instead of `FormatOptions`\u002F`ConfigCentric` embeds; list command not branching on `opts.IsJSON()` or serializing an internal type instead of a command-local JSON struct; missing `ctx.RPCClient`+`defer Close`; `pkg\u002Ferrors.Wrap` in new code (→ `fmt.Errorf … %w`); printing an error instead of returning it; slog key `\"err\"` (→ `\"error\"`); a function-dispatch map in `cli\u002Fcommands`; `tt := tt` loop rebind; `assert` where `require` is needed; gomock\u002Fgolden files; `context.WithTimeout` without `defer cancel`; lowercase acronyms in hand-written identifiers.\n\n**Do NOT flag (sanctioned inconsistencies — nitpicking these is itself off-house-style):** `ID` vs `Id` (and never generated casing like `WafProfile`\u002F`Id()`); documented-vs-bare command handler (only for sibling consistency); two- vs three-group imports; `interface{}` vs `any`; inline timeout literal vs named const; testify vs plain `t.Errorf`. When unsure, check the prevalence label in `writing-go.md` — universal → flag, mixed → leave it.\n\n### Method & verdict\n- **Trace every claim end-to-end before approving** (\"unless I'm misreading…\" if you can't); **run it** in dev when feasible and report what you saw; **diff the PR description against the implementation** (flag undisclosed feature-flag flips); **praise the specific mechanism** that's load-bearing.\n- **Label every note blocking or not.** Reserve the block for correctness\u002Fsafety\u002Fmerge-safety; `CHANGES_REQUESTED` is a scoped hold-for-discussion (green-light the rest); **defer by filing a `MIR-xxxx` ticket**, not hand-waving. evanphx decides borderline merges on blast radius and says so.\n- **Replying to suggestions (accept\u002Fdefer\u002Freject):** grade on merits; **a rejection always carries a one-line technical reason** citing the file\u002Ffeature that makes it wrong; tag false positives.\n- **Tone** (secondary): phinze leads with \"Short version:\" then bulleted findings with `file.go:line`; evanphx is terse and declarative; disclose AI assistance up front.\n\n---\n\n## When applying this skill\n\n- **Writing\u002Fediting in a Miren repo:** match the surrounding file first; run the Mode 1 \"tells\" pass over anything new before considering it done; keep `make lint` green.\n- **Reviewing a Miren PR:** trace the change end-to-end first, then work the Mode 2 substantive checklist (reuse\u002Fdead-code\u002Ferror-scope\u002Fconcurrency\u002Flifecycle\u002Fsecurity\u002Fscope\u002Fdata-model) and the writing-go → findings rubric — flag universal-convention deviations, skip the sanctioned inconsistencies. Label each note's blocking-ness, file deferrals as tickets, and never reject a suggestion without a one-line reason. Pick the voice last (phinze for feature\u002Fdesign, evanphx-terse for quick correctness calls).\n- **Per the user's global instruction:** when posting on GitHub on the user's behalf, still prefix AI-authored text to identify the assistant — which dovetails with Miren's own disclosure norm.\n","# Miren House Style\n\n## Overview\n\nThis skill captures how the Miren team actually writes and reviews Go — derived from reading the `mirendev\u002Fruntime` codebase and 1,119 inline review comments, 302 PR review summaries, and 234 conversation comments by **phinze** (Paul Hinze) and **evanphx** (Evan Phoenix). It has two modes: **writing** Go that passes as Miren-authored, and **reviewing** the way they do.\n\nTwo deep references back this skill — load the relevant one before doing substantial work:\n- `references\u002Fwriting-go.md` — the full Go house-style profile, 8 dimensions, with `file:line` evidence and called-out inconsistencies.\n- `references\u002Freviewing.md` — phinze & evanphx review values, blocking calculus, suggestion-reply taxonomy, and per-reviewer voice, every claim quoted with a PR number.\n\n## The meta-rule\n\nEverything reduces to one principle the team states for itself: **comment the non-obvious, keep wiring terse, and let verbosity scale with subtlety.** Density tracks complexity, not a fixed ratio. When unsure, match the surrounding file.\n\n---\n\n## Mode 1: Writing Go like Miren\n\n### The LLM \"tells\" to eliminate\n\nThese are the giveaways that make Go read as AI-generated rather than Miren-authored. Hunt them down:\n\n1. **Free-floating file-overview prose blocks.** A narrative paragraph after the imports explaining \"what this file does\" is the #1 tell — **zero of the 147 `cli\u002Fcommands` files have one.** File-level docs, when they exist at all (~3% of files), are a standard godoc `\u002F\u002F Package ...` block directly above the `package` clause. Relocate the genuine \"why\" into the nearest function\u002Ftype doc comment; never leave an essay header.\n2. **Essayistic comment register.** Miren's why-comments are clipped constraint notes, not teaching paragraphs. Cut multi-clause parentheticals and \"which keeps it unit-testable\"-style asides down to the load-bearing clause. Compare: house style writes `\u002F\u002F the default route has no host`, not a three-line explanation of routing.\n3. **Reflexive doc comments on trivial wiring.** Command handlers (`func AppList(...)`) are *normally left undocumented* — they are framework wiring dispatched by reflection. Don't add `\u002F\u002F AppList lists apps` that just restates the name. (Documenting a non-obvious helper, by contrast, is correct and common.) **Exception — match the sibling family:** if a command's siblings are already documented (e.g. the `logs.go` `LogsApp`\u002F`LogsSandbox`\u002F`LogsBuild`\u002F`LogsSystem` family all carry one-line name-restating docs), keep the new one documented too. Consistency within the file beats the bare-handler default, and stripping the doc from one of three identical siblings reads *more* like an LLM touched it, not less.\n4. **`_ struct{}` for a no-flag command.** House style is a named `opts struct{}` (e.g. `func Server(ctx *Context, opts struct{}) error`).\n5. **Over-uniform comment density.** Real Miren ranges from `route_list.go` (118 lines, 0 comments) to orchestration files at ~17%. A flat, evenly-narrated file looks generated; vary density by how subtle the code is.\n\n### What is already house style — do NOT \"fix\" these\n\nStripping these makes code *less* like Miren. The team explicitly praises why-comments (\"Real love for the comments throughout... 'Explain the constraint, not the code' ages well\").\n- Why-comments on non-obvious unexported helpers and on subtle struct fields \u002F const entries (including trailing line comments).\n- Best-effort error handling that returns `nil`\u002Fempty on failure where a degraded path is correct (e.g. completion, background work) — with a one-line note saying so.\n- A size-1 buffered result\u002Ferror channel plus a comment explaining why a goroutine isn't a leak.\n- Two-group imports (stdlib, then one merged block), unaliased `*_v1alpha` packages, table-driven `tests` slices with testify `require`\u002F`assert`.\n\n### Quick checklist (the universal conventions)\n\n- **Commands:** `func PascalCasePath(ctx *Context, opts struct{ ... }) error` with an **inline anonymous** opts struct; name = command path words concatenated (`env set` → `EnvSet`); register in `commands.go RegisterAll` via `d.Dispatch(path, Infer(...))`. Compose options by embedding `FormatOptions`\u002F`ConfigCentric`\u002F`AppCentric`. Flags via mflags struct tags.\n- **Errors:** wrap with `fmt.Errorf(\"verb noun: %w\", err)`; in CLI handlers return bare `err` and let `printError` format it. Guard-clause early returns. Domain errors that cross RPC use `pkg\u002Fcond`. Never `github.com\u002Fpkg\u002Ferrors.Wrap` in new code. slog error key is `\"error\"`.\n- **Naming:** single-letter receivers, same name across a type's methods; terse conventional abbreviations (`ctx`, `cfg`, `opts`, `eac`, `ic`); `NewX`\u002F`newX` constructors; no `Get-` on pure accessors. All-caps acronyms in hand-written code (`URL`, `JSON`, `WAF`) — **but** generated entity code uses title-case-per-segment (`Id`, `Http`, `WafProfile`) and the accessor is `Id()`, never `ID()`. `ID` vs `Id` is genuinely mixed; match the file.\n- **Tests:** table-driven `tests` slice (`name`\u002F`want`\u002F`wantXxx`), `t.Run(tt.name, ...)`, no loop-var rebind (Go 1.25). Prefer testify (`require` to halt, `assert` to keep going) but plain `t.Errorf`\u002F`t.Fatalf` is equally house style for pure-function tables. Hand-write fakes; no gomock; no golden files. `t.TempDir`\u002F`t.Setenv`\u002F`t.Cleanup`.\n- **Concurrency:** entrypoints own an `errgroup.WithContext`; components own their goroutines (`ctx` child + `WaitGroup`, prefer `wg.Go`). Every long-lived loop selects on `ctx.Done()`. Pair `context.WithTimeout`\u002F`WithCancel` with immediate `defer cancel()`.\n- **Imports\u002Flayout:** stdlib group first; default two groups (three in `controllers\u002F`). Exported entry point first, unexported helpers below; one command per `\u003Cnoun>_\u003Cverb>.go`.\n\nThe reference file has the evidence, prevalence, and the documented inconsistencies (acronym casing, two-vs-three import groups, testify-vs-plain, `interface{}` vs `any`, timeout literals vs consts). Read `references\u002Fwriting-go.md` before non-trivial work.\n\n---\n\n## Mode 2: Reviewing like Miren\n\nThis is about the **substance of the review** — what to change and why — not the comment tone. A Miren review is a trace that produces concrete adjustments. Mode 1 (writing-go) IS the review rubric: a deviation from a universal convention is a finding; a sanctioned inconsistency is not. Read `references\u002Freviewing.md` for the evidenced detail.\n\n### The substantive adjustments to look for (most → least common)\n1. **Reuse over reinvention** — the single most common note. A new helper\u002Ftype that duplicates an existing one gets sent back to it (and often promoted to `pkg\u002Fui`\u002F`pkg\u002F*`). Grep for an existing helper before accepting a new one; flag re-implemented stdlib (`url.JoinPath`, `net.JoinHostPort`).\n2. **Delete, don't comment out; cut the unneeded.** Dead code, commented-out blocks, unused helpers\u002Fparams, and speculative machinery get a delete request (\"nuke the TTL stuff for now\").\n3. **Scope error handling; fail closed.** A blanket `if err != nil { return nil }` that meant *not-found* should be `errors.Is(err, cond.ErrNotFound{})`. Auth\u002Fsecurity paths must fail closed.\n4. **Concurrency:** every server call time-bounded; every goroutine has a `ctx.Done()` arm and can't leak (size-1 buffered result channel); read-modify-write on shared\u002Fetcd state is transactional or justified; no nil-deref on a hot path.\n5. **State machines \u002F event handling:** transitions match their guards; handlers branch on operation\u002Ftype, not on a proxy like \"entity is nil.\"\n6. **Lifecycle:** anything with a TTL\u002Fexpiry has a traced renewal path and sane post-expiry behavior.\n7. **Security:** no host-FS leakage into containers; no injection\u002Fredirect on user-controlled strings; auth headers stripped\u002Fset at the boundary.\n8. **Scope discipline:** split a PR that's \"actually 3 things\"; defer gold-plating orthogonal to the goal.\n9. **Data-model \u002F abstraction pressure:** when `if x == \"\"` guards pile up or a bool is copied onto a sub-entity, propose the entity\u002Finterface reshape, not the local patch.\n10. **Backward compat:** removed flags\u002Ffields degrade to no-ops so upgrades don't break.\n11. **Tooling:** new checks go into the existing `golangci-lint` pipeline, not a bolted-on step.\n\n### Enforce the house style — writing-go → findings\n**Flag (universal):** free-floating file-overview comment block; command handler not `func Name(ctx *Context, opts struct{…}) error` with inline named opts; re-declared flags instead of `FormatOptions`\u002F`ConfigCentric` embeds; list command not branching on `opts.IsJSON()` or serializing an internal type instead of a command-local JSON struct; missing `ctx.RPCClient`+`defer Close`; `pkg\u002Ferrors.Wrap` in new code (→ `fmt.Errorf … %w`); printing an error instead of returning it; slog key `\"err\"` (→ `\"error\"`); a function-dispatch map in `cli\u002Fcommands`; `tt := tt` loop rebind; `assert` where `require` is needed; gomock\u002Fgolden files; `context.WithTimeout` without `defer cancel`; lowercase acronyms in hand-written identifiers.\n\n**Do NOT flag (sanctioned inconsistencies — nitpicking these is itself off-house-style):** `ID` vs `Id` (and never generated casing like `WafProfile`\u002F`Id()`); documented-vs-bare command handler (only for sibling consistency); two- vs three-group imports; `interface{}` vs `any`; inline timeout literal vs named const; testify vs plain `t.Errorf`. When unsure, check the prevalence label in `writing-go.md` — universal → flag, mixed → leave it.\n\n### Method & verdict\n- **Trace every claim end-to-end before approving** (\"unless I'm misreading…\" if you can't); **run it** in dev when feasible and report what you saw; **diff the PR description against the implementation** (flag undisclosed feature-flag flips); **praise the specific mechanism** that's load-bearing.\n- **Label every note blocking or not.** Reserve the block for correctness\u002Fsafety\u002Fmerge-safety; `CHANGES_REQUESTED` is a scoped hold-for-discussion (green-light the rest); **defer by filing a `MIR-xxxx` ticket**, not hand-waving. evanphx decides borderline merges on blast radius and says so.\n- **Replying to suggestions (accept\u002Fdefer\u002Freject):** grade on merits; **a rejection always carries a one-line technical reason** citing the file\u002Ffeature that makes it wrong; tag false positives.\n- **Tone** (secondary): phinze leads with \"Short version:\" then bulleted findings with `file.go:line`; evanphx is terse and declarative; disclose AI assistance up front.\n\n---\n\n## When applying this skill\n\n- **Writing\u002Fediting in a Miren repo:** match the surrounding file first; run the Mode 1 \"tells\" pass over anything new before considering it done; keep `make lint` green.\n- **Reviewing a Miren PR:** trace the change end-to-end first, then work the Mode 2 substantive checklist (reuse\u002Fdead-code\u002Ferror-scope\u002Fconcurrency\u002Flifecycle\u002Fsecurity\u002Fscope\u002Fdata-model) and the writing-go → findings rubric — flag universal-convention deviations, skip the sanctioned inconsistencies. Label each note's blocking-ness, file deferrals as tickets, and never reject a suggestion without a one-line reason. Pick the voice last (phinze for feature\u002Fdesign, evanphx-terse for quick correctness calls).\n- **Per the user's global instruction:** when posting on GitHub on the user's behalf, still prefix AI-authored text to identify the assistant — which dovetails with Miren's own disclosure norm.\n",{"name":5,"description":7},"main","e63965e4644984470d4cc8b3014a8b001f0c2666",".agents\u002Fskills\u002Fmiren-house-style","https:\u002F\u002Fgithub.com\u002Fbnferguson\u002Fdotfiles","https:\u002F\u002Fgithub.com\u002Fbnferguson","2026-11-11 03:04:59",{"source":8,"skillName":5,"commands":66,"prompt":76,"zipAvailable":77},[67,70,73],{"tool":68,"command":69},"npx","npx skills add bnferguson\u002Fdotfiles --skill miren-house-style",{"tool":71,"command":72},"bunx","bunx skills add bnferguson\u002Fdotfiles --skill miren-house-style",{"tool":74,"command":75},"pnpm","pnpm dlx skills add bnferguson\u002Fdotfiles --skill miren-house-style","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fbnferguson\u002Fdotfiles\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fmiren-house-style\u002FSKILL.md",true,[79,85,89,93,97,101,105,109,113,117,123,127,131,135,139,143],{"path":80,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":83,"sourceHtmlUrl":84},"agents\u002Fopenai.yaml","REFERENCE","参考文档",299,"https:\u002F\u002Fgithub.com\u002FopenBitFun\u002FOpenBitFun\u002Fblob\u002Fmain\u002Fsrc\u002Fcrates\u002Fassembly\u002Fcore\u002Fbuiltin_skills\u002Fcreate-openbitfun-skin\u002Fagents\u002Fopenai.yaml",{"path":86,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":87,"sourceHtmlUrl":88},"references\u002Fappearance-registry.json",367296,"https:\u002F\u002Fgithub.com\u002FopenBitFun\u002FOpenBitFun\u002Fblob\u002Fmain\u002Fsrc\u002Fcrates\u002Fassembly\u002Fcore\u002Fbuiltin_skills\u002Fcreate-openbitfun-skin\u002Freferences\u002Fappearance-registry.json",{"path":90,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":91,"sourceHtmlUrl":92},"references\u002Fauthoring-workflow.md",3834,"https:\u002F\u002Fgithub.com\u002FopenBitFun\u002FOpenBitFun\u002Fblob\u002Fmain\u002Fsrc\u002Fcrates\u002Fassembly\u002Fcore\u002Fbuiltin_skills\u002Fcreate-openbitfun-skin\u002Freferences\u002Fauthoring-workflow.md",{"path":94,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":95,"sourceHtmlUrl":96},"references\u002Fmedia-quality-policy.md",2820,"https:\u002F\u002Fgithub.com\u002FopenBitFun\u002FOpenBitFun\u002Fblob\u002Fmain\u002Fsrc\u002Fcrates\u002Fassembly\u002Fcore\u002Fbuiltin_skills\u002Fcreate-openbitfun-skin\u002Freferences\u002Fmedia-quality-policy.md",{"path":98,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":99,"sourceHtmlUrl":100},"references\u002Fpackage-contract.md",5869,"https:\u002F\u002Fgithub.com\u002FopenBitFun\u002FOpenBitFun\u002Fblob\u002Fmain\u002Fsrc\u002Fcrates\u002Fassembly\u002Fcore\u002Fbuiltin_skills\u002Fcreate-openbitfun-skin\u002Freferences\u002Fpackage-contract.md",{"path":102,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":103,"sourceHtmlUrl":104},"references\u002Frenderer-contracts.md",1393,"https:\u002F\u002Fgithub.com\u002FopenBitFun\u002FOpenBitFun\u002Fblob\u002Fmain\u002Fsrc\u002Fcrates\u002Fassembly\u002Fcore\u002Fbuiltin_skills\u002Fcreate-openbitfun-skin\u002Freferences\u002Frenderer-contracts.md",{"path":106,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":107,"sourceHtmlUrl":108},"references\u002Freviewing.md",13915,"https:\u002F\u002Fgithub.com\u002Fbnferguson\u002Fdotfiles\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fmiren-house-style\u002Freferences\u002Freviewing.md",{"path":110,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":111,"sourceHtmlUrl":112},"references\u002Fstyle-example-contract.md",2653,"https:\u002F\u002Fgithub.com\u002FopenBitFun\u002FOpenBitFun\u002Fblob\u002Fmain\u002Fsrc\u002Fcrates\u002Fassembly\u002Fcore\u002Fbuiltin_skills\u002Fcreate-openbitfun-skin\u002Freferences\u002Fstyle-example-contract.md",{"path":114,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":115,"sourceHtmlUrl":116},"references\u002Fwriting-go.md",34602,"https:\u002F\u002Fgithub.com\u002Fbnferguson\u002Fdotfiles\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fmiren-house-style\u002Freferences\u002Fwriting-go.md",{"path":118,"resourceType":119,"resourceTypeDesc":120,"sizeBytes":121,"sourceHtmlUrl":122},"scripts\u002Fbuild_support.py","SCRIPT","脚本",6231,"https:\u002F\u002Fgithub.com\u002FopenBitFun\u002FOpenBitFun\u002Fblob\u002Fmain\u002Fsrc\u002Fcrates\u002Fassembly\u002Fcore\u002Fbuiltin_skills\u002Fcreate-openbitfun-skin\u002Fscripts\u002Fbuild_support.py",{"path":124,"resourceType":119,"resourceTypeDesc":120,"sizeBytes":125,"sourceHtmlUrl":126},"scripts\u002Fmedia_support.py",19968,"https:\u002F\u002Fgithub.com\u002FopenBitFun\u002FOpenBitFun\u002Fblob\u002Fmain\u002Fsrc\u002Fcrates\u002Fassembly\u002Fcore\u002Fbuiltin_skills\u002Fcreate-openbitfun-skin\u002Fscripts\u002Fmedia_support.py",{"path":128,"resourceType":119,"resourceTypeDesc":120,"sizeBytes":129,"sourceHtmlUrl":130},"scripts\u002Fopenbitfun_appearance.py",95509,"https:\u002F\u002Fgithub.com\u002FopenBitFun\u002FOpenBitFun\u002Fblob\u002Fmain\u002Fsrc\u002Fcrates\u002Fassembly\u002Fcore\u002Fbuiltin_skills\u002Fcreate-openbitfun-skin\u002Fscripts\u002Fopenbitfun_appearance.py",{"path":132,"resourceType":119,"resourceTypeDesc":120,"sizeBytes":133,"sourceHtmlUrl":134},"scripts\u002Fsync_registry.py",7680,"https:\u002F\u002Fgithub.com\u002FopenBitFun\u002FOpenBitFun\u002Fblob\u002Fmain\u002Fsrc\u002Fcrates\u002Fassembly\u002Fcore\u002Fbuiltin_skills\u002Fcreate-openbitfun-skin\u002Fscripts\u002Fsync_registry.py",{"path":136,"resourceType":119,"resourceTypeDesc":120,"sizeBytes":137,"sourceHtmlUrl":138},"scripts\u002Ftest_cinematic_tools.py",9822,"https:\u002F\u002Fgithub.com\u002FopenBitFun\u002FOpenBitFun\u002Fblob\u002Fmain\u002Fsrc\u002Fcrates\u002Fassembly\u002Fcore\u002Fbuiltin_skills\u002Fcreate-openbitfun-skin\u002Fscripts\u002Ftest_cinematic_tools.py",{"path":140,"resourceType":119,"resourceTypeDesc":120,"sizeBytes":141,"sourceHtmlUrl":142},"scripts\u002Ftest_openbitfun_appearance.py",7109,"https:\u002F\u002Fgithub.com\u002FopenBitFun\u002FOpenBitFun\u002Fblob\u002Fmain\u002Fsrc\u002Fcrates\u002Fassembly\u002Fcore\u002Fbuiltin_skills\u002Fcreate-openbitfun-skin\u002Fscripts\u002Ftest_openbitfun_appearance.py",{"path":144,"resourceType":119,"resourceTypeDesc":120,"sizeBytes":145,"sourceHtmlUrl":146},"scripts\u002Fverify_host.py",7703,"https:\u002F\u002Fgithub.com\u002FopenBitFun\u002FOpenBitFun\u002Fblob\u002Fmain\u002Fsrc\u002Fcrates\u002Fassembly\u002Fcore\u002Fbuiltin_skills\u002Fcreate-openbitfun-skin\u002Fscripts\u002Fverify_host.py",[148,178,188,218,227,240],{"skillNo":149,"name":150,"nameZh":6,"description":151,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":152,"licenseFileUrl":153,"sourceHtmlUrl":154,"categories":155,"keywords":159,"publishedAt":54},"01M6BVA3RS3M016FANZ6792F9H","skill-creator","Guide for creating effective skills. This skill should be used when users want to create a new skill (or update an existing skill) that extends Claude's capabilities with specialized knowledge, workflows, or tool integrations.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fbnferguson\u002Fdotfiles\u002Fblob\u002Fmain\u002Fclaude\u002Fconfig\u002Fskills\u002Fskill-creator\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fbnferguson\u002Fdotfiles\u002Fblob\u002Fmain\u002Fclaude\u002Fconfig\u002Fskills\u002Fskill-creator\u002FSKILL.md",[156],{"categoryNo":157,"categoryName":158,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,33,177],"creator","skill creator","specialized","workflows","create","update","capabilities","knowledge","tool","integrations","guide","new skill","existing skill","users","with","for","Existing","new",{"skillNo":179,"name":180,"nameZh":6,"description":181,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":182,"categories":183,"keywords":186,"publishedAt":54},"01M6BV94WN2RPYM8N6PN8TBNT8","writing-shape","Writing, exploit: shape raw material into an article, paragraph by paragraph.","https:\u002F\u002Fgithub.com\u002Fbnferguson\u002Fdotfiles\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fwriting-shape\u002FSKILL.md",[184,185],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},[187,43],"writing shape",{"skillNo":189,"name":190,"nameZh":6,"description":191,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":152,"licenseFileUrl":192,"sourceHtmlUrl":193,"categories":194,"keywords":201,"publishedAt":54},"01M6BV8QDFJ6PXBVK5NFBZT5M7","webapp-testing","Test local web applications using Playwright. Use when verifying frontend functionality, debugging UI behavior, capturing browser screenshots, or viewing browser logs.","https:\u002F\u002Fgithub.com\u002Fbnferguson\u002Fdotfiles\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fwebapp-testing\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fbnferguson\u002Fdotfiles\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fwebapp-testing\u002FSKILL.md",[195,198],{"categoryNo":196,"categoryName":197,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":199,"categoryName":200,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发",[202,203,204,205,206,207,208,209,210,211,212,213,214,215,42,216,217,33],"webapp","webapp testing","testing","browser","frontend","screenshots","playwright","test","web","debugging","ui","logs","applications","behavior","local","test local",{"skillNo":219,"name":220,"nameZh":6,"description":221,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":222,"categories":223,"keywords":224,"publishedAt":54},"01M6BV8MDXKXNVHKS3QF3YDFTF","wait-what","Stop. That last message did not land: re-pitch it.","https:\u002F\u002Fgithub.com\u002Fbnferguson\u002Fdotfiles\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fwait-what\u002FSKILL.md",[],[225,226],"wait what","land",{"skillNo":228,"name":229,"nameZh":6,"description":230,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":231,"categories":232,"keywords":236,"publishedAt":54},"01M6BV756DJHT5BDA1HVRVHJJ7","prototype","Build a throwaway prototype to answer a design question. Use when the user wants to sanity-check whether a state model or logic feels right, or explore what a UI should look like.","https:\u002F\u002Fgithub.com\u002Fbnferguson\u002Fdotfiles\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fprototype\u002FSKILL.md",[233],{"categoryNo":234,"categoryName":235,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000032","设计师",[229,237,238,212,239],"design","explore","state",{"skillNo":241,"name":242,"nameZh":6,"description":243,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":244,"categories":245,"keywords":247,"publishedAt":54},"01M6BV6SBW166685KVBPWM2K4N","improve-codebase-architecture","Scan a codebase for deepening opportunities, present them as a visual HTML report, then grill through whichever one you pick.","https:\u002F\u002Fgithub.com\u002Fbnferguson\u002Fdotfiles\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fimprove-codebase-architecture\u002FSKILL.md",[246],{"categoryNo":199,"categoryName":200,"taxonomyType":21,"taxonomyTypeDesc":22},[248,249,250,251],"architecture","improve","improve codebase architecture","report"]