@polderlabs/bizar 10.7.1 → 10.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/_shared/AGENT_BASELINE.md +266 -0
- package/.claude/agents/_shared/CLAUDE_TOOLS.md +412 -0
- package/.claude/agents/_shared/SKILLS.md +109 -0
- package/.claude/agents/brand-designer.md +55 -0
- package/.claude/agents/exec-assistant.md +34 -0
- package/.claude/agents/help-desk.md +44 -0
- package/.claude/agents/it-lead.md +53 -0
- package/.claude/agents/knowledge-manager.md +49 -0
- package/.claude/agents/office-coordinator.md +39 -0
- package/.claude/agents/office-greeter.md +53 -0
- package/.claude/agents/office-manager.md +287 -0
- package/.claude/agents/principal-engineer.md +58 -0
- package/.claude/agents/qa-reviewer.md +51 -0
- package/.claude/agents/research-analyst.md +53 -0
- package/.claude/agents/senior-engineer.md +55 -0
- package/.claude/agents/support-tech.md +87 -0
- package/.claude/agents/vp-engineering.md +54 -0
- package/.claude/commands/audit.md +48 -0
- package/.claude/commands/bizar.md +22 -0
- package/.claude/commands/cron.md +36 -0
- package/.claude/commands/explain.md +17 -0
- package/.claude/commands/goal.md +99 -0
- package/.claude/commands/init.md +15 -0
- package/.claude/commands/learn.md +46 -0
- package/.claude/commands/plan.md +35 -0
- package/.claude/commands/plow-through.md +50 -0
- package/.claude/commands/pr-review.md +49 -0
- package/.claude/commands/setup-provider.md +96 -0
- package/.claude/commands/spec.md +47 -0
- package/.claude/commands/sprint.md +43 -0
- package/.claude/commands/tailscale-serve.md +100 -0
- package/.claude/commands/team.md +132 -0
- package/.claude/commands/test.md +62 -0
- package/.claude/commands/validate.md +68 -0
- package/.claude/commands/visual-plan.md +24 -0
- package/.claude/hooks/README.md +108 -0
- package/.claude/hooks/__tests__/pretooluse-editwrite.test.mjs +146 -0
- package/.claude/hooks/__tests__/sessionend-recall.test.mjs +256 -0
- package/.claude/hooks/__tests__/sessionstart-prime.test.mjs +325 -0
- package/.claude/hooks/__tests__/thinking-route.test.mjs +319 -0
- package/.claude/hooks/auto-instinct.sh +81 -0
- package/.claude/hooks/learning-extract.mjs +92 -0
- package/.claude/hooks/post-merge-audit.sh +93 -0
- package/.claude/hooks/posttooluse-editwrite.mjs +91 -0
- package/.claude/hooks/pretooluse-bash.mjs +87 -0
- package/.claude/hooks/pretooluse-editwrite.mjs +117 -0
- package/.claude/hooks/sessionend-recall.mjs +384 -0
- package/.claude/hooks/sessionstart-prime.mjs +278 -0
- package/.claude/hooks/thinking-route.mjs +314 -0
- package/.claude/hooks/worker-suggest.mjs +110 -0
- package/.claude/settings.json +167 -0
- package/.claude/skills/9router/SKILL.md +80 -0
- package/.claude/skills/9router-chat/SKILL.md +73 -0
- package/.claude/skills/9router-embeddings/SKILL.md +69 -0
- package/.claude/skills/9router-image/SKILL.md +86 -0
- package/.claude/skills/9router-stt/SKILL.md +79 -0
- package/.claude/skills/9router-tts/SKILL.md +80 -0
- package/.claude/skills/9router-web-fetch/SKILL.md +99 -0
- package/.claude/skills/9router-web-search/SKILL.md +91 -0
- package/.claude/skills/agent-browser/SKILL.md +64 -0
- package/.claude/skills/bizar/README.md +9 -0
- package/.claude/skills/bizar/SKILL.md +447 -0
- package/.claude/skills/cpp-coding-standards/README.md +28 -0
- package/.claude/skills/cpp-coding-standards/SKILL.md +634 -0
- package/.claude/skills/cpp-coding-standards/references/concurrency.md +320 -0
- package/.claude/skills/cpp-coding-standards/references/error-handling.md +229 -0
- package/.claude/skills/cpp-coding-standards/references/memory-safety.md +216 -0
- package/.claude/skills/cpp-coding-standards/references/modern-idioms.md +282 -0
- package/.claude/skills/cpp-coding-standards/references/review-checklist.md +96 -0
- package/.claude/skills/cpp-testing/README.md +28 -0
- package/.claude/skills/cpp-testing/SKILL.md +304 -0
- package/.claude/skills/cpp-testing/references/coverage.md +370 -0
- package/.claude/skills/cpp-testing/references/framework-compare.md +175 -0
- package/.claude/skills/cpp-testing/references/host-test-for-embedded.md +499 -0
- package/.claude/skills/cpp-testing/references/mocking.md +364 -0
- package/.claude/skills/cpp-testing/references/tdd-workflow.md +308 -0
- package/.claude/skills/cubesandbox/SKILL.md +148 -0
- package/.claude/skills/de-sloppify/SKILL.md +38 -0
- package/.claude/skills/de-sloppify/cleanup.mjs +253 -0
- package/.claude/skills/de-sloppify/cleanup.test.mjs +189 -0
- package/.claude/skills/embedded-esp-idf/README.md +41 -0
- package/.claude/skills/embedded-esp-idf/SKILL.md +439 -0
- package/.claude/skills/embedded-esp-idf/references/freertos-patterns.md +214 -0
- package/.claude/skills/embedded-esp-idf/references/host-tests.md +164 -0
- package/.claude/skills/embedded-esp-idf/references/idf-py-commands.md +157 -0
- package/.claude/skills/embedded-esp-idf/references/kconfig.md +159 -0
- package/.claude/skills/embedded-esp-idf/references/logging-discipline.md +118 -0
- package/.claude/skills/embedded-esp-idf/references/memory-and-iram.md +137 -0
- package/.claude/skills/embedded-esp-idf/references/nvs.md +121 -0
- package/.claude/skills/embedded-esp-idf/references/packed-structs.md +192 -0
- package/.claude/skills/embedded-esp-idf/scripts/idf_env.sh +47 -0
- package/.claude/skills/embedded-esp-idf/scripts/size_check.sh +77 -0
- package/.claude/skills/glyph/SKILL.md +163 -0
- package/.claude/skills/harness-engineering/SKILL.md +142 -0
- package/.claude/skills/lightrag/SKILL.md +81 -0
- package/.claude/skills/memory-protocol/SKILL.md +105 -0
- package/.claude/skills/obsidian/SKILL.md +306 -0
- package/.claude/skills/read-the-damn-docs/SKILL.md +113 -0
- package/.claude/skills/self-improvement/SKILL.md +64 -0
- package/.claude/skills/skillopt/SKILL.md +129 -0
- package/.claude/skills/thinking-archetypes/SKILL.md +90 -0
- package/.claude/skills/thinking-bayesian/SKILL.md +267 -0
- package/.claude/skills/thinking-bounded-rationality/SKILL.md +406 -0
- package/.claude/skills/thinking-circle-of-competence/SKILL.md +216 -0
- package/.claude/skills/thinking-cynefin/SKILL.md +70 -0
- package/.claude/skills/thinking-debiasing/SKILL.md +192 -0
- package/.claude/skills/thinking-dual-process/SKILL.md +282 -0
- package/.claude/skills/thinking-effectuation/SKILL.md +366 -0
- package/.claude/skills/thinking-feedback-loops/SKILL.md +464 -0
- package/.claude/skills/thinking-fermi-estimation/SKILL.md +263 -0
- package/.claude/skills/thinking-first-principles/SKILL.md +167 -0
- package/.claude/skills/thinking-five-whys-plus/SKILL.md +139 -0
- package/.claude/skills/thinking-inversion/SKILL.md +195 -0
- package/.claude/skills/thinking-jobs-to-be-done/SKILL.md +363 -0
- package/.claude/skills/thinking-kepner-tregoe/SKILL.md +154 -0
- package/.claude/skills/thinking-leverage-points/SKILL.md +390 -0
- package/.claude/skills/thinking-lindy-effect/SKILL.md +331 -0
- package/.claude/skills/thinking-map-territory/SKILL.md +111 -0
- package/.claude/skills/thinking-margin-of-safety/SKILL.md +330 -0
- package/.claude/skills/thinking-model-combination/SKILL.md +406 -0
- package/.claude/skills/thinking-model-router/SKILL.md +360 -0
- package/.claude/skills/thinking-model-selection/SKILL.md +341 -0
- package/.claude/skills/thinking-occams-razor/SKILL.md +129 -0
- package/.claude/skills/thinking-ooda/SKILL.md +127 -0
- package/.claude/skills/thinking-opportunity-cost/SKILL.md +360 -0
- package/.claude/skills/thinking-pre-mortem/SKILL.md +170 -0
- package/.claude/skills/thinking-probabilistic/SKILL.md +324 -0
- package/.claude/skills/thinking-red-team/SKILL.md +142 -0
- package/.claude/skills/thinking-regret-minimization/SKILL.md +335 -0
- package/.claude/skills/thinking-reversibility/SKILL.md +326 -0
- package/.claude/skills/thinking-scientific-method/SKILL.md +162 -0
- package/.claude/skills/thinking-second-order/SKILL.md +184 -0
- package/.claude/skills/thinking-socratic/SKILL.md +198 -0
- package/.claude/skills/thinking-steel-manning/SKILL.md +332 -0
- package/.claude/skills/thinking-systems/SKILL.md +238 -0
- package/.claude/skills/thinking-theory-of-constraints/SKILL.md +338 -0
- package/.claude/skills/thinking-thought-experiment/SKILL.md +354 -0
- package/.claude/skills/thinking-triz/SKILL.md +171 -0
- package/.claude/skills/thinking-via-negativa/SKILL.md +358 -0
- package/cli/install/postinstall.mjs +54 -28
- package/cli/install/postinstall.test.mjs +98 -0
- package/package.json +7 -2
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: thinking-triz
|
|
3
|
+
description: Use when stuck between two architecture or API requirements that seem mutually exclusive — name the contradiction precisely, then separate the conflicting states in time, space, or condition.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# TRIZ Thinking
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
TRIZ is a systematic method for resolving **architecture and API design contradictions** — situations where two requirements seem mutually exclusive. When you're about to accept a trade-off because "you can't have both," TRIZ says: name the contradiction precisely, then try to **separate** the conflicting states in time, space, or condition so you get both — no compromise.
|
|
11
|
+
|
|
12
|
+
The separation moves are the primary procedure. The 40 Inventive Principles are a reference library, not a required checklist. The skill is scoped to technical design contradictions (architecture, API, system parameters); it is NOT for non-technical problems, ordinary prioritization, or contradictions that dissolve under measurement.
|
|
13
|
+
|
|
14
|
+
**Core Principle:** Great design doesn't compromise — it separates. Find the dimension where the conflicting states can coexist.
|
|
15
|
+
|
|
16
|
+
## When to Use
|
|
17
|
+
|
|
18
|
+
- An architecture or API design decision is stuck between two requirements that seem mutually exclusive (fast vs accurate, stable vs evolving, large cache vs fast invalidation)
|
|
19
|
+
- You're about to accept a trade-off because "you can't have both"
|
|
20
|
+
- The same weakness shows up in every solution you've considered — the contradiction is structural
|
|
21
|
+
|
|
22
|
+
Decision flow:
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
Two requirements seem mutually exclusive?
|
|
26
|
+
→ Yes → NAME THE CONTRADICTION, TRY SEPARATION
|
|
27
|
+
→ No → About to accept a trade-off curve compromise?
|
|
28
|
+
→ Yes → APPLY TRIZ FIRST
|
|
29
|
+
→ No → This is a routine decision — just pick based on constraints
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## When NOT to Use
|
|
33
|
+
|
|
34
|
+
- **Ordinary trade-offs with a correct answer.** If one option is simply better given your constraints (cheaper, simpler, well-understood), just pick it — don't manufacture a contradiction.
|
|
35
|
+
- **The "contradiction" dissolves under measurement.** If you can cheaply test which side actually matters, do that instead of inventing a separation.
|
|
36
|
+
- **Non-technical or people problems.** Separation principles target system parameters, not organizational dynamics or interpersonal conflicts.
|
|
37
|
+
- **The contradiction is already well-solved by standard patterns.** If there's an established pattern (cache-aside, CQRS, feature flags), apply the pattern directly.
|
|
38
|
+
|
|
39
|
+
## Trigger Card
|
|
40
|
+
|
|
41
|
+
When stuck between two architecture or API requirements that seem mutually exclusive:
|
|
42
|
+
|
|
43
|
+
1. **Name the contradiction precisely** — "We need [PARAMETER A] to be [STATE 1] for [BENEFIT 1] BUT also [STATE 2] for [BENEFIT 2]." If you can't write it in this form, it's not a TRIZ problem.
|
|
44
|
+
2. **Try separation** — can you satisfy state 1 at one TIME and state 2 at another? In different SPACES (components, layers)? Under different CONDITIONS (context, load, user)?
|
|
45
|
+
3. **Test the simplest separation first** — separate in time (feature flags, scheduled behavior) before space (separate services) before condition.
|
|
46
|
+
|
|
47
|
+
If one option is simply better given your constraints, just pick it. If you can cheaply test which side actually matters, test instead of designing a separation. For standard patterns (cache-aside, CQRS, feature flags), apply the pattern directly.
|
|
48
|
+
|
|
49
|
+
## Procedure
|
|
50
|
+
|
|
51
|
+
### Step 1: Name the Contradiction Precisely
|
|
52
|
+
|
|
53
|
+
Use this template:
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
"We need [PARAMETER A] to be [STATE 1] for [BENEFIT 1]
|
|
57
|
+
BUT also [STATE 2] for [BENEFIT 2]"
|
|
58
|
+
|
|
59
|
+
Example:
|
|
60
|
+
"We need the API to be STABLE for client compatibility
|
|
61
|
+
BUT also EVOLVING to support new features"
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
If you can't write the contradiction in this form, it's not a TRIZ problem — use another skill.
|
|
65
|
+
|
|
66
|
+
### Step 2: Envision the Ideal Final Result (IFR)
|
|
67
|
+
|
|
68
|
+
Before solving, describe the outcome where the problem solves itself:
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
"The API supports both old and new clients simultaneously,
|
|
72
|
+
without version negotiation overhead,
|
|
73
|
+
while maintaining a single codebase."
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
IFR questions: What if the problem solved itself? What if the harmful element became useful? What's the result with zero cost?
|
|
77
|
+
|
|
78
|
+
### Step 3: Try Separation Moves (Primary Procedure)
|
|
79
|
+
|
|
80
|
+
For each separation dimension, ask: "Can the conflicting states exist at different [times/places/conditions/scales]?"
|
|
81
|
+
|
|
82
|
+
#### Separation in Time
|
|
83
|
+
|
|
84
|
+
"Can we be in state 1 at one time and state 2 at another?"
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
Contradiction: "Cache must be FRESH AND cached"
|
|
88
|
+
Separation in Time: TTL-based invalidation — cached now, refreshed later
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
#### Separation in Space
|
|
92
|
+
|
|
93
|
+
"Can we be in state 1 in one place and state 2 in another?"
|
|
94
|
+
|
|
95
|
+
```
|
|
96
|
+
Contradiction: "Data must be LOCAL (fast) AND DISTRIBUTED (resilient)"
|
|
97
|
+
Separation in Space: Multi-region with local reads, distributed writes
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
#### Separation by Condition
|
|
101
|
+
|
|
102
|
+
"Can we be in state 1 under some conditions and state 2 under others?"
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
Contradiction: "Auth must be STRICT AND frictionless"
|
|
106
|
+
Separation by Condition: Strict for sensitive operations, frictionless for low-risk — risk-based authentication
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
#### Separation in Scale/Level
|
|
110
|
+
|
|
111
|
+
"Can state 1 and state 2 exist at different levels of the system?"
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
Contradiction: "API must be STABLE AND evolving"
|
|
115
|
+
Separation in Scale: Stable interface (API contract), evolving implementation — versioned APIs
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Step 4: If Separation Fails, Scan the Principles (Reference)
|
|
119
|
+
|
|
120
|
+
When no separation dimension resolves the contradiction, scan the software-adapted inventive principles for inspiration:
|
|
121
|
+
|
|
122
|
+
| Principle | Software Pattern |
|
|
123
|
+
|-----------|-----------------|
|
|
124
|
+
| Segmentation (#1) | Microservices, sharding, chunked processing |
|
|
125
|
+
| Preliminary Action (#10) | Pre-computation, caching, warm-up, materialized views |
|
|
126
|
+
| The Other Way Round (#13) | Push vs pull, invert control, event-driven instead of polling |
|
|
127
|
+
| Intermediary (#24) | Proxy, message queue, API gateway, adapter |
|
|
128
|
+
| Copying (#26) | Caching, replication, CDN, read replicas |
|
|
129
|
+
| Dynamization (#15) | Feature flags, runtime configuration, adaptive thresholds |
|
|
130
|
+
| Another Dimension (#17) | Add metadata layer, versioning, event sourcing |
|
|
131
|
+
|
|
132
|
+
The full 40 principles are reference material; scan only the most applicable ones.
|
|
133
|
+
|
|
134
|
+
### Step 5: Resource Analysis
|
|
135
|
+
|
|
136
|
+
Before adding new components, ask: what already exists that can be used?
|
|
137
|
+
|
|
138
|
+
```
|
|
139
|
+
Before: "We need a new service to track user sessions"
|
|
140
|
+
Resource check:
|
|
141
|
+
- What data already exists? → Auth tokens carry user identity
|
|
142
|
+
- What's already running? → Load balancer sees all requests
|
|
143
|
+
- What's unused? → Request headers have room for session ID
|
|
144
|
+
Solution: Encode session in existing auth flow — no new service
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### Step 6: Synthesize and Decide
|
|
148
|
+
|
|
149
|
+
Combine the separation move with resource reuse into a concrete design decision. Document the contradiction, the separation dimension used, and the resolution.
|
|
150
|
+
|
|
151
|
+
## Output Contract
|
|
152
|
+
|
|
153
|
+
A completed TRIZ analysis produces:
|
|
154
|
+
|
|
155
|
+
1. **Contradiction Statement** — in the precise template form (Parameter A must be State 1 for Benefit 1 BUT State 2 for Benefit 2)
|
|
156
|
+
2. **Ideal Final Result** — what the self-solving outcome looks like
|
|
157
|
+
3. **Separation Attempts** — which dimensions were tried (time, space, condition, scale) and the result
|
|
158
|
+
4. **Principles Scanned** (if separation failed) — which inventive principles were considered
|
|
159
|
+
5. **Resources Used** — what existing capabilities were leveraged before adding new ones
|
|
160
|
+
6. **Resolution** — the concrete design decision that resolves the contradiction without compromise
|
|
161
|
+
|
|
162
|
+
## Anti-Patterns
|
|
163
|
+
|
|
164
|
+
| Anti-Pattern | Symptom | Correction |
|
|
165
|
+
|---|---|---|
|
|
166
|
+
| **Manufacturing contradictions** | Applying TRIZ to "which database should we use" when one is clearly better | Use it only for genuine "I need both opposite states" tension |
|
|
167
|
+
| **Compromising instead of separating** | Accepting a midpoint on the trade-off curve without trying separation | Try all four separation dimensions before compromising |
|
|
168
|
+
| **Skipping separation, jumping to principles** | Immediately scanning the 40 principles without trying time/space/condition/scale | Separation is the primary procedure; principles are the fallback |
|
|
169
|
+
| **Applying to non-technical problems** | Using TRIZ for org dynamics or interpersonal conflicts | Separation targets system parameters, not people |
|
|
170
|
+
| **Over-applying to testable contradictions** | Running full TRIZ when a pam measurement resolves which side matters | If you can test it cheaply, test it |
|
|
171
|
+
| **Ignoring existing resources** | Adding new components when existing ones could be reused | Resource analysis before new component proposals |
|
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: thinking-via-negativa
|
|
3
|
+
description: About to add a feature/layer/process to fix a problem. First ask what to remove instead — subtraction is often more robust than addition. Use for simplification and complexity reduction.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Via Negativa
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
Via Negativa, articulated by Nassim Taleb in "Antifragile," is the principle that improvement often comes from subtraction rather than addition. We're biased toward adding (features, processes, complexity) when removing (bugs, friction, unnecessary work) often provides more value with less risk.
|
|
11
|
+
|
|
12
|
+
**Core Principle:** Focus on what to remove, not what to add. Subtraction is more robust than addition.
|
|
13
|
+
|
|
14
|
+
## When to Use
|
|
15
|
+
|
|
16
|
+
- System simplification
|
|
17
|
+
- Process improvement
|
|
18
|
+
- Feature prioritization (what NOT to build)
|
|
19
|
+
- Performance optimization
|
|
20
|
+
- Reducing technical debt
|
|
21
|
+
- Personal productivity
|
|
22
|
+
- Decision-making (what to avoid)
|
|
23
|
+
- Code review (what to delete)
|
|
24
|
+
|
|
25
|
+
Decision flow:
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
Trying to improve something?
|
|
29
|
+
→ First instinct is to add? → yes → PAUSE, CONSIDER SUBTRACTION
|
|
30
|
+
→ Can you achieve the goal by removing instead? → yes → REMOVE FIRST
|
|
31
|
+
→ Is current complexity necessary? → no → SIMPLIFY VIA NEGATIVA
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## When NOT to Use
|
|
35
|
+
|
|
36
|
+
- **Never subtract a load-bearing control, test, validation, guard, or safety check** just because it's "extra complexity." Removal is only low-risk when the thing is genuinely unused or redundant. A test you don't understand, an error handler, a rate limiter, an auth check, or a retry are presumed load-bearing — prove they're dead before deleting. The whole "subtraction is safe" claim holds only for things that provide no benefit.
|
|
37
|
+
- **Not when the addition is genuinely required** to meet a real, demonstrated need. Via negativa fights the *reflex* to add; it doesn't forbid all addition.
|
|
38
|
+
- **Don't delete to hit an aesthetic "less is more" target** without checking what each element does — confirm non-use with evidence (usage data, dead-code analysis, removing it in a branch and watching), not assumption.
|
|
39
|
+
|
|
40
|
+
## Trigger Card
|
|
41
|
+
|
|
42
|
+
When about to add a feature, layer, or process to fix a problem:
|
|
43
|
+
|
|
44
|
+
1. **Ask: "What can I remove instead?"** — before adding, scan for something to subtract that would have the same or better effect.
|
|
45
|
+
2. **Identify the highest-cost, lowest-usage candidates** — what's consuming resources (code, process, dependency) but delivering the least value?
|
|
46
|
+
3. **Remove the simplest one first** — subtraction is asymmetric: removing is safer than adding because you can always add back. Test by removing it in a branch and seeing what breaks.
|
|
47
|
+
|
|
48
|
+
Don't delete to hit an aesthetic target without checking what each element does — confirm non-use with evidence, not assumption. If the addition is genuinely required for a real, demonstrated need, add it — via negativa fights the reflex to add, not all addition.
|
|
49
|
+
|
|
50
|
+
## The Via Negativa Process
|
|
51
|
+
|
|
52
|
+
### Step 1: Identify What to Eliminate
|
|
53
|
+
|
|
54
|
+
Instead of "What should we add?", ask:
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
- What's not working that we should remove?
|
|
58
|
+
- What's causing harm we should stop?
|
|
59
|
+
- What's unnecessary complexity we should eliminate?
|
|
60
|
+
- What's outdated that we should delete?
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
### Step 2: Catalog Candidates for Removal
|
|
64
|
+
|
|
65
|
+
List elements that might be subtracted:
|
|
66
|
+
|
|
67
|
+
```markdown
|
|
68
|
+
## Candidates for Removal
|
|
69
|
+
|
|
70
|
+
Code:
|
|
71
|
+
- Dead code (unreachable)
|
|
72
|
+
- Deprecated features (still running)
|
|
73
|
+
- Unused dependencies
|
|
74
|
+
- Redundant abstractions
|
|
75
|
+
|
|
76
|
+
Process:
|
|
77
|
+
- Meetings that don't produce decisions
|
|
78
|
+
- Approval steps that don't add value
|
|
79
|
+
- Reports no one reads
|
|
80
|
+
- Alerts no one acts on
|
|
81
|
+
|
|
82
|
+
Features:
|
|
83
|
+
- Low-usage functionality
|
|
84
|
+
- Legacy features maintained "just in case"
|
|
85
|
+
- Edge cases that complicate the core
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Step 3: Evaluate Impact of Removal
|
|
89
|
+
|
|
90
|
+
For each candidate:
|
|
91
|
+
|
|
92
|
+
```markdown
|
|
93
|
+
| Element | Usage | Maintenance Cost | Risk of Removal | Value of Removal |
|
|
94
|
+
|---------|-------|------------------|-----------------|------------------|
|
|
95
|
+
| Feature X | 0.1% of users | 20 hrs/month | Low | High |
|
|
96
|
+
| Meeting Y | 8 people | 4 hrs/week | None | High |
|
|
97
|
+
| Process Z | 5 approvers | 2 days/request | Medium | Medium |
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Step 4: Remove with Monitoring
|
|
101
|
+
|
|
102
|
+
Subtract and verify no harm:
|
|
103
|
+
|
|
104
|
+
```markdown
|
|
105
|
+
Week 1: Remove Feature X for 10% of users
|
|
106
|
+
Week 2: Monitor complaints, metrics
|
|
107
|
+
Week 3: If no issues, remove for 50%
|
|
108
|
+
Week 4: Full removal and code deletion
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Via Negativa Patterns
|
|
112
|
+
|
|
113
|
+
### Subtractive Design
|
|
114
|
+
|
|
115
|
+
Add by removing:
|
|
116
|
+
|
|
117
|
+
```
|
|
118
|
+
Goal: Make the product easier to use
|
|
119
|
+
Additive approach: Add tutorial, tooltips, help section
|
|
120
|
+
Via Negativa: Remove confusing features, simplify flow, delete options
|
|
121
|
+
|
|
122
|
+
Often more effective:
|
|
123
|
+
- Fewer choices = easier decisions
|
|
124
|
+
- Less surface area = less to learn
|
|
125
|
+
- Simpler UI = faster adoption
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### The Pruning Principle
|
|
129
|
+
|
|
130
|
+
Healthy growth requires pruning:
|
|
131
|
+
|
|
132
|
+
```
|
|
133
|
+
Codebase:
|
|
134
|
+
- Every feature has maintenance cost
|
|
135
|
+
- Old features create complexity tax
|
|
136
|
+
- Pruning unused code enables healthier growth
|
|
137
|
+
|
|
138
|
+
Team:
|
|
139
|
+
- Every process has coordination cost
|
|
140
|
+
- Old processes accumulate like barnacles
|
|
141
|
+
- Pruning enables focus on what matters
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### Harm Reduction Over Benefit Addition
|
|
145
|
+
|
|
146
|
+
Removing bad is often more impactful than adding good:
|
|
147
|
+
|
|
148
|
+
```
|
|
149
|
+
Performance:
|
|
150
|
+
- Removing one slow query helps more than adding one cache
|
|
151
|
+
- Eliminating N+1 beats adding read replicas
|
|
152
|
+
- Deleting unused indexes beats adding new ones
|
|
153
|
+
|
|
154
|
+
Health (Taleb's domain):
|
|
155
|
+
- Removing sugar helps more than adding supplements
|
|
156
|
+
- Stopping smoking beats starting exercise
|
|
157
|
+
- Eliminating stress beats adding meditation
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### The 80/20 Removal
|
|
161
|
+
|
|
162
|
+
Remove the 80% that provides 20% of value:
|
|
163
|
+
|
|
164
|
+
```markdown
|
|
165
|
+
## Feature Usage Analysis
|
|
166
|
+
|
|
167
|
+
| Feature | Users | Revenue | Maintenance |
|
|
168
|
+
|---------|-------|---------|-------------|
|
|
169
|
+
| Core A | 90% | 70% | 20% |
|
|
170
|
+
| Core B | 85% | 25% | 15% |
|
|
171
|
+
| Edge C | 5% | 3% | 25% |
|
|
172
|
+
| Edge D | 2% | 2% | 40% |
|
|
173
|
+
|
|
174
|
+
Via Negativa: Remove Edge C and D
|
|
175
|
+
Result: 65% less maintenance for 5% of value
|
|
176
|
+
Enables focus on Core A and B
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## Application Areas
|
|
180
|
+
|
|
181
|
+
### Code
|
|
182
|
+
|
|
183
|
+
```markdown
|
|
184
|
+
## Via Negativa Code Review
|
|
185
|
+
|
|
186
|
+
Before adding new code, ask:
|
|
187
|
+
1. Can we solve this by removing existing code?
|
|
188
|
+
2. Is there dead code to delete?
|
|
189
|
+
3. Are there unused imports/dependencies?
|
|
190
|
+
4. Is there duplication to consolidate?
|
|
191
|
+
5. Are there unnecessary abstractions?
|
|
192
|
+
|
|
193
|
+
Rule: Every PR should delete at least as much as it adds
|
|
194
|
+
(aspirational, not mandatory)
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### Process
|
|
198
|
+
|
|
199
|
+
```markdown
|
|
200
|
+
## Via Negativa Process Audit
|
|
201
|
+
|
|
202
|
+
List all recurring processes:
|
|
203
|
+
- Daily standup (15 min/day × 8 people = 10 hrs/week)
|
|
204
|
+
- Sprint planning (2 hrs × 8 people = 16 hrs/sprint)
|
|
205
|
+
- Weekly status report (2 hrs to write)
|
|
206
|
+
- Monthly review (4 hrs × 5 people = 20 hrs/month)
|
|
207
|
+
|
|
208
|
+
For each, ask:
|
|
209
|
+
- What happens if we stop?
|
|
210
|
+
- Can we reduce frequency?
|
|
211
|
+
- Can we reduce attendees?
|
|
212
|
+
- Can we reduce duration?
|
|
213
|
+
|
|
214
|
+
Often: Half the meetings, half the reports = more productive
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### Features
|
|
218
|
+
|
|
219
|
+
```markdown
|
|
220
|
+
## Via Negativa Product Strategy
|
|
221
|
+
|
|
222
|
+
Instead of roadmap of additions, create:
|
|
223
|
+
|
|
224
|
+
## Sunset List
|
|
225
|
+
| Feature | Usage | Decision | Timeline |
|
|
226
|
+
|---------|-------|----------|----------|
|
|
227
|
+
| Export to CSV | 0.5% | Remove | Q2 |
|
|
228
|
+
| Legacy API v1 | 2% | Deprecate | Q3 |
|
|
229
|
+
| Advanced filters | 3% | Simplify | Q2 |
|
|
230
|
+
|
|
231
|
+
## Maintenance Liberation
|
|
232
|
+
Removing 3 features frees 2 engineers for core work
|
|
233
|
+
|
|
234
|
+
## Simplicity Gains
|
|
235
|
+
- Fewer code paths to test
|
|
236
|
+
- Smaller attack surface
|
|
237
|
+
- Easier onboarding
|
|
238
|
+
- Faster development
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### Personal Productivity
|
|
242
|
+
|
|
243
|
+
```markdown
|
|
244
|
+
## Via Negativa for Focus
|
|
245
|
+
|
|
246
|
+
Don't add:
|
|
247
|
+
- More productivity apps
|
|
248
|
+
- More systems
|
|
249
|
+
- More commitments
|
|
250
|
+
|
|
251
|
+
Instead remove:
|
|
252
|
+
- Notifications
|
|
253
|
+
- Unnecessary meetings
|
|
254
|
+
- Low-value tasks
|
|
255
|
+
- Context switching
|
|
256
|
+
- Decision fatigue (reduce choices)
|
|
257
|
+
|
|
258
|
+
"Stop doing" list > "To do" list
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
### Architecture
|
|
262
|
+
|
|
263
|
+
```markdown
|
|
264
|
+
## Via Negativa Architecture Review
|
|
265
|
+
|
|
266
|
+
Before adding complexity, audit existing:
|
|
267
|
+
|
|
268
|
+
Services to consolidate:
|
|
269
|
+
- Microservice A and B do similar things → Merge
|
|
270
|
+
- Service C has one caller → Inline
|
|
271
|
+
|
|
272
|
+
Dependencies to remove:
|
|
273
|
+
- Library X is used for one function → Write function
|
|
274
|
+
- Framework Y is overkill → Use lighter alternative
|
|
275
|
+
|
|
276
|
+
Layers to eliminate:
|
|
277
|
+
- Abstraction that has one implementation → Remove
|
|
278
|
+
- API that wraps another API identically → Direct call
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
## Via Negativa Template
|
|
282
|
+
|
|
283
|
+
```markdown
|
|
284
|
+
# Via Negativa Analysis: [System/Process/Product]
|
|
285
|
+
|
|
286
|
+
## Current State
|
|
287
|
+
[Description of what exists]
|
|
288
|
+
|
|
289
|
+
## Candidates for Removal
|
|
290
|
+
|
|
291
|
+
### Category 1: Unused/Dead
|
|
292
|
+
| Element | Evidence of Non-Use | Removal Risk |
|
|
293
|
+
|---------|---------------------|--------------|
|
|
294
|
+
| | | |
|
|
295
|
+
|
|
296
|
+
### Category 2: Low-Value High-Cost
|
|
297
|
+
| Element | Value Provided | Maintenance Cost | Ratio |
|
|
298
|
+
|---------|---------------|------------------|-------|
|
|
299
|
+
| | | | |
|
|
300
|
+
|
|
301
|
+
### Category 3: Redundant
|
|
302
|
+
| Element | Duplicated By | Removal Path |
|
|
303
|
+
|---------|---------------|--------------|
|
|
304
|
+
| | | |
|
|
305
|
+
|
|
306
|
+
## Removal Priority
|
|
307
|
+
1. [Element] - [Why first]
|
|
308
|
+
2. [Element] - [Why second]
|
|
309
|
+
|
|
310
|
+
## Removal Plan
|
|
311
|
+
| Element | Week | Monitor | Rollback |
|
|
312
|
+
|---------|------|---------|----------|
|
|
313
|
+
| | | | |
|
|
314
|
+
|
|
315
|
+
## Expected Benefits
|
|
316
|
+
- Reduced complexity: [Measure]
|
|
317
|
+
- Freed resources: [Measure]
|
|
318
|
+
- Improved focus: [Measure]
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
## The Lindy Connection
|
|
322
|
+
|
|
323
|
+
Via Negativa aligns with Lindy:
|
|
324
|
+
- Old things that have survived removal attempts are robust
|
|
325
|
+
- New additions are fragile, unproven
|
|
326
|
+
- Subtracting recent additions is lower risk than adding new things
|
|
327
|
+
|
|
328
|
+
## Verification Checklist
|
|
329
|
+
|
|
330
|
+
- [ ] Asked "what can we remove?" before "what should we add?"
|
|
331
|
+
- [ ] Identified candidates for removal in multiple categories
|
|
332
|
+
- [ ] Evaluated usage/value of removal candidates
|
|
333
|
+
- [ ] Planned gradual removal with monitoring
|
|
334
|
+
- [ ] Considered second-order effects of removal
|
|
335
|
+
- [ ] Resisted the urge to add when subtraction would work
|
|
336
|
+
|
|
337
|
+
## Key Questions
|
|
338
|
+
|
|
339
|
+
- "What can we remove instead of add?"
|
|
340
|
+
- "What would happen if we stopped doing this?"
|
|
341
|
+
- "What's the maintenance cost of this existing thing?"
|
|
342
|
+
- "Is this complexity earning its keep?"
|
|
343
|
+
- "What should we stop doing?"
|
|
344
|
+
- "What would we not build if starting from scratch?"
|
|
345
|
+
|
|
346
|
+
## Taleb's Wisdom
|
|
347
|
+
|
|
348
|
+
"The first principle of iatrogenics: we do not need evidence of harm to claim that a treatment is harmful; we need evidence of benefit to claim it is not harmful."
|
|
349
|
+
|
|
350
|
+
Applied to software: We don't need evidence that a feature is actively harmful to remove it; we need evidence it provides benefit to keep it.
|
|
351
|
+
|
|
352
|
+
"Via Negativa is more powerful than Via Positiva: omission does less harm than commission."
|
|
353
|
+
|
|
354
|
+
Removing is safer than adding. Every addition has unknown side effects. Removal of recent additions reverts to a known-good state. When in doubt, subtract.
|
|
355
|
+
|
|
356
|
+
"The best way to live is to maximize the number of decisions not made."
|
|
357
|
+
|
|
358
|
+
Reduce decisions through simplification. Fewer features = fewer decisions to make. Fewer processes = fewer coordination points. Simpler is more robust.
|
|
@@ -1,58 +1,84 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* cli/install/postinstall.mjs
|
|
3
3
|
*
|
|
4
|
-
* runPostInstall() —
|
|
4
|
+
* runPostInstall() — bootstrap after npm install. Sets up the Claude Code
|
|
5
|
+
* config dir with the canonical Bizar agents + a starter settings.json, and
|
|
6
|
+
* installs Semble / Skills CLI as sidecars.
|
|
7
|
+
*
|
|
8
|
+
* Source paths resolve via `import.meta.url` so they work both when the
|
|
9
|
+
* package is extracted to `node_modules/@polderlabs/bizar/` (npm install)
|
|
10
|
+
* and when invoked from a local checkout (`node cli/bin.mjs install`).
|
|
11
|
+
*
|
|
12
|
+
* v10.7.2 fix: source paths previously used `PATHS.bizarHome + '/../config/'`
|
|
13
|
+
* which resolved to a nonexistent `~/.config/config/` (one level up from
|
|
14
|
+
* `BIZAR_HOME`, which is a runtime state dir, not the package source). After
|
|
15
|
+
* F-107 deleted the legacy `config/agents/` tree, the install couldn't find
|
|
16
|
+
* any agent files and crashed with ENOENT.
|
|
5
17
|
*/
|
|
6
18
|
|
|
7
19
|
import chalk from 'chalk';
|
|
8
|
-
import { existsSync, mkdirSync, copyFileSync } from 'node:fs';
|
|
20
|
+
import { existsSync, mkdirSync, copyFileSync, readdirSync } from 'node:fs';
|
|
9
21
|
import { execSync } from 'node:child_process';
|
|
10
|
-
import { join } from 'node:path';
|
|
22
|
+
import { join, dirname } from 'node:path';
|
|
23
|
+
import { fileURLToPath } from 'node:url';
|
|
11
24
|
import { resolveClaudeDir, PATHS } from './paths.mjs';
|
|
12
25
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
26
|
+
/** Package root — `node_modules/@polderlabs/bizar/` or the checkout root. */
|
|
27
|
+
const PACKAGE_ROOT = join(dirname(fileURLToPath(import.meta.url)), '..', '..');
|
|
28
|
+
|
|
29
|
+
/** Source paths, all relative to the package root. */
|
|
30
|
+
const SRC_AGENTS_DIR = join(PACKAGE_ROOT, '.claude', 'agents');
|
|
31
|
+
const SRC_SETTINGS_FILE = join(PACKAGE_ROOT, '.claude', 'settings.json');
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Discover every agent .md shipped in `.claude/agents/`. Replaces the prior
|
|
35
|
+
* hardcoded AGENT_FILES list (which omitted kevin and brad and broke
|
|
36
|
+
* whenever a new agent was added).
|
|
37
|
+
*/
|
|
38
|
+
function listShippedAgents() {
|
|
39
|
+
if (!existsSync(SRC_AGENTS_DIR)) return [];
|
|
40
|
+
return readdirSync(SRC_AGENTS_DIR).filter(f => f.endsWith('.md'));
|
|
41
|
+
}
|
|
19
42
|
|
|
20
43
|
/**
|
|
21
44
|
* Post-install bootstrap: settings.json template, agents, Semble, Skills CLI.
|
|
22
45
|
* Called by the npm postinstall hook.
|
|
23
46
|
*/
|
|
24
47
|
export async function runPostInstall() {
|
|
25
|
-
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
if (!existsSync(dest)) {
|
|
30
|
-
if (existsSync(templateSrc)) {
|
|
48
|
+
// 1. settings.json — copy template if user has none yet.
|
|
49
|
+
const destSettings = join(resolveClaudeDir(), 'settings.json');
|
|
50
|
+
if (!existsSync(destSettings)) {
|
|
51
|
+
if (existsSync(SRC_SETTINGS_FILE)) {
|
|
31
52
|
mkdirSync(resolveClaudeDir(), { recursive: true });
|
|
32
|
-
copyFileSync(
|
|
53
|
+
copyFileSync(SRC_SETTINGS_FILE, destSettings);
|
|
33
54
|
console.log(' ✓ settings.json bootstrapped from package template');
|
|
55
|
+
} else {
|
|
56
|
+
console.warn(' ⚠ settings.json template not found at', SRC_SETTINGS_FILE);
|
|
34
57
|
}
|
|
35
58
|
}
|
|
36
59
|
|
|
37
|
-
//
|
|
38
|
-
|
|
39
|
-
if (!env.exists) {
|
|
60
|
+
// 2. Make sure Claude config dir exists.
|
|
61
|
+
if (!existsSync(resolveClaudeDir())) {
|
|
40
62
|
mkdirSync(resolveClaudeDir(), { recursive: true });
|
|
41
63
|
console.log(`BizarHarness: created ${resolveClaudeDir()}/`);
|
|
42
64
|
}
|
|
43
65
|
|
|
66
|
+
// 3. Copy agent files. Skip ones the user already has (don't clobber).
|
|
44
67
|
mkdirSync(PATHS.agentsDir, { recursive: true });
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
68
|
+
const agents = listShippedAgents();
|
|
69
|
+
if (agents.length === 0) {
|
|
70
|
+
console.warn(`BizarHarness: no agent files found at ${SRC_AGENTS_DIR} — package is broken.`);
|
|
71
|
+
}
|
|
72
|
+
for (const file of agents) {
|
|
73
|
+
const src = join(SRC_AGENTS_DIR, file);
|
|
48
74
|
const dst = join(PATHS.agentsDir, file);
|
|
49
75
|
if (!existsSync(dst)) {
|
|
50
76
|
copyFileSync(src, dst);
|
|
51
77
|
}
|
|
52
78
|
}
|
|
53
|
-
console.log(
|
|
79
|
+
console.log(`BizarHarness: ${agents.length} agent(s) installed.`);
|
|
54
80
|
|
|
55
|
-
// Install Semble
|
|
81
|
+
// 4. Install Semble (code search MCP).
|
|
56
82
|
const seemeCmd = (cmd) => {
|
|
57
83
|
try {
|
|
58
84
|
execSync(`command -v ${cmd}`, { stdio: ['ignore', 'pipe', 'ignore'] });
|
|
@@ -80,7 +106,7 @@ export async function runPostInstall() {
|
|
|
80
106
|
console.log('BizarHarness: Semble ready.');
|
|
81
107
|
}
|
|
82
108
|
|
|
83
|
-
// Install Skills CLI
|
|
109
|
+
// 5. Install Skills CLI.
|
|
84
110
|
const skillsPresent = seemeCmd('skills');
|
|
85
111
|
if (!skillsPresent) {
|
|
86
112
|
console.log('BizarHarness: installing Skills CLI...');
|
|
@@ -94,7 +120,7 @@ export async function runPostInstall() {
|
|
|
94
120
|
console.log('BizarHarness: Skills CLI ready.');
|
|
95
121
|
}
|
|
96
122
|
|
|
97
|
-
// Install core skill pack
|
|
123
|
+
// 6. Install core skill pack.
|
|
98
124
|
console.log('BizarHarness: installing core skills...');
|
|
99
125
|
try {
|
|
100
126
|
execSync('skills add vercel-labs/skills --all -y', { stdio: 'pipe', timeout: 60000 });
|
|
@@ -103,9 +129,9 @@ export async function runPostInstall() {
|
|
|
103
129
|
console.log('BizarHarness: core skill install skipped — run `skills add vercel-labs/skills --all -y` manually.');
|
|
104
130
|
}
|
|
105
131
|
|
|
106
|
-
// Install Bizar plugin
|
|
132
|
+
// 7. Install Bizar plugin.
|
|
107
133
|
const { installPluginFromGlobal } = await import('./plugin.mjs');
|
|
108
134
|
await installPluginFromGlobal();
|
|
109
135
|
|
|
110
136
|
console.log('Run `bizar` for interactive setup.');
|
|
111
|
-
}
|
|
137
|
+
}
|