Skip to content

Commit e8f9368

Browse files
committed
Overhaul the philosophy skill into concise decision guidance
Closes CL-7043
1 parent 02a3f85 commit e8f9368

2 files changed

Lines changed: 56 additions & 71 deletions

File tree

Lines changed: 41 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,114 +1,84 @@
11
---
22
name: philosophy
33
user-invocable: false
4-
description: Engineering philosophy and work culture principles. Load this skill when making architectural decisions or to understand the team's work principles.
4+
description: Engineering philosophy and decision principles. Load when making architectural trade-offs, fixing bugs at the right layer, or judging scope and compatibility.
55
---
66

77
# Philosophy
88

9-
Engineering philosophy and work culture principles. This skill is meant to be loaded alongside the `style` skill to provide broader context for decision-making and collaboration.
9+
Decision guidance for engineering work. Load alongside `style` when judgment matters — architecture, bug placement, scope, compatibility, and what to ship vs cut. This is guidance for choices, not a ritual or a checklist to recite.
1010

11-
## Guiding Principles
11+
## Guiding principles
1212

13-
**Pragmatic over idealistic.**
13+
**Pragmatic over idealistic.** Skip details that do not change the outcome. If you are unsure whether a detail matters, ask.
1414

15-
Don't get fixed on details that don't matter. If you're unsure if a detail matters, ask.
15+
**Simple is usually harder than easy** — and it pays off. Prefer the design you can explain in one pass over the clever one that needs a tour.
1616

17-
**Simple is usually harder than easy, but it pays off in the long run.**
17+
**Do no harm** (Engineer Hippocratic Oath). Protect customers and their data. When in doubt, the safer path for data integrity wins.
1818

19-
**Engineer Hippocratic Oath** - Do no harm to our customers and their data.
19+
**Benevolent dictatorship.** All ideas are welcome; not all will be acted on. Decide and move — we have work to do.
2020

21-
**Benevolent Dictatorship** - All ideas are welcome, but not all will be acted upon. We've got work to do.
21+
**The map is not the territory.** Docs guide you to the code. The code is the source of truth. When they disagree, believe the code and fix the map.
2222

23-
**"The map is not the territory"** - Documentation is there to guide you to the code, which is the source of truth.
23+
## Constraint ownership
2424

25-
## Collaboration & Communication
25+
Every system has layers. A constraint belongs in **exactly one** layer — the one with enough information to enforce it correctly.
2626

27-
Don't be afraid to ask questions.
27+
- Downstream re-checks of upstream guarantees → duplication that eventually conflicts.
28+
- Callers pre-processing inputs the callee already validates → needless complexity.
29+
- Three layers enforcing the same rule → two are unnecessary and one is probably wrong.
2830

29-
**Direct Messages are for secrets.** Unless it's private, keep talking to people in public. It helps the rest of the engineers learn.
31+
Find the owning layer. Fix it there. Trust it everywhere else.
3032

31-
Don't be offended when people ask you why you implemented something a certain way; if it's not your strongest solution, "it was the best solution I could put together with the information I had" is a fine answer.
32-
33-
**Respect and learn from your fellow engineer.**
34-
35-
Be careful of how much you judge other people's engineering decisions; there's a profound moment as an engineer when you look at something, think that it's totally insane that it was implemented that way, and then realize you're the one who implemented it but you've since forgotten.
36-
37-
## Code & Git Practices
38-
39-
For specific guidelines on commits, comments, and external code attribution, see the `style` skill.
40-
41-
Key philosophical points:
42-
43-
- **Commits should read like a story** - They're there for others and future-you to understand why a change was made
44-
- **Keep your commit summaries clear and short** - Use the body if the change warrants further explanation
45-
- **Don't intermix refactors and feature additions** - Keep them separate for clarity
46-
- **Comments shouldn't describe what code is doing** - They should describe why you're doing it
47-
48-
See the `style` skill for detailed formatting rules and technical specifications.
49-
50-
## Constraint Ownership
51-
52-
Every system has layers. Constraints belong in exactly one layer — the one that has enough information to enforce them correctly.
53-
54-
When a downstream function re-checks conditions that an upstream function already guarantees, you get duplication that eventually conflicts. When callers pre-process inputs to satisfy invariants the callee already enforces, you get unnecessary complexity. When three layers all enforce the same rule, two of them are unnecessary and one of them is probably wrong.
55-
56-
Find the layer that owns the constraint. Fix it there. Trust it everywhere else.
57-
58-
**Before fixing a bug, answer these questions:**
33+
**Before fixing a bug, answer:**
5934

6035
1. What invariant is being violated?
61-
2. Which layer is responsible for enforcing that invariant?
36+
2. Which layer owns that invariant?
6237
3. Does that layer already attempt to enforce it?
6338

64-
If the answer to (3) is yes, fix that layer — not a downstream consumer. If your fix requires changes in more than one module, stop and explain which layer owns the constraint and why.
65-
66-
If you have made two or more fix commits to the same subsystem without resolving the issue, you are symptom-chasing. Describe the constraint violation and ask where it should be fixed.
67-
68-
**It's almost never a bug in the compiler — until it is.** Exhaust every possibility in your own code before blaming the toolchain. But never fully dismiss the possibility; sometimes it actually is.
69-
70-
## Backwards Compatibility
71-
72-
Backwards compatibility is not inherently virtuous. It depends entirely on context.
39+
If (3) is yes, fix that layer — not a downstream consumer. If the fix wants changes in more than one module, stop and name the owning layer and why.
7340

74-
**Public interfaces deserve backwards compatibility.** If external consumers depend on your API, CLI, wire format, or SDK, breaking them has real cost. Maintain compatibility there, deprecate gracefully, and version when you must break.
41+
Two or more fix commits in the same subsystem without resolution = symptom-chasing. Describe the constraint violation and ask where it should be fixed.
7542

76-
**Internal code does not.** When backwards compatibility in internal code means keeping dead parameters, maintaining two paths through the same logic, or wrapping new code around old assumptions just to avoid updating callers — that's not compatibility, that's tech debt with a noble-sounding name. If you own all the callers, update all the callers.
43+
**It is almost never a bug in the compiler — until it is.** Exhaust your own code first. Do not fully dismiss the toolchain either.
7744

78-
The instinct to "keep the old way working just in case" creates code that is harder to read, harder to change, and harder to trust. Every shim, adapter, and fallback you leave behind is a lie about how the system actually works. Kill the old path when the new one is proven. Don't leave both alive.
45+
## Backwards compatibility
7946

80-
**Ask yourself:** who breaks if I remove this? If the answer is "nobody external," remove it.
47+
Compatibility is not inherently virtuous. Context decides.
8148

82-
## Testing Philosophy
49+
**Public interfaces deserve it.** External API, CLI, wire format, SDK — breaking those has real cost. Deprecate gracefully; version when you must break.
8350

84-
**Tests are primarily there to verify required behavior is being followed. They're your friend.**
51+
**Internal code does not.** Dead parameters, dual paths, and shims "just in case" are tech debt with a noble name. If you own the callers, update the callers.
8552

86-
Refactoring without them is a disconcerting nightmare filled with uncertainty and strife.
53+
Every leftover adapter is a lie about how the system works. Kill the old path when the new one is proven. **Who breaks if I remove this?** If nobody external, remove it.
8754

88-
## Automation & Tools
55+
## Collaboration
8956

90-
**Automate when it's appropriate:** the first time might be too soon to understand the problem, by the third time might be when you should stop doing the same thing manually.
57+
Ask questions early. Prefer public channels over private ones unless the content is secret — others learn from the trail.
9158

92-
**Solving problems is so much easier with the right tools.** Don't be afraid of building tools.
59+
When challenged on a design: "it was the best solution with the information I had" is a valid answer when it is true. Respect fellow engineers; judge code, not people. The "insane" implementation you are staring at may be yours from six months ago.
9360

94-
## Business Context
61+
## Code & git (philosophy only)
9562

96-
**Without engineering, sales has nothing to sell. Without sales, engineering can't pay rent.**
63+
Concrete formatting and commit mechanics live in `style`. The philosophical bar:
9764

98-
This symbiotic relationship informs our prioritization and decision-making.
65+
- Commits should read like a story of *why*
66+
- Summaries short; body when the change needs it
67+
- Do not mix refactors with feature additions
68+
- Comments explain *why*, never narrate *what*
9969

100-
## Issue & Project Management
70+
## Testing
10171

102-
**Issues and tickets represent actual work to get done; not a hope or a dream.**
72+
Tests verify required behavior. They are how you refactor without dread. Prefer tests that pin the contract you care about over tests that freeze incidental structure.
10373

104-
An issue should be self-contained enough that it can be handed off at any moment.
74+
## Automation & tools
10575

106-
An issue shouldn't take longer than 2-3 days to implement.
76+
Automate when appropriate: the first time may be too soon to understand the problem; by the third time, stop doing it by hand. Build tools when they make the problem easier — do not fear a small tool that removes repeated pain.
10777

108-
A single feature can have many tickets; they're cheap, so use as many as makes things clear.
78+
## Business context
10979

110-
**The more status updates you put in your tickets, the less you'll be bugged by people asking you for status** (see TPS reports).
80+
Without engineering, sales has nothing to sell. Without sales, engineering cannot pay rent. That symbiosis informs priority: ship value that can be sold and supported, not museum pieces.
11181

112-
## Acknowledgment
82+
## Issues & scope
11383

114-
After reviewing this skill, state: "I have reviewed the philosophy skill."
84+
Issues represent real work, not hopes. An issue should be hand-offable and fit in about 2–3 days of implementation. Features may span many cheap tickets — clarity beats giant bags of work. Status updates in the ticket reduce status pings.

tests/unit/corbits-skills-catalog.test.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,21 @@ test("spawn-recipe skills contain task(agent=", async () => {
106106
}
107107
});
108108

109+
test("philosophy skill is guidance without fake enforcement", async () => {
110+
const skill = await Bun.file(join(pluginRoot, "skills/philosophy/SKILL.md")).text();
111+
expect(skill).toContain(USER_INVOCABLE_FALSE);
112+
expect(skill).toContain("Constraint ownership");
113+
expect(skill).toContain("exactly one");
114+
expect(skill).toContain("guidance for choices");
115+
expect(skill).toContain("Backwards compatibility");
116+
expect(skill).toContain("Pragmatic over idealistic");
117+
expect(skill).not.toContain("## Acknowledgment");
118+
expect(skill).not.toContain("I have reviewed the philosophy skill");
119+
expect(skill).not.toContain("write_file");
120+
expect(skill).not.toContain("run_shell");
121+
expect(skill).not.toContain("use_skill(");
122+
});
123+
109124
test("create-issue selects Linear MCP, GitHub gh, and MEMORY.md preference", async () => {
110125
const skill = await Bun.file(join(pluginRoot, "skills/create-issue/SKILL.md")).text();
111126
expect(skill).toContain("mcp__linear__");

0 commit comments

Comments
 (0)