@keighleykodric/weeve 0.1.0
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/.github/SECURITY.md +22 -0
- package/GOVERNANCE.md +173 -0
- package/LICENSE +21 -0
- package/README.md +138 -0
- package/WORKFLOW.md +354 -0
- package/bin/weeve.js +143 -0
- package/docs/shared/SHIP-GATE.md +113 -0
- package/docs/shared/engineering-pack-contract.md +94 -0
- package/docs/shared/id-prefix-reference.md +235 -0
- package/docs/shared/idea-intake-pattern.md +99 -0
- package/docs/shared/lane-conventions.md +207 -0
- package/docs/shared/recommendations-schema.md +363 -0
- package/package.json +14 -0
package/WORKFLOW.md
ADDED
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
# WORKFLOW.md — Cross-pack rhythm
|
|
2
|
+
|
|
3
|
+
How ideas move from raw capture through to shipped code. This is the canonical doc for the cross-pack workflow. All sibling pack READMEs cite this file.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## The rhythm in one sentence
|
|
8
|
+
|
|
9
|
+
> Capture raw ideas in your preferred tool. Each lane's intake skill routes them. Lanes process their slice. Recommendations accumulate. Pilot synthesizes and ships.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## The full flow
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
Your capture tool (notes, daily log, Obsidian, etc.)
|
|
17
|
+
↓ raw capture
|
|
18
|
+
*-intake skills (per pack)
|
|
19
|
+
↓ scoped rows with stable IDs
|
|
20
|
+
Pack main skills (primitives, zones, layers, campaigns)
|
|
21
|
+
↓ structured findings
|
|
22
|
+
<pack>-recommendations.md (the recommendations file)
|
|
23
|
+
↓ one file per pack in docs/<pack>/
|
|
24
|
+
/pilot-roadmap
|
|
25
|
+
↓ merged, tiered, conflict-surfaced
|
|
26
|
+
docs/pilot/pilot-roadmap.md
|
|
27
|
+
↓
|
|
28
|
+
/pilot-ship
|
|
29
|
+
↓ N items per day, guardrails, PR
|
|
30
|
+
shipped code
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## Step by step
|
|
36
|
+
|
|
37
|
+
### Step 1 — Raw capture
|
|
38
|
+
|
|
39
|
+
Every idea, observation, or strategic thought gets captured first — in whatever tool you use. A daily note, an Obsidian vault, a plain text file. The goal is capture, not routing — get it down before it evaporates.
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
User-to-user referral program — tight community, peer vouching,
|
|
43
|
+
low CAC. Maps to Compass doctrine + Layers+ Layer 4-7 + Maven channel strategy.
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
This goes in your project notes. You can also skip straight to Step 2 and capture directly via intake skills.
|
|
47
|
+
|
|
48
|
+
> **Tip:** [Claudette](https://github.com/keighleykodric/claudette) is a personal CLI companion built for this workflow — `/research`, `/todo`, `/focus` commands that feed naturally into Weeve's intake skills. Not required, but designed to pair well.
|
|
49
|
+
|
|
50
|
+
### Step 2 — Route to lanes via intake skills
|
|
51
|
+
|
|
52
|
+
Once captured, route the idea to the lanes that own slices of it. Each lane has an intake skill that accepts raw intent — paste in whatever context you have — and writes a scoped row with a stable ID.
|
|
53
|
+
|
|
54
|
+
**What to include with your intake:** The more context you provide, the better the intake skill can scope the work. Include any of:
|
|
55
|
+
- The idea or observation in your own words
|
|
56
|
+
- Links to relevant docs, tickets, or threads
|
|
57
|
+
- File paths or folder references in your codebase
|
|
58
|
+
- Screenshots, error messages, or user feedback
|
|
59
|
+
- Ticket/issue IDs from your project tracker
|
|
60
|
+
|
|
61
|
+
The intake skill will ask clarifying questions if it needs more.
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
/compass-intake → CI-prefixed row → routes to compass-position / compass-move
|
|
65
|
+
/layers-plus-intake → LI-prefixed row → routes to layers-plus-strategy / surface
|
|
66
|
+
/ally-intake → AI-prefixed row → routes to ally zone audit
|
|
67
|
+
/rubric-intake → RI-prefixed row → routes to rubric-components / patterns
|
|
68
|
+
/maven-intake → MI-prefixed row → routes to maven-campaign-plan / deliverable
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
One idea may produce intake rows in multiple packs if it spans strategy, product, and channel.
|
|
72
|
+
|
|
73
|
+
### Step 3 — Packs process their slice
|
|
74
|
+
|
|
75
|
+
Each pack's main skills process the intake rows. They write findings to their output files under `docs/<pack>/` in the consumer project.
|
|
76
|
+
|
|
77
|
+
- Compass primitives + lenses → findings in `compass-*.md`
|
|
78
|
+
- Layers+ layers → findings in `layers-plus-*.md`
|
|
79
|
+
- Ally zones → findings in `ally-*.md`
|
|
80
|
+
- Rubric zones → findings in `rubric-*.md`
|
|
81
|
+
- Maven phases → findings in `maven-*.md`
|
|
82
|
+
|
|
83
|
+
Each pack is autonomous — it doesn't need the others to run.
|
|
84
|
+
|
|
85
|
+
### Step 4 — Recommendations: the shared output format
|
|
86
|
+
|
|
87
|
+
Each pack writes a `<pack>-recommendations.md` file — the recommendations file Pilot reads. This file is the distilled, tiered, prioritized output of all the pack's work. It's the only file Pilot needs from each pack.
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
docs/compass/compass-recommendations.md
|
|
91
|
+
docs/layers-plus/layers-plus-recommendations.md
|
|
92
|
+
docs/ally/ally-recommendations.md
|
|
93
|
+
docs/rubric/rubric-recommendations.md
|
|
94
|
+
docs/maven/maven-recommendations.md
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Step 5 — Pilot synthesizes: /pilot-roadmap
|
|
98
|
+
|
|
99
|
+
`/pilot-roadmap` reads all `<pack>-recommendations.md` files present, merges them into one prioritized backlog, surfaces cross-pack conflicts, and writes `docs/pilot/pilot-roadmap.md`.
|
|
100
|
+
|
|
101
|
+
Items are tiered: Now → Next → Watch. Cross-pack conflicts are surfaced explicitly — Pilot does not silently pick a side.
|
|
102
|
+
|
|
103
|
+
### Step 6 — Pilot ships: /pilot-ship
|
|
104
|
+
|
|
105
|
+
`/pilot-ship` picks N items from the roadmap, executes against guardrails (constraints, design system health, accessibility health), and opens or updates a PR.
|
|
106
|
+
|
|
107
|
+
One daily batch, one check-in, one PR.
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## The worked example — user-to-user referral
|
|
112
|
+
|
|
113
|
+
A strategic idea decomposed across the full system. This is the canonical illustration of how a cross-cutting idea flows. The route-then-decompose pattern is identical for any cross-functional setting: a SaaS team routing a growth initiative across strategy and delivery, a consulting firm coordinating an engagement across strategy and operations, a nonprofit aligning programme design with communications and fundraising.
|
|
114
|
+
|
|
115
|
+
### The idea
|
|
116
|
+
|
|
117
|
+
Existing users send a personalized referral link to a peer who isn't on the platform. Link carries context (referrer ID, prefilled profile, voucher message). Recipient lands on a guided signup that knows who sent them. Referring user sees status updates. Reward: free month per successful referral.
|
|
118
|
+
|
|
119
|
+
### Why it spans multiple packs
|
|
120
|
+
|
|
121
|
+
| Pack | Its slice |
|
|
122
|
+
| --- | --- |
|
|
123
|
+
| Compass | Strategic bet: is referral the right growth wedge? Which doctrine supports it? |
|
|
124
|
+
| Layers+ | Product surface: how does referral become a first-class product object? |
|
|
125
|
+
| Maven | Channel: how do we announce the program and sustain referral messaging? |
|
|
126
|
+
|
|
127
|
+
### How it flows
|
|
128
|
+
|
|
129
|
+
| Step | Tool | What happens |
|
|
130
|
+
| --- | --- | --- |
|
|
131
|
+
| 1 | Your notes / capture tool | Raw capture: "User-to-user referral program — tight community, peer vouching, low CAC." Lands in project notes. |
|
|
132
|
+
| 2 | `/compass-intake` | Strategic slice captured: "Codify referral-as-growth-wedge as doctrine; specific move = build user-to-user invite mechanic." Writes CI-prefixed row. |
|
|
133
|
+
| 3 | `/compass-doctrine`, `/compass-move` | Process intake. Writes doctrine row (D-prefixed) and move row (M-prefixed). |
|
|
134
|
+
| 4 | `/layers-plus-intake` | Product slice: "Build referral as first-class product surface — Layer 4 strategic bet, Layers 5-7 implementation." Writes LI-prefixed row. |
|
|
135
|
+
| 5 | `/layers-plus-strategy`, `/layers-plus-conceptual-model`, `/layers-plus-interaction-flow`, `/layers-plus-surface` | Each layer processes its scoped rows. |
|
|
136
|
+
| 6 | `/maven-intake` | Channel slice: "Plan referral program announcement + ongoing referral messaging." Writes MI-prefixed row. |
|
|
137
|
+
| 7 | `/maven-campaign-plan`, `/maven-deliverable` | Process intake. Writes campaign plan and deliverable rows. |
|
|
138
|
+
| 8 | `/compass-recommendations`, `/layers-plus-recommendations`, `/maven-recommendations` | Each pack writes its prioritized recommendations. |
|
|
139
|
+
| 9 | `/pilot-roadmap` | Reads all three recommendations files. Synthesizes one backlog. Referral shows as one tracked initiative with strategy, product, and channel slices. |
|
|
140
|
+
| 10 | `/pilot-ship` | Picks N items, executes, opens PR. |
|
|
141
|
+
|
|
142
|
+
### Key pattern
|
|
143
|
+
|
|
144
|
+
Single-pack ideas exist ("add a tooltip on the time-window picker" → Layers+ only). Most strategic ideas don't. The route-then-decompose pattern handles both:
|
|
145
|
+
|
|
146
|
+
- A tooltip change is one intake row.
|
|
147
|
+
- A growth wedge is six.
|
|
148
|
+
|
|
149
|
+
**Heuristic:** if you're not sure where it lands, ask "what's the *highest* tier this touches?" Start there and let it cascade. The referral idea's highest tier is Compass (strategic bet about *how we grow*). Start there.
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## First-run order
|
|
154
|
+
|
|
155
|
+
When setting up the system from scratch, run packs in this order. Each step produces inputs that make the next step richer.
|
|
156
|
+
|
|
157
|
+
```
|
|
158
|
+
1. Compass — establish strategic position and growth doctrine
|
|
159
|
+
2. Layers+ — evaluate product design against that strategy
|
|
160
|
+
3. Felt — audit user research posture; feeds observed-behaviour and user-needs
|
|
161
|
+
4. Ally — audit accessibility on the existing surface
|
|
162
|
+
5. Rubric — audit design system health
|
|
163
|
+
6. Maven — develop marketing positioning and brand voice
|
|
164
|
+
7. Pitch — audit revenue health and GTM execution (reads Maven positioning)
|
|
165
|
+
8. Pilot — synthesize all recommendations files
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
**Why this order:** Compass sets the strategic frame; Layers+ uses it. Felt runs after Layers+ because its research output (felt-research.md, felt-personas.md) feeds directly into layers-plus-observed-behaviour and layers-plus-user-needs confidence ratings — run Layers+ first to know what research questions are open, then run Felt to answer them. Ally and Rubric are parallel (order between them doesn't matter). Maven reads Compass and Layers+ outputs for positioning context. Pitch runs after Maven — it checks whether the positioning is landing in deals and co-owns the Marketing→Sales lead handoff. Pilot reads all. (Forge/Helm/Verify/Guard can run in parallel after Layers+; see PITCH-LANE.md for the full 11-lane sequencing.)
|
|
169
|
+
|
|
170
|
+
Packs can be run in any order — this sequence is the recommended path for a first full run, not a hard dependency.
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## Within-pack sequences
|
|
175
|
+
|
|
176
|
+
Cross-pack order is in the First-run order section above. Within each pack, skills run in a defined sequence. Steps marked _(optional)_ can be skipped on first run and added on re-runs or when the area is relevant.
|
|
177
|
+
|
|
178
|
+
### Compass
|
|
179
|
+
|
|
180
|
+
```
|
|
181
|
+
/compass-intro — onboarding; load once per project
|
|
182
|
+
/compass-orient — broad diagnostic; shows which primitives are missing
|
|
183
|
+
/compass-position — what you have, who your customers are, which markets
|
|
184
|
+
/compass-context — external forces, trends, competitor moves
|
|
185
|
+
/compass-doctrine — operating principles and anti-patterns
|
|
186
|
+
/compass-choice — active strategic choices and decisions
|
|
187
|
+
/compass-move — strategic moves in flight
|
|
188
|
+
Lens skills (pick relevant ones):
|
|
189
|
+
/compass-wardley — Wardley map; evolution and ecosystem position
|
|
190
|
+
/compass-jtbd — Jobs-to-be-done; primary market and outcomes
|
|
191
|
+
/compass-7powers — 7 Powers; defensibility check
|
|
192
|
+
/compass-market-research — (optional) external signal probe
|
|
193
|
+
/compass-recommendations — tiered move list from all lens outputs
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### Layers+
|
|
197
|
+
|
|
198
|
+
```
|
|
199
|
+
/layers-plus-intro — onboarding; load once per project
|
|
200
|
+
/layers-plus-orient — broad diagnostic across all seven layers
|
|
201
|
+
/layers-plus-user-needs — formalise user needs and job stories
|
|
202
|
+
/layers-plus-domain — domain concepts, terminology, constraints
|
|
203
|
+
/layers-plus-conceptual-model — product objects, relationships, key attributes
|
|
204
|
+
/layers-plus-interaction-flow — task flows, decision points, failure paths
|
|
205
|
+
/layers-plus-surface — screens, UI surfaces, component inventory
|
|
206
|
+
/layers-plus-observed-behaviour — (optional) user research synthesis
|
|
207
|
+
/layers-plus-strategy — opportunity map tied to user needs
|
|
208
|
+
/layers-plus-recommendations — prioritised improvement list
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### Felt
|
|
212
|
+
|
|
213
|
+
```
|
|
214
|
+
/felt-intro — onboarding; load once per project
|
|
215
|
+
/felt-orient — broad diagnostic across all seven research zones
|
|
216
|
+
Zone skills (run the zone with the biggest gap first):
|
|
217
|
+
/felt-research — generative research coverage audit
|
|
218
|
+
/felt-testing — usability and evaluative test coverage audit
|
|
219
|
+
/felt-data — analytics instrumentation and funnel audit
|
|
220
|
+
/felt-journey — journey map coverage and pain point catalogue
|
|
221
|
+
/felt-personas — segment definitions and JTBD validity audit
|
|
222
|
+
/felt-synthesis — affinity maps, themes, HMW statements
|
|
223
|
+
/felt-feedback — NPS, CSAT, support tickets, app reviews
|
|
224
|
+
Ad hoc:
|
|
225
|
+
/felt-intake — capture research requests and observations any time
|
|
226
|
+
Output (on demand from zone data):
|
|
227
|
+
/felt-report — stakeholder-ready research readout
|
|
228
|
+
/felt-recommendations — tiered research gap list (Pilot reads this)
|
|
229
|
+
Maintenance:
|
|
230
|
+
/felt-triage — walk open findings; close / defer / dismiss
|
|
231
|
+
/felt-check — verify closed findings are actually resolved
|
|
232
|
+
/felt-tickets — push findings to task management
|
|
233
|
+
/felt-dashboard — HTML visual status dashboard
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### Ally
|
|
237
|
+
|
|
238
|
+
```
|
|
239
|
+
/ally-intro — onboarding and zone framework; load once per project
|
|
240
|
+
/ally-map — route inventory + broad pass across all 7 zones
|
|
241
|
+
/ally-landscape — bottleneck analysis; recommends which zone to address next
|
|
242
|
+
Zone skills (run the zones landscape recommends first):
|
|
243
|
+
/ally-bones — semantic structure, landmarks, relationships
|
|
244
|
+
/ally-flow — keyboard nav, focus management, wayfinding
|
|
245
|
+
/ally-signal — contrast, text alternatives, media
|
|
246
|
+
/ally-control — input, touch, pointer, errors, forms
|
|
247
|
+
/ally-ease — time limits, language, reading level
|
|
248
|
+
/ally-calm — flashing, harmful motion, sensory overwhelm
|
|
249
|
+
/ally-reach — AT compatibility, screen readers, name/role/value
|
|
250
|
+
Output (on demand from audit data):
|
|
251
|
+
/ally-plan — ally-recommendations.md (Pilot reads this)
|
|
252
|
+
/ally-status — team health snapshot
|
|
253
|
+
/ally-report — org/leadership progress view
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
### Rubric
|
|
257
|
+
|
|
258
|
+
```
|
|
259
|
+
/rubric-intro — onboarding; load once per project
|
|
260
|
+
/rubric-gap [topic] — (optional) trace a gap cascade before the zone audits
|
|
261
|
+
Zone audits (run in order; each builds on the last):
|
|
262
|
+
/rubric-tokens — foundations: CSS tokens, colour, spacing
|
|
263
|
+
/rubric-components — component inventory and conformance
|
|
264
|
+
/rubric-patterns — layout patterns, page templates
|
|
265
|
+
/rubric-voice — copy tone, vocabulary, Tier 1/2/3 conventions
|
|
266
|
+
/rubric-audit — full sweep across all four zones
|
|
267
|
+
/rubric-recommendations — prioritised system improvements (Pilot reads this)
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
### Maven
|
|
271
|
+
|
|
272
|
+
```
|
|
273
|
+
/maven-intake — route raw observations to Maven; writes stable IDs
|
|
274
|
+
/maven-positioning — ICP, problem statement, unique attribute
|
|
275
|
+
/maven-brand-voice — tone, vocabulary, voice rules
|
|
276
|
+
/maven-channel-monitor — (optional) monitor live channel signals
|
|
277
|
+
/maven-campaign-plan — campaign design for a specific motion
|
|
278
|
+
Deliverables (on demand):
|
|
279
|
+
/maven-deliverable — one-pager, case study, or other artifact
|
|
280
|
+
/maven-social — platform-specific social posts
|
|
281
|
+
/maven-email — email sequence
|
|
282
|
+
/maven-battlecard — competitive battlecard
|
|
283
|
+
/maven-seo — keyword and content gap analysis
|
|
284
|
+
/maven-recommendations — prioritised marketing improvements (Pilot reads this)
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
### Pitch
|
|
288
|
+
|
|
289
|
+
```
|
|
290
|
+
/pitch-intake — route raw sales observations (deals, objections, patterns)
|
|
291
|
+
/pitch-orient — diagnostic sweep; surfaces bottleneck zone
|
|
292
|
+
Zone audits (run weekly or on trigger):
|
|
293
|
+
/pitch-pipeline — stage distribution, velocity, stall rate, coverage
|
|
294
|
+
/pitch-icp — deal-level ICP fit and qualification discipline
|
|
295
|
+
/pitch-conversion — stage-to-stage drop-off, deal size, time-to-close
|
|
296
|
+
/pitch-competitive — win/loss patterns, battlecard accuracy
|
|
297
|
+
/pitch-outreach — sequence performance, channel mix, positioning alignment
|
|
298
|
+
/pitch-proposal — discovery quality, demo effectiveness, reference coverage
|
|
299
|
+
/pitch-pricing — discount discipline, pricing floor, pricing power
|
|
300
|
+
/pitch-leads — marketing → sales handoff (co-owned with Maven)
|
|
301
|
+
/pitch-forecast — commit-to-close rate, methodology health
|
|
302
|
+
/pitch-handoff — sales → CS handoff quality, early churn indicators
|
|
303
|
+
/pitch-recommendations — prioritised sales moves (Pilot reads this)
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
---
|
|
307
|
+
|
|
308
|
+
## Cadence
|
|
309
|
+
|
|
310
|
+
| Pack | Typical cadence |
|
|
311
|
+
| --- | --- |
|
|
312
|
+
| Ally | Weekly (change detection) |
|
|
313
|
+
| Rubric | Weekly (drift detection) |
|
|
314
|
+
| Felt | On-demand (after each research study; quarterly hygiene sweep) |
|
|
315
|
+
| Layers+ | Monthly or on-demand (deeper, slower-changing) |
|
|
316
|
+
| Compass | Quarterly (strategic position) |
|
|
317
|
+
| Maven | On-demand (campaign-driven) |
|
|
318
|
+
| Pitch | Weekly (pipeline, conversion, forecast); on-trigger for competitive, pricing, handoff |
|
|
319
|
+
| Pilot `/roadmap` | After any pack refreshes its recommendations |
|
|
320
|
+
| Pilot `/ship` | Daily (autonomous batch) |
|
|
321
|
+
|
|
322
|
+
---
|
|
323
|
+
|
|
324
|
+
## Roadmap refresh triggers
|
|
325
|
+
|
|
326
|
+
`/pilot-roadmap` should be re-run when one of three trigger types fires. Running it on an arbitrary schedule produces noise; running it only when these triggers fire keeps it signal-dense.
|
|
327
|
+
|
|
328
|
+
**Milestone trigger** — re-run after any of:
|
|
329
|
+
- A pack completes a run and writes a new `<pack>-recommendations.md`
|
|
330
|
+
- A ship batch closes (all Now items shipped → re-read to confirm and promote Next items)
|
|
331
|
+
- A new pack is installed or an existing pack is significantly revised
|
|
332
|
+
|
|
333
|
+
**Signal trigger** — re-run immediately when a Watch item escalates:
|
|
334
|
+
- Any P-W item fires (competitor announcement, platform shift, external adopter feedback)
|
|
335
|
+
- A constraint in `docs/business.md` changes (e.g., a legal or business blocker resolves)
|
|
336
|
+
- A significant blocking finding is confirmed that wasn't in the current roadmap
|
|
337
|
+
|
|
338
|
+
**Time-based floor** — re-run at minimum once per quarter, even if no milestone or signal trigger has fired. Quarterly runs catch slow drift: Watch items that have aged past their revisit date, Next items whose effort estimates are now stale, constraints that have silently become unblocked.
|
|
339
|
+
|
|
340
|
+
**Who triggers it:** The Pilot operator (see GOVERNANCE.md § Roles). On teams, any pack owner can request a re-run by opening a PR to update their `<pack>-recommendations.md` and tagging the Pilot operator for review.
|
|
341
|
+
|
|
342
|
+
**What happens after a re-run:** Compare the new `pilot-roadmap.md` diff against the prior version. If any Now items changed tier, or any new conflicts surfaced, notify pack owners before starting the next `/pilot-ship` batch.
|
|
343
|
+
|
|
344
|
+
---
|
|
345
|
+
|
|
346
|
+
## Pack independence
|
|
347
|
+
|
|
348
|
+
Every pack works standalone. The workflow above is opt-in, not required. A designer can run Layers+ alone. A strategist can run Compass alone. Cross-pack references are citations — each pack degrades gracefully when sibling outputs are absent.
|
|
349
|
+
|
|
350
|
+
**The one exception:** Pilot needs at least one pack to have written a `<pack>-recommendations.md` file. With no packs writing recommendations, Pilot has nothing to synthesize. This is stated plainly in Pilot's README.
|
|
351
|
+
|
|
352
|
+
---
|
|
353
|
+
|
|
354
|
+
*Maintained in [keighleykodric/weeve-pilot](https://github.com/keighleykodric/weeve-pilot). All sibling pack READMEs cite this file.*
|
package/bin/weeve.js
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const { execSync } = require("child_process");
|
|
4
|
+
|
|
5
|
+
const ORG = "keighleykodric";
|
|
6
|
+
|
|
7
|
+
const LANES = {
|
|
8
|
+
// Strategy & Product
|
|
9
|
+
compass: "Strategic positioning — Wardley, JTBD, 7 Powers",
|
|
10
|
+
"layers-plus": "Product design — 7-layer evaluation",
|
|
11
|
+
felt: "UX research — personas, journeys, synthesis",
|
|
12
|
+
|
|
13
|
+
// Design & Accessibility
|
|
14
|
+
ally: "Accessibility — WCAG 2.2 AA across 7 zones",
|
|
15
|
+
rubric: "Design system — tokens, components, patterns",
|
|
16
|
+
|
|
17
|
+
// Engineering & Operations
|
|
18
|
+
forge: "Engineering health — architecture, code health, CI/CD",
|
|
19
|
+
helm: "Platform ops — deploy, rollback, monitoring, SLOs",
|
|
20
|
+
verify: "QA — test strategy, regression, release readiness",
|
|
21
|
+
guard: "Security — threat model, secrets, auth, compliance",
|
|
22
|
+
|
|
23
|
+
// Go-to-Market
|
|
24
|
+
maven: "Marketing — positioning, brand voice, campaigns",
|
|
25
|
+
pitch: "Sales — pipeline, ICP, conversion, pricing",
|
|
26
|
+
|
|
27
|
+
// Orchestration
|
|
28
|
+
pilot: "Synthesis — reads all lanes, writes the roadmap",
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const PRESETS = {
|
|
32
|
+
all: Object.keys(LANES),
|
|
33
|
+
core: ["compass", "layers-plus", "ally", "rubric", "pilot"],
|
|
34
|
+
strategy: ["compass", "layers-plus", "maven", "pilot"],
|
|
35
|
+
engineering: ["forge", "helm", "verify", "guard", "pilot"],
|
|
36
|
+
product: ["compass", "layers-plus", "ally", "rubric", "felt", "pilot"],
|
|
37
|
+
gtm: ["compass", "maven", "pitch", "pilot"],
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const cmd = process.argv[2];
|
|
41
|
+
const args = process.argv.slice(3);
|
|
42
|
+
|
|
43
|
+
function run(command) {
|
|
44
|
+
try {
|
|
45
|
+
execSync(command, { stdio: "inherit" });
|
|
46
|
+
} catch {
|
|
47
|
+
process.exit(1);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function installLanes(lanes) {
|
|
52
|
+
const invalid = lanes.filter((l) => !LANES[l]);
|
|
53
|
+
if (invalid.length) {
|
|
54
|
+
console.error(`Unknown lane(s): ${invalid.join(", ")}`);
|
|
55
|
+
console.error(`Run 'weeve list' to see available lanes.`);
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
console.log(`\nInstalling ${lanes.length} lane(s)...\n`);
|
|
60
|
+
for (const lane of lanes) {
|
|
61
|
+
const repo = `${ORG}/weeve-${lane}`;
|
|
62
|
+
console.log(` + ${lane} — ${LANES[lane]}`);
|
|
63
|
+
run(`npx skills add ${repo}`);
|
|
64
|
+
}
|
|
65
|
+
console.log(`\nDone. Run /pilot-intro to get started.\n`);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
switch (cmd) {
|
|
69
|
+
case "add":
|
|
70
|
+
case "install": {
|
|
71
|
+
if (!args.length) {
|
|
72
|
+
console.error("Usage: weeve add <lane|preset> [lane2] [lane3]...");
|
|
73
|
+
console.error(" weeve add all");
|
|
74
|
+
console.error(" weeve add core");
|
|
75
|
+
console.error("Run 'weeve presets' to see preset groups.");
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Check if first arg is a preset
|
|
80
|
+
if (args.length === 1 && PRESETS[args[0]]) {
|
|
81
|
+
const preset = args[0];
|
|
82
|
+
console.log(`Preset: ${preset} (${PRESETS[preset].join(", ")})`);
|
|
83
|
+
installLanes(PRESETS[preset]);
|
|
84
|
+
} else {
|
|
85
|
+
installLanes(args);
|
|
86
|
+
}
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
case "list":
|
|
91
|
+
case "lanes": {
|
|
92
|
+
console.log("\nAvailable lanes:\n");
|
|
93
|
+
const maxLen = Math.max(...Object.keys(LANES).map((k) => k.length));
|
|
94
|
+
for (const [name, desc] of Object.entries(LANES)) {
|
|
95
|
+
console.log(` ${name.padEnd(maxLen + 2)}${desc}`);
|
|
96
|
+
}
|
|
97
|
+
console.log();
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
case "presets": {
|
|
102
|
+
console.log("\nPresets:\n");
|
|
103
|
+
for (const [name, lanes] of Object.entries(PRESETS)) {
|
|
104
|
+
console.log(` ${name.padEnd(14)}${lanes.join(", ")}`);
|
|
105
|
+
}
|
|
106
|
+
console.log("\nUsage: weeve add <preset>\n");
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
case "help":
|
|
111
|
+
case undefined:
|
|
112
|
+
case "--help":
|
|
113
|
+
case "-h": {
|
|
114
|
+
console.log(`
|
|
115
|
+
weeve — Cross-functional alignment system
|
|
116
|
+
|
|
117
|
+
Commands:
|
|
118
|
+
weeve add <lane> [lane2...] Install one or more lanes
|
|
119
|
+
weeve add <preset> Install a preset group of lanes
|
|
120
|
+
weeve list Show all available lanes
|
|
121
|
+
weeve presets Show preset groups
|
|
122
|
+
|
|
123
|
+
Examples:
|
|
124
|
+
weeve add compass ally pilot Install three lanes
|
|
125
|
+
weeve add core Install core preset (compass, layers-plus, ally, rubric, pilot)
|
|
126
|
+
weeve add all Install everything
|
|
127
|
+
|
|
128
|
+
Presets:
|
|
129
|
+
all Every lane
|
|
130
|
+
core compass, layers-plus, ally, rubric, pilot
|
|
131
|
+
strategy compass, layers-plus, maven, pilot
|
|
132
|
+
engineering forge, helm, verify, guard, pilot
|
|
133
|
+
product compass, layers-plus, ally, rubric, felt, pilot
|
|
134
|
+
gtm compass, maven, pitch, pilot
|
|
135
|
+
`);
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
default:
|
|
140
|
+
console.error(`Unknown command: ${cmd}`);
|
|
141
|
+
console.error("Run 'weeve help' for usage.");
|
|
142
|
+
process.exit(1);
|
|
143
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# Ship gate protocol
|
|
2
|
+
|
|
3
|
+
_The cross-functional quality gate that blocks `/pilot-ship` when critical findings are open._
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## What gate-ship means
|
|
8
|
+
|
|
9
|
+
A finding in any lane's recommendations file can carry a `gate-ship: true` field. When `/pilot-ship` runs, it scans the ship gate sections of Guard and Verify recommendations files. If any finding is marked `gate-ship: true` and its state is not `closed` or `accepted-risk`, the ship is blocked.
|
|
10
|
+
|
|
11
|
+
**The gate is a hard stop, not an advisory.** `/pilot-ship` will not execute tasks in the affected area until the finding is resolved or an explicit operator override is recorded.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Which lanes can trigger it
|
|
16
|
+
|
|
17
|
+
Only two lanes have gate-ship authority by default:
|
|
18
|
+
|
|
19
|
+
| Lane | Why | Typical triggers |
|
|
20
|
+
|---|---|---|
|
|
21
|
+
| **Guard** | Security findings that create active risk — credential exposure, supply chain compromise, missing controls on a live system | Critical-severity findings (🔴 Critical) |
|
|
22
|
+
| **Verify** | Release readiness findings that mean the product is not safe to ship — no release process, no quality gate, untested critical path | Findings tagged `gate-ship: true` in `verify-release.md` |
|
|
23
|
+
|
|
24
|
+
Other lanes (Forge, Helm, Ally, Rubric, Layers+, Maven, Felt, Compass) surface findings at 🔴 High / 🟡 Medium / 🟢 Low severity but do not gate ship. Their findings appear in the roadmap as Now / Next / Watch items. A 🔴 High finding from Ally is urgent but does not block — it becomes a Now item that `/pilot-ship` prioritises.
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Severity mapping
|
|
29
|
+
|
|
30
|
+
| Finding severity | Gate behaviour |
|
|
31
|
+
|---|---|
|
|
32
|
+
| 🔴 Critical (Guard only) | **Blocks ship** — `gate-ship: true` by default |
|
|
33
|
+
| 🔴 High | Now item in roadmap; does not gate ship |
|
|
34
|
+
| 🟡 Medium | Next item; tracked with deadline |
|
|
35
|
+
| 🟢 Low | Watch tier; not surfaced at ship time |
|
|
36
|
+
|
|
37
|
+
Only Critical gates ship by default. If every High finding blocked, the gate would stop being credible. High findings belong on the next-batch punch list, not as a stop-everything signal.
|
|
38
|
+
|
|
39
|
+
Verify's gate-ship works differently: any finding in `verify-release.md` can be explicitly tagged `gate-ship: true` regardless of severity — the release readiness zone owns that decision.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## How the block appears
|
|
44
|
+
|
|
45
|
+
When `/pilot-ship` encounters an active gate-ship finding, it:
|
|
46
|
+
|
|
47
|
+
1. Reports the finding in the check-in under `## Ship blocked`
|
|
48
|
+
2. Lists the finding ID, pillar, severity, what it is, and why it blocks
|
|
49
|
+
3. Stops execution for the affected area
|
|
50
|
+
4. Does not proceed to task execution until the finding is resolved
|
|
51
|
+
|
|
52
|
+
The block is per-area, not global. A Guard finding blocking compass and pilot repos does not block work in other repos. `/pilot-ship` will still execute tasks that don't touch the affected area.
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Override path
|
|
57
|
+
|
|
58
|
+
An operator can override a gate-ship block. The override must include:
|
|
59
|
+
|
|
60
|
+
1. **Recorded reason** — why shipping is acceptable despite the finding
|
|
61
|
+
2. **Scope** — what area the override covers
|
|
62
|
+
3. **Owner** — who made the decision
|
|
63
|
+
|
|
64
|
+
The override is appended to the **Ship override history** table in the relevant recommendations file so the pattern becomes visible across runs. If the same finding is overridden repeatedly, the finding's severity or scope is wrong — surface it as a 🔴 item to fix the finding, not the override.
|
|
65
|
+
|
|
66
|
+
```markdown
|
|
67
|
+
## Ship override history
|
|
68
|
+
|
|
69
|
+
| Date | Finding | Reason | Scope | Owner |
|
|
70
|
+
|---|---|---|---|---|
|
|
71
|
+
| 2026-05-25 | GR1 | Token rotated; audit log clean; gate lifted | compass, pilot | @operator |
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Post-ship finding status
|
|
77
|
+
|
|
78
|
+
Blocking findings do not auto-close on ship. When a gate-ship finding is resolved:
|
|
79
|
+
|
|
80
|
+
1. The lane's `-check` skill verifies the fix (`/guard-check`, `/verify-check`)
|
|
81
|
+
2. The finding state is updated to `closed` in the recommendations file
|
|
82
|
+
3. The gate-ship field remains `true` but the state change lifts the block
|
|
83
|
+
4. `/pilot-ship` reads the updated state on its next run and proceeds
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## How to add gate-ship to a finding
|
|
88
|
+
|
|
89
|
+
In a lane's recommendations skill spec, tag the finding:
|
|
90
|
+
|
|
91
|
+
```markdown
|
|
92
|
+
**gate-ship:** true
|
|
93
|
+
**State:** open
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
The finding must also appear in a dedicated `## Ship gate` section at the top of the recommendations file so `/pilot-ship` can scan it without parsing the full document.
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Governance
|
|
101
|
+
|
|
102
|
+
Changes to the gate-ship protocol (which lanes can trigger it, what severity level gates by default, override rules) are framework-level decisions. They should be:
|
|
103
|
+
|
|
104
|
+
1. Documented here (this file is the canonical reference)
|
|
105
|
+
2. Reflected in `lane-conventions.md` under the severity mapping section
|
|
106
|
+
3. Communicated to all lane maintainers
|
|
107
|
+
|
|
108
|
+
Adding gate-ship authority to a new lane requires a recorded decision in `docs/decisions.md` — it changes the power dynamics of Weeve.
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
_Source: `lane-conventions.md` severity mapping, Guard and Verify recommendations skill specs, `/pilot-ship` skill spec_
|
|
113
|
+
_Generated by [pilot](https://github.com/keighleykodric/weeve-pilot) · 2026-05-25_
|