@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.
Files changed (142) hide show
  1. package/.claude/agents/_shared/AGENT_BASELINE.md +266 -0
  2. package/.claude/agents/_shared/CLAUDE_TOOLS.md +412 -0
  3. package/.claude/agents/_shared/SKILLS.md +109 -0
  4. package/.claude/agents/brand-designer.md +55 -0
  5. package/.claude/agents/exec-assistant.md +34 -0
  6. package/.claude/agents/help-desk.md +44 -0
  7. package/.claude/agents/it-lead.md +53 -0
  8. package/.claude/agents/knowledge-manager.md +49 -0
  9. package/.claude/agents/office-coordinator.md +39 -0
  10. package/.claude/agents/office-greeter.md +53 -0
  11. package/.claude/agents/office-manager.md +287 -0
  12. package/.claude/agents/principal-engineer.md +58 -0
  13. package/.claude/agents/qa-reviewer.md +51 -0
  14. package/.claude/agents/research-analyst.md +53 -0
  15. package/.claude/agents/senior-engineer.md +55 -0
  16. package/.claude/agents/support-tech.md +87 -0
  17. package/.claude/agents/vp-engineering.md +54 -0
  18. package/.claude/commands/audit.md +48 -0
  19. package/.claude/commands/bizar.md +22 -0
  20. package/.claude/commands/cron.md +36 -0
  21. package/.claude/commands/explain.md +17 -0
  22. package/.claude/commands/goal.md +99 -0
  23. package/.claude/commands/init.md +15 -0
  24. package/.claude/commands/learn.md +46 -0
  25. package/.claude/commands/plan.md +35 -0
  26. package/.claude/commands/plow-through.md +50 -0
  27. package/.claude/commands/pr-review.md +49 -0
  28. package/.claude/commands/setup-provider.md +96 -0
  29. package/.claude/commands/spec.md +47 -0
  30. package/.claude/commands/sprint.md +43 -0
  31. package/.claude/commands/tailscale-serve.md +100 -0
  32. package/.claude/commands/team.md +132 -0
  33. package/.claude/commands/test.md +62 -0
  34. package/.claude/commands/validate.md +68 -0
  35. package/.claude/commands/visual-plan.md +24 -0
  36. package/.claude/hooks/README.md +108 -0
  37. package/.claude/hooks/__tests__/pretooluse-editwrite.test.mjs +146 -0
  38. package/.claude/hooks/__tests__/sessionend-recall.test.mjs +256 -0
  39. package/.claude/hooks/__tests__/sessionstart-prime.test.mjs +325 -0
  40. package/.claude/hooks/__tests__/thinking-route.test.mjs +319 -0
  41. package/.claude/hooks/auto-instinct.sh +81 -0
  42. package/.claude/hooks/learning-extract.mjs +92 -0
  43. package/.claude/hooks/post-merge-audit.sh +93 -0
  44. package/.claude/hooks/posttooluse-editwrite.mjs +91 -0
  45. package/.claude/hooks/pretooluse-bash.mjs +87 -0
  46. package/.claude/hooks/pretooluse-editwrite.mjs +117 -0
  47. package/.claude/hooks/sessionend-recall.mjs +384 -0
  48. package/.claude/hooks/sessionstart-prime.mjs +278 -0
  49. package/.claude/hooks/thinking-route.mjs +314 -0
  50. package/.claude/hooks/worker-suggest.mjs +110 -0
  51. package/.claude/settings.json +167 -0
  52. package/.claude/skills/9router/SKILL.md +80 -0
  53. package/.claude/skills/9router-chat/SKILL.md +73 -0
  54. package/.claude/skills/9router-embeddings/SKILL.md +69 -0
  55. package/.claude/skills/9router-image/SKILL.md +86 -0
  56. package/.claude/skills/9router-stt/SKILL.md +79 -0
  57. package/.claude/skills/9router-tts/SKILL.md +80 -0
  58. package/.claude/skills/9router-web-fetch/SKILL.md +99 -0
  59. package/.claude/skills/9router-web-search/SKILL.md +91 -0
  60. package/.claude/skills/agent-browser/SKILL.md +64 -0
  61. package/.claude/skills/bizar/README.md +9 -0
  62. package/.claude/skills/bizar/SKILL.md +447 -0
  63. package/.claude/skills/cpp-coding-standards/README.md +28 -0
  64. package/.claude/skills/cpp-coding-standards/SKILL.md +634 -0
  65. package/.claude/skills/cpp-coding-standards/references/concurrency.md +320 -0
  66. package/.claude/skills/cpp-coding-standards/references/error-handling.md +229 -0
  67. package/.claude/skills/cpp-coding-standards/references/memory-safety.md +216 -0
  68. package/.claude/skills/cpp-coding-standards/references/modern-idioms.md +282 -0
  69. package/.claude/skills/cpp-coding-standards/references/review-checklist.md +96 -0
  70. package/.claude/skills/cpp-testing/README.md +28 -0
  71. package/.claude/skills/cpp-testing/SKILL.md +304 -0
  72. package/.claude/skills/cpp-testing/references/coverage.md +370 -0
  73. package/.claude/skills/cpp-testing/references/framework-compare.md +175 -0
  74. package/.claude/skills/cpp-testing/references/host-test-for-embedded.md +499 -0
  75. package/.claude/skills/cpp-testing/references/mocking.md +364 -0
  76. package/.claude/skills/cpp-testing/references/tdd-workflow.md +308 -0
  77. package/.claude/skills/cubesandbox/SKILL.md +148 -0
  78. package/.claude/skills/de-sloppify/SKILL.md +38 -0
  79. package/.claude/skills/de-sloppify/cleanup.mjs +253 -0
  80. package/.claude/skills/de-sloppify/cleanup.test.mjs +189 -0
  81. package/.claude/skills/embedded-esp-idf/README.md +41 -0
  82. package/.claude/skills/embedded-esp-idf/SKILL.md +439 -0
  83. package/.claude/skills/embedded-esp-idf/references/freertos-patterns.md +214 -0
  84. package/.claude/skills/embedded-esp-idf/references/host-tests.md +164 -0
  85. package/.claude/skills/embedded-esp-idf/references/idf-py-commands.md +157 -0
  86. package/.claude/skills/embedded-esp-idf/references/kconfig.md +159 -0
  87. package/.claude/skills/embedded-esp-idf/references/logging-discipline.md +118 -0
  88. package/.claude/skills/embedded-esp-idf/references/memory-and-iram.md +137 -0
  89. package/.claude/skills/embedded-esp-idf/references/nvs.md +121 -0
  90. package/.claude/skills/embedded-esp-idf/references/packed-structs.md +192 -0
  91. package/.claude/skills/embedded-esp-idf/scripts/idf_env.sh +47 -0
  92. package/.claude/skills/embedded-esp-idf/scripts/size_check.sh +77 -0
  93. package/.claude/skills/glyph/SKILL.md +163 -0
  94. package/.claude/skills/harness-engineering/SKILL.md +142 -0
  95. package/.claude/skills/lightrag/SKILL.md +81 -0
  96. package/.claude/skills/memory-protocol/SKILL.md +105 -0
  97. package/.claude/skills/obsidian/SKILL.md +306 -0
  98. package/.claude/skills/read-the-damn-docs/SKILL.md +113 -0
  99. package/.claude/skills/self-improvement/SKILL.md +64 -0
  100. package/.claude/skills/skillopt/SKILL.md +129 -0
  101. package/.claude/skills/thinking-archetypes/SKILL.md +90 -0
  102. package/.claude/skills/thinking-bayesian/SKILL.md +267 -0
  103. package/.claude/skills/thinking-bounded-rationality/SKILL.md +406 -0
  104. package/.claude/skills/thinking-circle-of-competence/SKILL.md +216 -0
  105. package/.claude/skills/thinking-cynefin/SKILL.md +70 -0
  106. package/.claude/skills/thinking-debiasing/SKILL.md +192 -0
  107. package/.claude/skills/thinking-dual-process/SKILL.md +282 -0
  108. package/.claude/skills/thinking-effectuation/SKILL.md +366 -0
  109. package/.claude/skills/thinking-feedback-loops/SKILL.md +464 -0
  110. package/.claude/skills/thinking-fermi-estimation/SKILL.md +263 -0
  111. package/.claude/skills/thinking-first-principles/SKILL.md +167 -0
  112. package/.claude/skills/thinking-five-whys-plus/SKILL.md +139 -0
  113. package/.claude/skills/thinking-inversion/SKILL.md +195 -0
  114. package/.claude/skills/thinking-jobs-to-be-done/SKILL.md +363 -0
  115. package/.claude/skills/thinking-kepner-tregoe/SKILL.md +154 -0
  116. package/.claude/skills/thinking-leverage-points/SKILL.md +390 -0
  117. package/.claude/skills/thinking-lindy-effect/SKILL.md +331 -0
  118. package/.claude/skills/thinking-map-territory/SKILL.md +111 -0
  119. package/.claude/skills/thinking-margin-of-safety/SKILL.md +330 -0
  120. package/.claude/skills/thinking-model-combination/SKILL.md +406 -0
  121. package/.claude/skills/thinking-model-router/SKILL.md +360 -0
  122. package/.claude/skills/thinking-model-selection/SKILL.md +341 -0
  123. package/.claude/skills/thinking-occams-razor/SKILL.md +129 -0
  124. package/.claude/skills/thinking-ooda/SKILL.md +127 -0
  125. package/.claude/skills/thinking-opportunity-cost/SKILL.md +360 -0
  126. package/.claude/skills/thinking-pre-mortem/SKILL.md +170 -0
  127. package/.claude/skills/thinking-probabilistic/SKILL.md +324 -0
  128. package/.claude/skills/thinking-red-team/SKILL.md +142 -0
  129. package/.claude/skills/thinking-regret-minimization/SKILL.md +335 -0
  130. package/.claude/skills/thinking-reversibility/SKILL.md +326 -0
  131. package/.claude/skills/thinking-scientific-method/SKILL.md +162 -0
  132. package/.claude/skills/thinking-second-order/SKILL.md +184 -0
  133. package/.claude/skills/thinking-socratic/SKILL.md +198 -0
  134. package/.claude/skills/thinking-steel-manning/SKILL.md +332 -0
  135. package/.claude/skills/thinking-systems/SKILL.md +238 -0
  136. package/.claude/skills/thinking-theory-of-constraints/SKILL.md +338 -0
  137. package/.claude/skills/thinking-thought-experiment/SKILL.md +354 -0
  138. package/.claude/skills/thinking-triz/SKILL.md +171 -0
  139. package/.claude/skills/thinking-via-negativa/SKILL.md +358 -0
  140. package/cli/install/postinstall.mjs +54 -28
  141. package/cli/install/postinstall.test.mjs +98 -0
  142. 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() — moved verbatim from cli/install.mjs (original ~95 lines).
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
- const AGENT_FILES = [
14
- 'mike.md', 'janet.md', 'susan.md', 'pam.md',
15
- 'greg.md', 'brenda.md', 'steve.md', 'todd.md', 'brad.md',
16
- 'karen.md', 'carl.md', 'linda.md',
17
- 'oscar.md',
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
- const dest = join(resolveClaudeDir(), 'settings.json');
26
- const templateSrc = join(PATHS.bizarHome, '..', 'config', 'settings.json');
27
-
28
- // Copy settings.json template if not exists
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(templateSrc, dest);
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
- // Ensure Claude config dir exists
38
- const env = { exists: existsSync(resolveClaudeDir()) };
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
- for (const file of AGENT_FILES) {
47
- const src = join(PATHS.bizarHome, '..', 'config', 'agents', file);
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('BizarHarness: agents installed.');
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
+ }