@keighleykodric/weeve 0.1.0 → 0.1.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/README.md +75 -19
- package/bin/weeve.js +467 -2
- package/examples/core/CODEOWNERS.template +9 -0
- package/examples/core/README.md +63 -0
- package/examples/core/demo/README.md +38 -0
- package/examples/core/demo/weeve/ally/ally-intake.md +16 -0
- package/examples/core/demo/weeve/compass/compass-intake.md +15 -0
- package/examples/core/demo/weeve/layers-plus/figma-notes.md +31 -0
- package/examples/core/demo/weeve/layers-plus/layers-plus-intake.md +13 -0
- package/examples/core/demo/weeve/rubric/component-inventory.md +42 -0
- package/examples/core/demo/weeve/rubric/rubric-intake.md +14 -0
- package/examples/core/demo/weeve/shared/competitive.md +28 -0
- package/examples/core/demo/weeve/shared/roadmap.md +26 -0
- package/examples/core/demo/weeve/shared/weeve-guardrails.md +28 -0
- package/examples/core/demo/weeve/shared/weeve-intake.md +18 -0
- package/examples/core/demo/weeve/shared/weeve-project.md +33 -0
- package/examples/core/demo/weeve.yaml +15 -0
- package/examples/core/weeve.yaml +14 -0
- package/examples/engineering/CODEOWNERS.template +9 -0
- package/examples/engineering/README.md +61 -0
- package/examples/engineering/demo/README.md +20 -0
- package/examples/engineering/demo/weeve/forge/architecture.md +39 -0
- package/examples/engineering/demo/weeve/forge/ci-metrics.md +47 -0
- package/examples/engineering/demo/weeve/forge/forge-intake.md +41 -0
- package/examples/engineering/demo/weeve/guard/guard-intake.md +17 -0
- package/examples/engineering/demo/weeve/helm/helm-intake.md +16 -0
- package/examples/engineering/demo/weeve/helm/incidents.md +40 -0
- package/examples/engineering/demo/weeve/helm/on-call-runbook.md +33 -0
- package/examples/engineering/demo/weeve/shared/roadmap.md +25 -0
- package/examples/engineering/demo/weeve/shared/team.md +33 -0
- package/examples/engineering/demo/weeve/shared/weeve-guardrails.md +27 -0
- package/examples/engineering/demo/weeve/shared/weeve-intake.md +18 -0
- package/examples/engineering/demo/weeve/shared/weeve-project.md +29 -0
- package/examples/engineering/demo/weeve/verify/coverage-report.md +49 -0
- package/examples/engineering/demo/weeve/verify/verify-intake.md +16 -0
- package/examples/engineering/demo/weeve.yaml +15 -0
- package/examples/engineering/weeve.yaml +14 -0
- package/examples/gtm/CODEOWNERS.template +8 -0
- package/examples/gtm/README.md +59 -0
- package/examples/gtm/demo/README.md +19 -0
- package/examples/gtm/demo/weeve/compass/compass-intake.md +15 -0
- package/examples/gtm/demo/weeve/maven/maven-intake.md +35 -0
- package/examples/gtm/demo/weeve/maven/website-notes.md +33 -0
- package/examples/gtm/demo/weeve/pitch/pitch-intake.md +54 -0
- package/examples/gtm/demo/weeve/pitch/sales-deck-notes.md +28 -0
- package/examples/gtm/demo/weeve/pitch/win-loss-notes.md +40 -0
- package/examples/gtm/demo/weeve/shared/competitive.md +30 -0
- package/examples/gtm/demo/weeve/shared/roadmap.md +19 -0
- package/examples/gtm/demo/weeve/shared/weeve-guardrails.md +24 -0
- package/examples/gtm/demo/weeve/shared/weeve-intake.md +18 -0
- package/examples/gtm/demo/weeve/shared/weeve-project.md +25 -0
- package/examples/gtm/demo/weeve.yaml +22 -0
- package/examples/gtm/weeve.yaml +14 -0
- package/examples/product/CODEOWNERS.template +10 -0
- package/examples/product/README.md +67 -0
- package/examples/product/demo/README.md +21 -0
- package/examples/product/demo/weeve/ally/ally-intake.md +16 -0
- package/examples/product/demo/weeve/compass/compass-intake.md +15 -0
- package/examples/product/demo/weeve/felt/felt-intake.md +37 -0
- package/examples/product/demo/weeve/felt/user-research.md +68 -0
- package/examples/product/demo/weeve/layers-plus/layers-plus-intake.md +14 -0
- package/examples/product/demo/weeve/rubric/component-inventory.md +42 -0
- package/examples/product/demo/weeve/rubric/rubric-intake.md +14 -0
- package/examples/product/demo/weeve/shared/competitive.md +28 -0
- package/examples/product/demo/weeve/shared/roadmap.md +32 -0
- package/examples/product/demo/weeve/shared/weeve-guardrails.md +27 -0
- package/examples/product/demo/weeve/shared/weeve-intake.md +18 -0
- package/examples/product/demo/weeve/shared/weeve-project.md +29 -0
- package/examples/product/demo/weeve.yaml +21 -0
- package/examples/product/weeve.yaml +14 -0
- package/examples/strategy/CODEOWNERS.template +8 -0
- package/examples/strategy/README.md +59 -0
- package/examples/strategy/demo/README.md +19 -0
- package/examples/strategy/demo/weeve/compass/compass-intake.md +34 -0
- package/examples/strategy/demo/weeve/compass/customer-segments.md +34 -0
- package/examples/strategy/demo/weeve/layers-plus/layers-plus-intake.md +15 -0
- package/examples/strategy/demo/weeve/maven/maven-intake.md +33 -0
- package/examples/strategy/demo/weeve/shared/competitive.md +40 -0
- package/examples/strategy/demo/weeve/shared/roadmap.md +29 -0
- package/examples/strategy/demo/weeve/shared/weeve-guardrails.md +22 -0
- package/examples/strategy/demo/weeve/shared/weeve-intake.md +17 -0
- package/examples/strategy/demo/weeve/shared/weeve-project.md +25 -0
- package/examples/strategy/demo/weeve.yaml +15 -0
- package/examples/strategy/weeve.yaml +14 -0
- package/package.json +14 -3
- package/spec/contributing-template.md +109 -0
- package/spec/readme-template.md +55 -0
- package/{docs/shared/SHIP-GATE.md → spec/ship-gate.md} +7 -7
- package/spec/signals-schema.md +685 -0
- package/spec/weeve-yaml.md +274 -0
- package/.github/SECURITY.md +0 -22
- package/GOVERNANCE.md +0 -173
- package/WORKFLOW.md +0 -354
- package/docs/shared/engineering-pack-contract.md +0 -94
- package/docs/shared/id-prefix-reference.md +0 -235
- package/docs/shared/idea-intake-pattern.md +0 -99
- package/docs/shared/lane-conventions.md +0 -207
- package/docs/shared/recommendations-schema.md +0 -363
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
# weeve.yaml — project config reference
|
|
2
|
+
|
|
3
|
+
`weeve.yaml` is the project-level config file for a weeve setup. It lives at the root of any repo that participates in a weeve workflow. Skills read it on startup to resolve `$DOCS_ROOT` and understand which lanes are active.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Minimal config
|
|
8
|
+
|
|
9
|
+
```yaml
|
|
10
|
+
schema_version: "0.4"
|
|
11
|
+
|
|
12
|
+
project:
|
|
13
|
+
name: My Project
|
|
14
|
+
tag: MYP
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
`project.tag` is the 3-letter (or short) identifier used to locate your docs folder. Skills resolve two root paths per project:
|
|
18
|
+
|
|
19
|
+
| Variable | Default path | Purpose |
|
|
20
|
+
|---|---|---|
|
|
21
|
+
| `$LOOM_ROOT` | `<vault_path>/Projects/<tag>/loom` | **Input zone** — human-written notes, research, and orienting context. Skills read from here. |
|
|
22
|
+
| `$DOCS_ROOT` | `<vault_path>/Projects/<tag>/weeve` | **Output zone** — structured analysis written by skills (signals, reports, priorities). Skills write here. |
|
|
23
|
+
|
|
24
|
+
An `archive/` folder at `<vault_path>/Projects/<tag>/archive/` holds historical snapshots. It is not referenced by `$LOOM_ROOT` or `$DOCS_ROOT` — recap and archival skills write there directly.
|
|
25
|
+
|
|
26
|
+
**Rule of thumb:** if a skill writes it, it lives in `$DOCS_ROOT`. If you wrote it (notes, research, briefs), it lives in `$LOOM_ROOT`. Skills read from `$LOOM_ROOT` via `source_dirs`; they write to `$DOCS_ROOT`.
|
|
27
|
+
|
|
28
|
+
**Shared files in `$DOCS_ROOT/shared/`** (skill-generated and maintained):
|
|
29
|
+
- `weeve-guardrails.md` — hard limits captured during intro
|
|
30
|
+
- `weeve-decisions.md` — locked decisions log
|
|
31
|
+
- `weeve-project.md` — project brief scaffolded by intro skills
|
|
32
|
+
- `weeve-business.md` — strategic context
|
|
33
|
+
- `weeve-users.md` — audience definition
|
|
34
|
+
- `lane-conventions.md` — severity → ship-gate mapping
|
|
35
|
+
- `signals-digest.md` — top signals per lane (written by `/pilot-check`)
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Full config reference
|
|
40
|
+
|
|
41
|
+
```yaml
|
|
42
|
+
# weeve.yaml
|
|
43
|
+
schema_version: "0.4"
|
|
44
|
+
|
|
45
|
+
project:
|
|
46
|
+
name: Acme Platform # Human-readable project name
|
|
47
|
+
tag: ACP # Short ID — matches your vault's Projects/<tag>/ folder
|
|
48
|
+
docs_root: ./weeve # Optional: explicit path to lane outputs folder ($DOCS_ROOT).
|
|
49
|
+
# When set, skills write here directly (no vault needed).
|
|
50
|
+
# Default: inferred as <vault_path>/Projects/<tag>/weeve
|
|
51
|
+
loom_root: ./loom # Optional: explicit path to the input zone ($LOOM_ROOT).
|
|
52
|
+
# Default: inferred as <vault_path>/Projects/<tag>/loom
|
|
53
|
+
depends_on: # Optional: other weeve projects this project reads context from.
|
|
54
|
+
- tag: API # Required: the other project's tag
|
|
55
|
+
name: Core API # Optional: human label
|
|
56
|
+
relationship: api-contract # Optional: nature of the dependency
|
|
57
|
+
|
|
58
|
+
roads:
|
|
59
|
+
- name: startup # Road name (used in pilot-priorities)
|
|
60
|
+
path: roads/startup # Path to road definition file (relative to repo root)
|
|
61
|
+
|
|
62
|
+
lanes:
|
|
63
|
+
compass:
|
|
64
|
+
tag: ORG # Optional: use a different tag for cross-project lanes.
|
|
65
|
+
# Useful when Compass covers the whole org, not just this repo.
|
|
66
|
+
source_dirs: # Optional: loom subdirs this lane scans. Paths relative
|
|
67
|
+
- strategy/ # to $LOOM_ROOT. Defaults vary by lane (see table below).
|
|
68
|
+
- business/ # Override here if your project uses a different structure.
|
|
69
|
+
# Omit to use lane defaults.
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Lane `source_dirs` defaults (used when not specified in `weeve.yaml`). All paths are relative to `$LOOM_ROOT`:
|
|
73
|
+
|
|
74
|
+
| Lane | Default source dirs |
|
|
75
|
+
|---|---|
|
|
76
|
+
| compass | `strategy/`, `business/` |
|
|
77
|
+
| felt | `research/` |
|
|
78
|
+
| ally | `design/` |
|
|
79
|
+
| layers-plus | `design/` |
|
|
80
|
+
| rubric | `design/`, `marketing/` |
|
|
81
|
+
| maven | `marketing/` |
|
|
82
|
+
| pitch | `sales/` |
|
|
83
|
+
| forge | `engineering/` |
|
|
84
|
+
| helm | `engineering/` |
|
|
85
|
+
| verify | `engineering/` |
|
|
86
|
+
| guard | `engineering/`, `business/` |
|
|
87
|
+
|
|
88
|
+
All lanes also read `$LOOM_ROOT/shared/` regardless of `source_dirs` — place any cross-lane notes or raw context you want every skill to see here. Skill-managed shared files (`weeve-guardrails.md`, `weeve-decisions.md`, etc.) live in `$DOCS_ROOT/shared/`.
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Multi-repo setup
|
|
94
|
+
|
|
95
|
+
Weeve works across multiple repos. Each participating repo has its own `weeve.yaml` with the **same `project.tag`**. All repos write into the same `$DOCS_ROOT`, so Pilot sees a unified picture across the codebase.
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
my-workspace/
|
|
99
|
+
acme-web/
|
|
100
|
+
weeve.yaml # project.tag: ACP
|
|
101
|
+
acme-api/
|
|
102
|
+
weeve.yaml # project.tag: ACP ← same tag
|
|
103
|
+
acme-mobile/
|
|
104
|
+
weeve.yaml # project.tag: ACP ← same tag
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Skills are run from whichever repo is relevant. They all resolve to the same `$DOCS_ROOT` and write their outputs there. Lane outputs accumulate — you'll see findings from the web, API, and mobile codebases in the same signals files.
|
|
108
|
+
|
|
109
|
+
**Optional: document which repos participate**
|
|
110
|
+
|
|
111
|
+
```yaml
|
|
112
|
+
project:
|
|
113
|
+
name: Acme Platform
|
|
114
|
+
tag: ACP
|
|
115
|
+
repos:
|
|
116
|
+
- name: web
|
|
117
|
+
path: ../acme-web
|
|
118
|
+
- name: api
|
|
119
|
+
path: ../acme-api
|
|
120
|
+
- name: mobile
|
|
121
|
+
path: ../acme-mobile
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
This is informational — weeve doesn't use `repos` to drive resolution, but it documents the full surface area for future tooling (e.g., `weeve status` across repos).
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## Project relationships (`depends_on`)
|
|
129
|
+
|
|
130
|
+
Projects don't exist in isolation. A frontend depends on an API. A platform team's decisions affect every product team. `depends_on` makes those relationships explicit — without requiring a hierarchy.
|
|
131
|
+
|
|
132
|
+
```yaml
|
|
133
|
+
project:
|
|
134
|
+
name: Frontend
|
|
135
|
+
tag: FE
|
|
136
|
+
depends_on:
|
|
137
|
+
- tag: API
|
|
138
|
+
name: Core API # Optional: human-readable label
|
|
139
|
+
relationship: api-contract # Optional: describes the nature of the dependency
|
|
140
|
+
- tag: PLATFORM
|
|
141
|
+
name: Platform Team
|
|
142
|
+
relationship: infra
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
**What this does:**
|
|
146
|
+
|
|
147
|
+
- Documents that this project reads context from, and is affected by, other weeve projects
|
|
148
|
+
- Gives lanes access to dependent projects' `$DOCS_ROOT/shared/` as secondary context
|
|
149
|
+
- Lets Pilot surface cross-project signals — a ship-blocked finding in API that affects Frontend's release
|
|
150
|
+
|
|
151
|
+
**What this doesn't do:**
|
|
152
|
+
|
|
153
|
+
- Impose a hierarchy — any project can depend on any other, in any direction
|
|
154
|
+
- Require a shared parent — "org" or "fleet" is just what emerges from the full graph, not something weeve models
|
|
155
|
+
- Give dependent projects write access — dependencies are read-only context
|
|
156
|
+
|
|
157
|
+
**Accessing dependent project docs:**
|
|
158
|
+
|
|
159
|
+
Skills resolve dependent project docs the same way they resolve their own `$DOCS_ROOT`:
|
|
160
|
+
|
|
161
|
+
| Dependent project config | Resolves to |
|
|
162
|
+
|---|---|
|
|
163
|
+
| Has `docs_root` | That path directly |
|
|
164
|
+
| Has `tag` only | `<vault_path>/Projects/<tag>/weeve` |
|
|
165
|
+
|
|
166
|
+
Skills read `shared/` from each dependency as background context. Lane outputs are never written to a dependency's `$DOCS_ROOT`.
|
|
167
|
+
|
|
168
|
+
**Example: cross-project Pilot**
|
|
169
|
+
|
|
170
|
+
When Pilot runs on the Frontend project, it can read:
|
|
171
|
+
- `$DOCS_ROOT/*/signals.md` — own project lane signals
|
|
172
|
+
- `<API_DOCS_ROOT>/guard/signals.md` — API's security findings (relevant if FE calls API endpoints)
|
|
173
|
+
- `<PLATFORM_DOCS_ROOT>/helm/signals.md` — Platform's deployment signals (relevant if FE uses platform infra)
|
|
174
|
+
|
|
175
|
+
This surfaces blockers that live in a different repo but affect this project's ship readiness.
|
|
176
|
+
|
|
177
|
+
**Shared docs between projects:**
|
|
178
|
+
|
|
179
|
+
Use `$DOCS_ROOT/shared/weeve-sources.md` to reference external docs (Confluence, Notion). Use `depends_on` for other weeve projects. They're complementary:
|
|
180
|
+
|
|
181
|
+
```
|
|
182
|
+
shared/
|
|
183
|
+
weeve-project.md ← what this project is
|
|
184
|
+
weeve-decisions.md ← this project's decisions
|
|
185
|
+
weeve-guardrails.md ← this project's hard limits
|
|
186
|
+
weeve-sources.md ← links to external org-level docs (Notion, Confluence, etc.)
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
The org-level layer doesn't need to live in weeve. `weeve-sources.md` is a pointer, not a copy.
|
|
190
|
+
|
|
191
|
+
**How Pilot uses `depends_on`:**
|
|
192
|
+
|
|
193
|
+
When Pilot runs, it reads signals from two sources:
|
|
194
|
+
|
|
195
|
+
1. **Own project** — all lane signals files under `$DOCS_ROOT`
|
|
196
|
+
2. **Dependent projects** — signals files from each `depends_on` project's `$DOCS_ROOT`
|
|
197
|
+
|
|
198
|
+
Pilot's output is a single ranked backlog. Findings from dependent projects that affect this project's ship readiness appear as cross-project items — attributed to their source, ranked alongside own-project findings. A `gate_ship: true` finding in a dependency surfaces as a blocker on this project's release even if this project's own lanes are clean.
|
|
199
|
+
|
|
200
|
+
Each project's findings remain scoped to their own codebase. Running the same lane in two projects isn't a conflict — it's two views of the same dependency relationship, both visible to Pilot when needed.
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
## $DOCS_ROOT resolution order
|
|
205
|
+
|
|
206
|
+
Every intro skill resolves both `$DOCS_ROOT` and `$LOOM_ROOT` in this order:
|
|
207
|
+
|
|
208
|
+
**`$DOCS_ROOT` (output zone):**
|
|
209
|
+
1. **`weeve.yaml` present with `project.docs_root`** — use that path directly. No vault needed. Good for teams that don't use Claudette.
|
|
210
|
+
2. **`weeve.yaml` present with `project.tag`** — resolve as `<vault_path>/Projects/<tag>/weeve`.
|
|
211
|
+
3. **No `weeve.yaml`** — fall back to Claudette config: match cwd basename to `config.projects[].repo`, derive tag and path from there.
|
|
212
|
+
|
|
213
|
+
**`$LOOM_ROOT` (input zone):**
|
|
214
|
+
1. **`weeve.yaml` present with `project.loom_root`** — use that path directly.
|
|
215
|
+
2. **`weeve.yaml` present with `project.tag`** — resolve as `<vault_path>/Projects/<tag>/loom`.
|
|
216
|
+
3. **No `weeve.yaml`** — derive from Claudette config using the same tag as `$DOCS_ROOT`.
|
|
217
|
+
|
|
218
|
+
If neither resolves, the intro skill asks for paths before proceeding.
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## Without Claudette
|
|
223
|
+
|
|
224
|
+
If you're using weeve without Claudette (e.g., on a team), set `docs_root` explicitly:
|
|
225
|
+
|
|
226
|
+
```yaml
|
|
227
|
+
project:
|
|
228
|
+
name: Acme Platform
|
|
229
|
+
tag: ACP
|
|
230
|
+
docs_root: ./weeve # relative to repo root, or absolute — skill outputs go here
|
|
231
|
+
loom_root: ./loom # raw input zone — notes, research, briefs skills read from here
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
Skills will write to `docs_root` and read raw input from `loom_root`. You can put these folders anywhere — inside the repo, in a shared drive, or in a separate docs repo.
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
## Claudette integration contract
|
|
239
|
+
|
|
240
|
+
Weeve and Claudette are independent tools. Using both is optional — neither requires the other. If you use both, the coupling is minimal and one-directional:
|
|
241
|
+
|
|
242
|
+
| Direction | What | Why |
|
|
243
|
+
|---|---|---|
|
|
244
|
+
| weeve → Claudette | Reads `vault_path` from `~/.config/claudette/bootstrap.yaml` | To resolve `$DOCS_ROOT` when `docs_root` is not set in `weeve.yaml` |
|
|
245
|
+
| Claudette → weeve | Nothing | Claudette doesn't read weeve outputs — Pilot does |
|
|
246
|
+
|
|
247
|
+
**No conflicts by design:**
|
|
248
|
+
|
|
249
|
+
- Weeve writes lane outputs to `$DOCS_ROOT/<lane>/
|
|
250
|
+
` (e.g. `Projects/ACP/weeve/compass/`)
|
|
251
|
+
- Claudette writes context files to `<vault_path>/Projects/<tag>/` (e.g. `Projects/ACP/_context-week.md`)
|
|
252
|
+
- These are different folders under the same project root — no overlap, no overwriting
|
|
253
|
+
|
|
254
|
+
**Removing Claudette:** if you stop using Claudette, set `docs_root` in `weeve.yaml` and nothing changes. Weeve stops looking at `~/.config/claudette/` entirely.
|
|
255
|
+
|
|
256
|
+
**Adding Claudette later:** add `vault_path` to `~/.config/claudette/bootstrap.yaml` with a project entry matching your `project.tag`. Remove `docs_root` from `weeve.yaml` if you want outputs in the vault. Or keep `docs_root` — both approaches work.
|
|
257
|
+
|
|
258
|
+
**The one field weeve reads from Claudette:**
|
|
259
|
+
|
|
260
|
+
```
|
|
261
|
+
~/.config/claudette/bootstrap.yaml → vault_path
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
That's it. Weeve reads no other Claudette config. Claudette reads no weeve config.
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
|
|
268
|
+
## Generated by `weeve init`
|
|
269
|
+
|
|
270
|
+
`weeve init [preset]` creates `weeve.yaml` in the current directory. It prompts for project name and tag if not provided, then writes a config with the correct preset lanes listed in comments.
|
|
271
|
+
|
|
272
|
+
---
|
|
273
|
+
|
|
274
|
+
_Maintained in [`weeve`](https://github.com/keighleykodric/weeve) · `spec/weeve-yaml.md`_
|
package/.github/SECURITY.md
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
# Security Policy
|
|
2
|
-
|
|
3
|
-
## Reporting a Vulnerability
|
|
4
|
-
|
|
5
|
-
If you discover a security vulnerability in any Weave framework repo, please report it responsibly by opening an issue on the [pilot repo](https://github.com/kjk/pilot/issues) with the label `security`.
|
|
6
|
-
|
|
7
|
-
Do **not** open a public issue on the affected repo if the vulnerability could be exploited before a fix is available. In that case, email the maintainer or use a private GitHub issue on pilot.
|
|
8
|
-
|
|
9
|
-
## Scope
|
|
10
|
-
|
|
11
|
-
A security issue includes:
|
|
12
|
-
|
|
13
|
-
- Credential or secret exposure in generated output
|
|
14
|
-
- Path traversal or file-system access beyond intended scope
|
|
15
|
-
- Prompt injection that bypasses guardrails
|
|
16
|
-
- Unintended data leakage between commands or sessions
|
|
17
|
-
|
|
18
|
-
General bugs, feature requests, and performance issues are **not** security issues.
|
|
19
|
-
|
|
20
|
-
## Response
|
|
21
|
-
|
|
22
|
-
Best effort. Reports will be acknowledged within **7 days**. Fixes are prioritized by severity.
|
package/GOVERNANCE.md
DELETED
|
@@ -1,173 +0,0 @@
|
|
|
1
|
-
# Governance — ownership and permissions
|
|
2
|
-
|
|
3
|
-
Addresses how ownership and permissions work in Weeve across multiple people and teams — the gap between one person running all lanes solo and an org with specialists writing to specialist outputs.
|
|
4
|
-
|
|
5
|
-
This is a known adoption gate. Solvable, mostly with infrastructure orgs already use, but it needs to be explicit before Weeve lands in any multi-team environment.
|
|
6
|
-
|
|
7
|
-
## The problem
|
|
8
|
-
|
|
9
|
-
Weeve is markdown-in-git. In a multi-person org, anyone with repo write access can edit anything. Without explicit ownership boundaries:
|
|
10
|
-
|
|
11
|
-
- Non-specialists write to specialist outputs (marketer edits `compass-recommendations`, designer edits `maven-recommendations`)
|
|
12
|
-
- Authority is ambiguous — consumers don't know if upstream is the right voice
|
|
13
|
-
- Quality erodes as the wrong people make decisions
|
|
14
|
-
- Trust in the contract files breaks down
|
|
15
|
-
|
|
16
|
-
This is the natural failure mode of any document collaboration system at scale. Weeve needs a governance overlay that makes ownership visible and enforceable.
|
|
17
|
-
|
|
18
|
-
## The architectural insight
|
|
19
|
-
|
|
20
|
-
Weeve already has the right ownership structure built in:
|
|
21
|
-
|
|
22
|
-
- Each pack has a domain (compass = strategy, maven = marketing, etc.)
|
|
23
|
-
- Each contract file has a clear consumer (Pilot reads recommendations)
|
|
24
|
-
- Each output has a logical author (the department that owns the pack)
|
|
25
|
-
|
|
26
|
-
What's missing is the *governance overlay* that exposes this structure and enforces it. The good news: 80% of the solution is infrastructure orgs already use. Nothing new needs to be invented.
|
|
27
|
-
|
|
28
|
-
## Editor, storage, reader — three separable layers
|
|
29
|
-
|
|
30
|
-
A common adoption concern: *"won't non-technical departments resist GitHub?"* Weeve's answer is that **edit, store, and read are three separable layers**, and a department only has to engage with whichever it wants:
|
|
31
|
-
|
|
32
|
-
| Layer | Who | Tool |
|
|
33
|
-
|---|---|---|
|
|
34
|
-
| **Editor** | The specialist team | Their preferred tool — GitHub, Obsidian, Notion (with markdown export), VS Code, Cursor |
|
|
35
|
-
| **Storage** | The org (versioned, audited) | Git, Dropbox, Drive, Box, or self-hosted |
|
|
36
|
-
| **Reader / consumer** | Everyone | Dashboard, AI agent, Slack notification, exported PDF, the markdown file itself |
|
|
37
|
-
|
|
38
|
-
A marketer never has to touch GitHub directly. They consume Maven's outputs via the dashboard, get notifications via Slack, ask the AI agent for the latest positioning, and edit (if they edit at all) in a tool they already know. GitHub is plumbing.
|
|
39
|
-
|
|
40
|
-
For non-technical orgs entirely, the storage layer can be something other than git. Downstream tools read from wherever; Weeve doesn't care.
|
|
41
|
-
|
|
42
|
-
## Layer 1 — Git-native ownership (OSS, works today)
|
|
43
|
-
|
|
44
|
-
GitHub CODEOWNERS solves the core write-permission problem. One file at the repo root:
|
|
45
|
-
|
|
46
|
-
```
|
|
47
|
-
docs/compass/ @leadership-team
|
|
48
|
-
docs/maven/ @marketing-team
|
|
49
|
-
docs/rubric/ @design-system-team
|
|
50
|
-
docs/ally/ @accessibility-team
|
|
51
|
-
docs/layers-plus/ @product-team
|
|
52
|
-
docs/pilot/ @leadership-team
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
Combined with branch protection rules requiring owner approval, this is a hard gate. PRs touching those paths auto-request review from the right team and cannot merge without it.
|
|
56
|
-
|
|
57
|
-
Adoption is the only friction. Most orgs using GitHub already use CODEOWNERS for code; using it for the docs folders is the same pattern applied one level over. Weeve should ship a template CODEOWNERS file and make adoption obvious during install.
|
|
58
|
-
|
|
59
|
-
## Layer 2 — Pack-declared ownership (small addition)
|
|
60
|
-
|
|
61
|
-
Each pack declares its owner, consumers, and contract in a small `pack.yaml`:
|
|
62
|
-
|
|
63
|
-
```yaml
|
|
64
|
-
pack: compass
|
|
65
|
-
owner: leadership
|
|
66
|
-
consumers: [product, engineering, marketing]
|
|
67
|
-
contract: compass-recommendations.md
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
This becomes:
|
|
71
|
-
|
|
72
|
-
- A scaffolding template — installing Compass for an org auto-generates the right CODEOWNERS entry, picking up the org's team names from a one-time setup
|
|
73
|
-
- A documentation artifact — anyone reading the pack repo can see who owns what
|
|
74
|
-
- Input to downstream tooling — populates role-based views and routing without extra configuration
|
|
75
|
-
|
|
76
|
-
Small addition; large payoff in adoption clarity.
|
|
77
|
-
|
|
78
|
-
## Read vs write
|
|
79
|
-
|
|
80
|
-
Weeve gates *writes*, not reads. Cross-functional alignment depends on cross-pack readability:
|
|
81
|
-
|
|
82
|
-
- Marketing reads `compass-position` to understand the strategic frame
|
|
83
|
-
- Leadership reads `ally-recommendations` to understand accessibility commitments
|
|
84
|
-
- Engineering reads `maven-recommendations` to understand the launch shape
|
|
85
|
-
|
|
86
|
-
Everyone can read everything. Only the *authors* are gated.
|
|
87
|
-
|
|
88
|
-
## Roles and ownership
|
|
89
|
-
|
|
90
|
-
Each domain pack has an obvious owner (the department whose work it captures). Pilot doesn't — it's the meta-pack. "Owning Pilot" splits into three roles, which collapse to one or two people at startup scale but need to be named so they can separate cleanly as the org grows:
|
|
91
|
-
|
|
92
|
-
| Role | Owns | Small startup | Medium startup |
|
|
93
|
-
|---|---|---|---|
|
|
94
|
-
| **Pilot operator** | Runs `/pilot-roadmap` and `/pilot-ship`. Routine work. | Eng lead, platform person, or founder | Platform team |
|
|
95
|
-
| **Pilot owner** | The roadmap *output* and the prioritization that produces it. Cross-functional priorities. | Founder / CEO | Leadership team |
|
|
96
|
-
| **Alignment platform owner** | Weeve config — which packs are installed, scoring weights, CODEOWNERS template, integrations. | Weeve champion | Platform / ops |
|
|
97
|
-
|
|
98
|
-
At small scale (5–50 people), one person is typically all three. That's fine. Naming the roles now lets them split cleanly later without re-architecting.
|
|
99
|
-
|
|
100
|
-
The departmental pack owners map straightforwardly:
|
|
101
|
-
|
|
102
|
-
| Pack | Default owner |
|
|
103
|
-
|---|---|
|
|
104
|
-
| Compass | Leadership / founder |
|
|
105
|
-
| Layers+ | Product / design |
|
|
106
|
-
| Ally | Accessibility lead (or whoever owns a11y) |
|
|
107
|
-
| Rubric | Design system / DesignOps |
|
|
108
|
-
| Maven | Marketing |
|
|
109
|
-
| _(Personal capture tool)_ | Personal — usually not shared |
|
|
110
|
-
| Pilot | Leadership (output) + platform (config) |
|
|
111
|
-
|
|
112
|
-
## Adoption shape — the `.alignment/` repo layout
|
|
113
|
-
|
|
114
|
-
Concrete shape for an org adopting Weeve:
|
|
115
|
-
|
|
116
|
-
```
|
|
117
|
-
alignment/ (the org's adoption repo, e.g. github.com/your-org/alignment)
|
|
118
|
-
├── .alignment/ <- meta-config; owned by platform
|
|
119
|
-
│ ├── config.yaml <- installed packs, scoring weights, integrations
|
|
120
|
-
│ ├── CODEOWNERS <- write permissions per folder
|
|
121
|
-
│ └── pack-overrides/ <- org-specific tweaks (rare)
|
|
122
|
-
├── docs/
|
|
123
|
-
│ ├── compass/ <- @leadership-team
|
|
124
|
-
│ ├── layers-plus/ <- @product-team
|
|
125
|
-
│ ├── ally/ <- @accessibility-team
|
|
126
|
-
│ ├── rubric/ <- @design-system-team
|
|
127
|
-
│ ├── maven/ <- @marketing-team
|
|
128
|
-
│ └── pilot/ <- mixed ownership (see below)
|
|
129
|
-
└── README.md
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
`.alignment/` is the meta-config layer. The platform person owns it; leadership owns the Pilot output (the roadmap); each department owns their pack's folder. CODEOWNERS enforces all of it.
|
|
133
|
-
|
|
134
|
-
**Splitting `docs/pilot/` ownership:**
|
|
135
|
-
|
|
136
|
-
The *roadmap content* is leadership's call (these are company priorities). The *operational config* is platform's call (scoring weights, drift thresholds, pack weighting). CODEOWNERS handles this file-by-file:
|
|
137
|
-
|
|
138
|
-
```
|
|
139
|
-
docs/pilot/pilot-roadmap.md @leadership-team
|
|
140
|
-
docs/pilot/pilot-config.yaml @platform-team
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
That split mirrors the role split above.
|
|
144
|
-
|
|
145
|
-
## Config control — who owns what across the system
|
|
146
|
-
|
|
147
|
-
For an adopting org, configuration spans several layers. Each has a clear owner:
|
|
148
|
-
|
|
149
|
-
| Config layer | What it controls | Owner |
|
|
150
|
-
|---|---|---|
|
|
151
|
-
| `.alignment/CODEOWNERS` | Write permissions per folder | Platform |
|
|
152
|
-
| `.alignment/config.yaml` | Installed packs, scoring weights, integrations | Platform |
|
|
153
|
-
| `pack.yaml` (per pack) | Pack-declared ownership and consumers | Platform (informed by departments) |
|
|
154
|
-
| Pack version pinning | Which version of each pack is installed | Platform (via git, like any dependency) |
|
|
155
|
-
| Integration credentials | OAuth tokens, webhook URLs | Platform; secured per org policy |
|
|
156
|
-
| Pack content (per `docs/<pack>/`) | The actual recommendations and audit files | Department owner per pack |
|
|
157
|
-
|
|
158
|
-
The config is owned by whoever owns the repo — typically the same person who already maintains the company's GitHub org or `.github/` folder. This isn't a new role to invent; it's a small addition to an existing responsibility.
|
|
159
|
-
|
|
160
|
-
## Compliance posture
|
|
161
|
-
|
|
162
|
-
For teams that care about compliance (SOC2, ISO27001, GDPR/CCPA), Weeve is structurally well-positioned:
|
|
163
|
-
|
|
164
|
-
- **Audit trail.** Git history is already an immutable, signed, attributed change log — built in, not a paid feature.
|
|
165
|
-
- **Access control.** CODEOWNERS + branch protection + GitHub teams = real RBAC, audited by an established external service.
|
|
166
|
-
- **Data residency.** Customer's repo = customer's infrastructure = whatever residency they've already configured for source code. No new residency story to defend.
|
|
167
|
-
- **Encryption.** GitHub's repo-at-rest encryption applies; transit is HTTPS. Same for any git-based backend.
|
|
168
|
-
- **Backup.** Git is inherently distributed; backup is built in via every clone.
|
|
169
|
-
- **Vendor risk.** BYO-everything means data stays in the adopter's infrastructure. No new vendor to evaluate for data handling.
|
|
170
|
-
|
|
171
|
-
Adopters who need compliance stories (SOC2, vendor risk questionnaires) get one for free from the git-native architecture.
|
|
172
|
-
|
|
173
|
-
|