@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,685 @@
|
|
|
1
|
+
---
|
|
2
|
+
schema: signals
|
|
3
|
+
version: v0.4
|
|
4
|
+
date: 2026-05-26
|
|
5
|
+
status: active
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Signals schema — v0.4
|
|
9
|
+
|
|
10
|
+
*Authoritative versioned spec for the signals file format that all roads produce and Pilot reads.*
|
|
11
|
+
|
|
12
|
+
This document is the authoritative spec. Every road's signals skill writes a file that conforms to this shape. `/pilot-priorities` reads those files and trusts them — it does not re-evaluate upstream sources. If a road's output diverges from this spec, Pilot's merge step degrades silently.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## 1. File naming convention
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
weeve/<road>/<road>-signals.md
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
| Road | File path |
|
|
23
|
+
|---|---|
|
|
24
|
+
| Compass | `weeve/compass/compass-signals.md` |
|
|
25
|
+
| Layers+ | `weeve/layers-plus/layers-plus-signals.md` |
|
|
26
|
+
| Ally | `weeve/ally/ally-signals.md` |
|
|
27
|
+
| Rubric | `weeve/rubric/rubric-signals.md` |
|
|
28
|
+
| Maven | `weeve/maven/maven-signals.md` |
|
|
29
|
+
| Forge | `weeve/forge/forge-signals.md` |
|
|
30
|
+
| Helm | `weeve/helm/helm-signals.md` |
|
|
31
|
+
| Verify | `weeve/verify/verify-signals.md` |
|
|
32
|
+
| Guard | `weeve/guard/guard-signals.md` |
|
|
33
|
+
| Charter | `weeve/charter/charter-signals.md` |
|
|
34
|
+
| Anchor | `weeve/anchor/anchor-signals.md` |
|
|
35
|
+
| Ledger | `weeve/ledger/ledger-signals.md` |
|
|
36
|
+
| Roster | `weeve/roster/roster-signals.md` |
|
|
37
|
+
| Pitch | `weeve/pitch/pitch-signals.md` |
|
|
38
|
+
|
|
39
|
+
The filename is stable across re-runs. The skill overwrites in place; the roadmap always reads the latest snapshot.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 2. Required sections
|
|
44
|
+
|
|
45
|
+
Every signals file must contain these sections, in this order:
|
|
46
|
+
|
|
47
|
+
1. **Summary block** — open findings counts by severity, current bottleneck, 1–2 sentence strategy statement
|
|
48
|
+
2. **Tier 1** — act now (🔴 High findings or Compass T1 moves)
|
|
49
|
+
3. **Tier 2** — plan for (🟡 Medium or Compass T2)
|
|
50
|
+
4. **Tier 3** — watch (🟢 Low or Compass T3)
|
|
51
|
+
5. **What's working — don't disrupt** — strengths the signals preserve
|
|
52
|
+
6. **Manual checks required** — findings that need live testing or operator judgement
|
|
53
|
+
7. **Out of scope / accepted exceptions** — deferred items with rationale and revisit trigger
|
|
54
|
+
|
|
55
|
+
Optional sections (present in some roads, allowed in all):
|
|
56
|
+
|
|
57
|
+
- **Cross-pillar citations** — where this road's findings link to other roads
|
|
58
|
+
- **Validation gaps** (Maven) — assumptions under 🔴 / 🟡 items not yet tested
|
|
59
|
+
- **Evidence trace** (Compass) — source row IDs, confidence ratings, external signal count
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## 3. Finding ID format
|
|
64
|
+
|
|
65
|
+
Finding IDs must be stable across re-runs. If a finding is re-run and the underlying issue is unchanged, its ID does not change.
|
|
66
|
+
|
|
67
|
+
### Format
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
<PREFIX>-<N>
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Where `<PREFIX>` is a 3-letter road code and `N` is a monotonically increasing integer within the road's namespace. The dash separator is required. IDs are never reused for a different finding.
|
|
74
|
+
|
|
75
|
+
### Registered road prefixes
|
|
76
|
+
|
|
77
|
+
| Road | Prefix | Example |
|
|
78
|
+
|---|---|---|
|
|
79
|
+
| Compass | `CPS` | CPS-1, CPS-2 |
|
|
80
|
+
| Layers+ | `LYR` | LYR-1, LYR-2 |
|
|
81
|
+
| Ally | `ALY` | ALY-1, ALY-2 |
|
|
82
|
+
| Rubric | `RBR` | RBR-1, RBR-2 |
|
|
83
|
+
| Maven | `MVN` | MVN-1, MVN-2 |
|
|
84
|
+
| Forge | `FRG` | FRG-1, FRG-2 |
|
|
85
|
+
| Helm | `HLM` | HLM-1, HLM-2 |
|
|
86
|
+
| Verify | `VFY` | VFY-1, VFY-2 |
|
|
87
|
+
| Guard | `GRD` | GRD-1, GRD-2 |
|
|
88
|
+
| Charter | `CHR` | CHR-1, CHR-2 |
|
|
89
|
+
| Anchor | `ANC` | ANC-1, ANC-2 |
|
|
90
|
+
| Ledger | `LDG` | LDG-1, LDG-2 |
|
|
91
|
+
| Roster | `RST` | RST-1, RST-2 |
|
|
92
|
+
| Pitch | `PCH` | PCH-1, PCH-2 |
|
|
93
|
+
| Felt | `FLT` | FLT-1, FLT-2 |
|
|
94
|
+
|
|
95
|
+
**v0.4 migration from 2-letter prefixes:** Existing findings retain their old IDs until the next re-run of each lane's signals skill. On re-run, skills adopt the new 3-letter prefix. Pilot accepts both old and new prefixes during the transition — it disambiguates by source file. The v0.3 Layers+/Ally `T1-`/`T2-`/`T3-` collision is resolved by this change.
|
|
96
|
+
|
|
97
|
+
**Legacy prefix mapping (for Pilot backwards compatibility):**
|
|
98
|
+
|
|
99
|
+
| Old prefix | New prefix |
|
|
100
|
+
|---|---|
|
|
101
|
+
| `SR` | `CPS` |
|
|
102
|
+
| `T1-`/`T2-`/`T3-` (Layers+) | `LYR` |
|
|
103
|
+
| `T1-`/`T2-`/`T3-` (Ally) | `ALY` |
|
|
104
|
+
| `RR` | `RBR` |
|
|
105
|
+
| `MR` | `MVN` |
|
|
106
|
+
| `FR` | `FRG` |
|
|
107
|
+
| `HR` | `HLM` |
|
|
108
|
+
| `VR` | `VFY` |
|
|
109
|
+
| `GR` | `GRD` |
|
|
110
|
+
| `CR` | `CHR` |
|
|
111
|
+
| `AR` | `ANC` |
|
|
112
|
+
| `LR` | `LDG` |
|
|
113
|
+
| `RO` | `RST` |
|
|
114
|
+
| `PR` | `PCH` |
|
|
115
|
+
| `FL` | `FLT` |
|
|
116
|
+
|
|
117
|
+
**Registering a new road prefix:** add a row to the table above and increment the schema version. All prefixes must be exactly 3 uppercase letters.
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## 4. Canonical finding shape
|
|
122
|
+
|
|
123
|
+
This is the most important section. Every finding — whether written as a heading block (Compass/Maven style) or a table row (Layers+/Ally/Rubric style) — must carry these seven fields (five required, two optional).
|
|
124
|
+
|
|
125
|
+
```
|
|
126
|
+
id · severity · status · location · what's wrong · what to do
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### Field definitions
|
|
130
|
+
|
|
131
|
+
| Field | Required | Description |
|
|
132
|
+
|---|---|---|
|
|
133
|
+
| **id** | Yes | Stable road-prefixed ID in `PREFIX-N` format (see §3). Never changes between re-runs for the same finding. |
|
|
134
|
+
| **severity** | Yes | Road-declared severity name that maps to one of the three framework tiers (see §5). Default road uses 🔴 High / 🟡 Medium / 🟢 Low. |
|
|
135
|
+
| **status** | Yes | Lifecycle position of the finding. Road-declared vocabulary (see §5a). Default: `open` / `in-flight` / `blocked` / `closed`. Severity says *how urgent*; status says *who's holding it and where in the lifecycle*. |
|
|
136
|
+
| **location** | Yes | File path, skill name, zone, route, or surface. Must be specific — not "everywhere" or "the codebase". |
|
|
137
|
+
| **what's wrong** | Yes | One sentence describing the gap, drift, or risk. Describes the current state, not the desired state. |
|
|
138
|
+
| **what to do** | Yes | One concrete action sentence. Describes the fix or move, not the problem. |
|
|
139
|
+
| **evidence trace** | Optional | Source row IDs, confidence ratings, external signal count. Required for Compass lens skills. Recommended for any finding claiming Validated confidence. |
|
|
140
|
+
| **gate-ship** | Optional | `true` / `false` (default: `false`). Set to `true` on findings that must be resolved before `/pilot-ship` proceeds. Only Guard and Verify set this by default; any lane may set it. `/pilot-ship` parses this field across all roads — do not use alternative names (`block`, `block-ship`, etc.). Gate-ship is itself a kind of status flag — roads may extend it with domain-specific blockers (e.g. "blocks discharge", "requires sign-off") declared in their manifest. |
|
|
141
|
+
|
|
142
|
+
### Heading-block format (Compass / Maven)
|
|
143
|
+
|
|
144
|
+
```markdown
|
|
145
|
+
### CPS-1 · Short title
|
|
146
|
+
|
|
147
|
+
**Status:** open
|
|
148
|
+
**Move:** What to do — one concrete sentence
|
|
149
|
+
**Why now:** What erodes or compounds if this is deferred
|
|
150
|
+
**Effort signal:** Low / Medium / High
|
|
151
|
+
**Closes findings:** [finding IDs this move resolves]
|
|
152
|
+
**Evidence:** [source row IDs, confidence, weight — e.g. "P2 (Hypothesis, Central) · 0 external signals"]
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
The `**Move:**` field satisfies **what to do**. The heading title + `**Move:**` context satisfies **what's wrong** (implied from the finding being surfaced at all; "Why now:" makes the gap explicit). The `**Status:**` field uses the lane's effective vocabulary.
|
|
156
|
+
|
|
157
|
+
### Table-row format (Layers+ / Ally / Rubric)
|
|
158
|
+
|
|
159
|
+
```markdown
|
|
160
|
+
| ID | Severity | Status | Location | Finding | What to do | Effort |
|
|
161
|
+
|---|---|---|---|---|---|---|
|
|
162
|
+
| LYR-1 | 🔴 High | open | [zone / file / path] | [one sentence — what's wrong] | [one sentence — what to fix] | M |
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
The columns map directly to the canonical shape. "Effort" is an extension field — allowed in all roads, not required by the schema.
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## 5. Tier definitions and severity mapping
|
|
170
|
+
|
|
171
|
+
The framework defines exactly three tiers. This is a framework-level primitive — all roads map into it.
|
|
172
|
+
|
|
173
|
+
| Tier | Name | Meaning |
|
|
174
|
+
|---|---|---|
|
|
175
|
+
| T1 | Act now (Now) | Validated evidence of active erosion or a blocked user group. Deferring costs more. T1 findings must have at least one Validated input — Hypothesis-only evidence drops to T2. |
|
|
176
|
+
| T2 | Plan for (Next) | Gap or misalignment that will compound. Not urgent today. Schedule deliberately. |
|
|
177
|
+
| T3 | Watch | Could escalate if an external signal changes. Review quarterly or on trigger. |
|
|
178
|
+
|
|
179
|
+
### Severity vocabulary
|
|
180
|
+
|
|
181
|
+
Roads declare their own severity names and map each to one of the three framework tiers. The default startup road uses:
|
|
182
|
+
|
|
183
|
+
| Severity name | Framework tier |
|
|
184
|
+
|---|---|
|
|
185
|
+
| 🔴 High | Now |
|
|
186
|
+
| 🟡 Medium | Next |
|
|
187
|
+
| 🟢 Low | Watch |
|
|
188
|
+
|
|
189
|
+
Compass uses `T1 — Act now` / `T2 — Plan for` / `T3 — Watch` — these map directly.
|
|
190
|
+
|
|
191
|
+
Roads targeting other industries may declare different scales. Example (healthcare/NCQA):
|
|
192
|
+
|
|
193
|
+
```yaml
|
|
194
|
+
severity_vocabulary:
|
|
195
|
+
critical: Now
|
|
196
|
+
high: Now
|
|
197
|
+
medium: Next
|
|
198
|
+
low: Watch
|
|
199
|
+
informational: Watch
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
The mapping is declared in the lane manifest (`lane.yaml`) or inherited from the road manifest (`road.yaml`) — see §8a. Schema validates that every declared severity name maps to exactly one of the three tiers. Pilot reads the effective vocabulary (lane > road > default) to resolve custom severity names.
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## 5a. Status vocabulary
|
|
207
|
+
|
|
208
|
+
Status and severity are orthogonal dimensions:
|
|
209
|
+
|
|
210
|
+
| Dimension | Question | Granularity |
|
|
211
|
+
|---|---|---|
|
|
212
|
+
| Severity | How urgent? | Coarse — maps to 3 framework tiers |
|
|
213
|
+
| Status | Where in the lifecycle? | Fine — varies per lane and industry |
|
|
214
|
+
|
|
215
|
+
The schema defines the primitive: *every finding has a status drawn from the lane's effective vocabulary*. Vocabularies are declared in `lane.yaml` (lane-specific) or inherited from `road.yaml` (road default) — see §8a.
|
|
216
|
+
|
|
217
|
+
### Default status vocabulary
|
|
218
|
+
|
|
219
|
+
The default startup road's `road.yaml` declares:
|
|
220
|
+
|
|
221
|
+
```
|
|
222
|
+
open → in-flight → blocked → closed
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
- **open** — finding identified, not yet acted on
|
|
226
|
+
- **in-flight** — work underway
|
|
227
|
+
- **blocked** — work started but waiting on a dependency or decision
|
|
228
|
+
- **closed** — resolved and verified
|
|
229
|
+
|
|
230
|
+
This is the vocabulary used by all current lanes. No migration required for existing lanes — they already use these terms (previously implicit in §7, now explicit).
|
|
231
|
+
|
|
232
|
+
### Road-declared vocabularies
|
|
233
|
+
|
|
234
|
+
Lanes targeting other domains declare their own status vocabularies in `lane.yaml`. Examples:
|
|
235
|
+
|
|
236
|
+
**Insurance claims:**
|
|
237
|
+
```yaml
|
|
238
|
+
status_vocabulary:
|
|
239
|
+
- draft
|
|
240
|
+
- prepared
|
|
241
|
+
- sent
|
|
242
|
+
- acknowledged
|
|
243
|
+
- accepted
|
|
244
|
+
- paid
|
|
245
|
+
- rejected
|
|
246
|
+
- denied
|
|
247
|
+
- void
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
**Eligibility check:**
|
|
251
|
+
```yaml
|
|
252
|
+
status_vocabulary:
|
|
253
|
+
- pending
|
|
254
|
+
- reviewed
|
|
255
|
+
- success
|
|
256
|
+
- failed
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
Status vocabularies may have branching terminal states (e.g. paid/rejected/denied are all terminal). The schema does not enforce a linear progression — it validates that every finding's status is a member of the lane's effective vocabulary.
|
|
260
|
+
|
|
261
|
+
### Pilot and status
|
|
262
|
+
|
|
263
|
+
Pilot's tier mapping (§7) stays severity-based — it maps findings to Now/Next/Watch by severity, not by status. Status is consumed differently:
|
|
264
|
+
|
|
265
|
+
- **Tapestry** renders two orthogonal axes: Kanban view (grouped by status) + tier rollup (grouped by severity) on the same finding set.
|
|
266
|
+
- **`/pilot-ship`** reads `gate-ship` (a boolean) for blocking decisions, not status directly. However, roads may declare domain-specific gate conditions tied to status (e.g. "blocks discharge" = gate-ship when status is not `acknowledged`).
|
|
267
|
+
- **Triage skills** (`/<lane>-triage`) update status inline — this is where status transitions happen.
|
|
268
|
+
|
|
269
|
+
---
|
|
270
|
+
|
|
271
|
+
## 6. Confidence / evidence notation
|
|
272
|
+
|
|
273
|
+
Use these terms consistently in evidence traces and frontmatter:
|
|
274
|
+
|
|
275
|
+
| Term | Meaning |
|
|
276
|
+
|---|---|
|
|
277
|
+
| **Validated** | Confirmed by observed output, user data, or external signal. Anchors T1 eligibility. |
|
|
278
|
+
| **Working** | Hypothesis that has been partially tested or is grounded in consistent observed behaviour. T2 default. |
|
|
279
|
+
| **Hypothesis** | Assumed but not yet tested. Cannot anchor a T1 finding without at least one Validated or Working co-source. |
|
|
280
|
+
|
|
281
|
+
**Frontmatter usage (Maven pattern, optional for other roads):**
|
|
282
|
+
|
|
283
|
+
```yaml
|
|
284
|
+
foundation: validated | hypothesis | missing
|
|
285
|
+
note: "Built without validated positioning. Treat as working hypothesis."
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
**Finding row usage:**
|
|
289
|
+
|
|
290
|
+
Confidence is expressed in the evidence trace field: `"P2 (Hypothesis, Central) · 0 external signals"`. If a finding has no evidence trace, Pilot assumes Working confidence.
|
|
291
|
+
|
|
292
|
+
---
|
|
293
|
+
|
|
294
|
+
## 7. What Pilot reads — how `/pilot-priorities` consumes this file
|
|
295
|
+
|
|
296
|
+
`/pilot-priorities` reads each road's signals file as the authoritative source. It does not re-evaluate the upstream sources. The signals file is the unit of trust.
|
|
297
|
+
|
|
298
|
+
**Extraction:** Pilot extracts per finding: ID, severity, status, title, brief description, evidence trace. The canonical finding shape (§4) makes this extraction deterministic.
|
|
299
|
+
|
|
300
|
+
**Tier mapping:**
|
|
301
|
+
|
|
302
|
+
Pilot reads each road's severity vocabulary from its manifest (§8a) and maps findings to roadmap tiers. For the default startup road:
|
|
303
|
+
|
|
304
|
+
| Road output | Roadmap tier |
|
|
305
|
+
|---|---|
|
|
306
|
+
| Compass T1 (Act now) | **Now** |
|
|
307
|
+
| 🔴 High from any other road | **Now** |
|
|
308
|
+
| Compass T2 (Plan for) | **Next** |
|
|
309
|
+
| 🟡 Medium from any other road | **Next** |
|
|
310
|
+
| Compass T3 (Watch) | **Watch** |
|
|
311
|
+
| 🟢 Low from any other road | **Watch** |
|
|
312
|
+
| Status: closed or retired | Dropped |
|
|
313
|
+
|
|
314
|
+
For lanes with custom severity vocabularies, Pilot resolves the mapping via `severity_vocabulary` in `lane.yaml` (or inherited from `road.yaml`). An unrecognised severity name is a parse error — Pilot stops and surfaces it.
|
|
315
|
+
|
|
316
|
+
**Status handling:** Pilot drops findings with status `closed`. All other statuses are treated as active. Pilot does not interpret domain-specific status names — it passes them through to the roadmap as metadata for Tapestry rendering.
|
|
317
|
+
|
|
318
|
+
**Validated-input gate:** if an item would land in **Now** but its evidence trace is Hypothesis-only or Assumed-only, Pilot demotes it to **Next** and adds a note. This gate is inherited from `/compass-signals` and applies across all pillars.
|
|
319
|
+
|
|
320
|
+
**De-duplication:** if two roads surface findings that trace to the same source row or gap, Pilot collapses them into one roadmap item and notes that multiple pillars surfaced it. It does not write two items that rest on the same signal.
|
|
321
|
+
|
|
322
|
+
**Conflict detection:** if two roads recommend opposing actions on the same surface, Pilot surfaces the conflict in the **Conflicts surfaced** section and does not silently pick a side.
|
|
323
|
+
|
|
324
|
+
**Malformed file:** if a signals file is structurally unreadable (Pilot cannot extract IDs, tiers, or evidence), Pilot stops and surfaces the parse error. It does not write a degraded roadmap.
|
|
325
|
+
|
|
326
|
+
---
|
|
327
|
+
|
|
328
|
+
## 8a. Manifest hierarchy (`weeve.yaml` → `road.yaml` → `lane.yaml`)
|
|
329
|
+
|
|
330
|
+
Configuration lives at three levels. Each level can override or extend the level above it. Ownership can attach at any level.
|
|
331
|
+
|
|
332
|
+
```
|
|
333
|
+
weeve.yaml (repo root — framework instance)
|
|
334
|
+
└─ road.yaml (per road — a bundle of lanes)
|
|
335
|
+
└─ lane.yaml (per lane — a single domain)
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
### `weeve.yaml` — framework instance (repo root)
|
|
339
|
+
|
|
340
|
+
Declares which roads are installed and repo-level defaults. Tapestry reads this file to discover lanes.
|
|
341
|
+
|
|
342
|
+
```yaml
|
|
343
|
+
# weeve.yaml
|
|
344
|
+
schema_version: "0.4"
|
|
345
|
+
|
|
346
|
+
# Ownership at the framework level (optional — small orgs may set it here)
|
|
347
|
+
# ownership_adapter: codeowners
|
|
348
|
+
|
|
349
|
+
roads:
|
|
350
|
+
- name: startup
|
|
351
|
+
path: roads/startup # contains road.yaml + lane dirs
|
|
352
|
+
# Future: vertical roads
|
|
353
|
+
# - name: healthcare
|
|
354
|
+
# path: roads/healthcare
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
### `road.yaml` — road manifest (per road)
|
|
358
|
+
|
|
359
|
+
A road is a bundle of lanes. The default startup road ships the 14 lanes for tech/startup orgs. Vertical roads (healthcare, legal, finance) would bundle different lane sets.
|
|
360
|
+
|
|
361
|
+
```yaml
|
|
362
|
+
# roads/startup/road.yaml
|
|
363
|
+
name: startup
|
|
364
|
+
description: "14-lane road for tech startups and product teams"
|
|
365
|
+
schema_version: "0.4"
|
|
366
|
+
|
|
367
|
+
# Road-level defaults — lanes inherit these unless they override.
|
|
368
|
+
severity_vocabulary:
|
|
369
|
+
🔴 High: Now
|
|
370
|
+
🟡 Medium: Next
|
|
371
|
+
🟢 Low: Watch
|
|
372
|
+
|
|
373
|
+
status_vocabulary:
|
|
374
|
+
- open
|
|
375
|
+
- in-flight
|
|
376
|
+
- blocked
|
|
377
|
+
- closed
|
|
378
|
+
|
|
379
|
+
# Ownership at the road level (optional)
|
|
380
|
+
# ownership_adapter: codeowners
|
|
381
|
+
|
|
382
|
+
# Lanes bundled in this road
|
|
383
|
+
lanes:
|
|
384
|
+
- name: compass
|
|
385
|
+
path: compass/
|
|
386
|
+
- name: ally
|
|
387
|
+
path: ally/
|
|
388
|
+
- name: guard
|
|
389
|
+
path: guard/
|
|
390
|
+
# ... all 14
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
### `lane.yaml` — lane manifest (per lane)
|
|
394
|
+
|
|
395
|
+
Each lane declares its own prefix, zones, and optionally overrides the road's vocabularies.
|
|
396
|
+
|
|
397
|
+
**Required fields:**
|
|
398
|
+
|
|
399
|
+
```yaml
|
|
400
|
+
# guard/lane.yaml
|
|
401
|
+
name: guard
|
|
402
|
+
domain: security
|
|
403
|
+
finding_prefix: GRD # registered 3-letter prefix (§3)
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
**Optional fields (override road defaults):**
|
|
407
|
+
|
|
408
|
+
```yaml
|
|
409
|
+
# Severity vocabulary — override road default for this lane.
|
|
410
|
+
# Omit to inherit from road.yaml.
|
|
411
|
+
severity_vocabulary:
|
|
412
|
+
critical: Now
|
|
413
|
+
high: Now
|
|
414
|
+
medium: Next
|
|
415
|
+
low: Watch
|
|
416
|
+
informational: Watch
|
|
417
|
+
|
|
418
|
+
# Status vocabulary — override road default for this lane.
|
|
419
|
+
# Omit to inherit from road.yaml.
|
|
420
|
+
status_vocabulary:
|
|
421
|
+
- open
|
|
422
|
+
- in-flight
|
|
423
|
+
- blocked
|
|
424
|
+
- closed
|
|
425
|
+
- accepted-risk # Guard-specific extension
|
|
426
|
+
|
|
427
|
+
# Gate-ship — does this lane block /pilot-ship?
|
|
428
|
+
# Default: false. Set to true for lanes whose critical findings should
|
|
429
|
+
# prevent shipping. See weeve spec/ship-gate.md for the full protocol.
|
|
430
|
+
gate_ship: true # Guard and Verify set this; most lanes don't
|
|
431
|
+
|
|
432
|
+
# Gate-ship extensions — domain-specific blocking conditions beyond the
|
|
433
|
+
# boolean. These declare named blockers that appear in Tapestry and
|
|
434
|
+
# /pilot-ship output.
|
|
435
|
+
gate_ship_extensions:
|
|
436
|
+
- unresolved-critical # Guard: any 🔴 Critical finding
|
|
437
|
+
- accepted-risk-expired # Guard: accepted-risk past review date
|
|
438
|
+
|
|
439
|
+
# Zones — named subdivisions of this lane's work area.
|
|
440
|
+
zones:
|
|
441
|
+
- name: threat-model
|
|
442
|
+
skill_prefix: TM
|
|
443
|
+
- name: supply-chain
|
|
444
|
+
skill_prefix: SC
|
|
445
|
+
- name: appsec
|
|
446
|
+
skill_prefix: AS
|
|
447
|
+
|
|
448
|
+
# Ownership at the lane level (most common granularity)
|
|
449
|
+
ownership_adapter: codeowners
|
|
450
|
+
# ownership_adapter: ldap
|
|
451
|
+
# ownership_adapter: manifest # inline in this file:
|
|
452
|
+
# owners:
|
|
453
|
+
# - team: appsec
|
|
454
|
+
# members: [alice, bob]
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
**Healthcare lane example (overrides everything):**
|
|
458
|
+
|
|
459
|
+
```yaml
|
|
460
|
+
# insurance-billing/lane.yaml
|
|
461
|
+
name: insurance-billing
|
|
462
|
+
domain: claims
|
|
463
|
+
finding_prefix: INS
|
|
464
|
+
|
|
465
|
+
severity_vocabulary:
|
|
466
|
+
critical: Now
|
|
467
|
+
high: Now
|
|
468
|
+
medium: Next
|
|
469
|
+
low: Watch
|
|
470
|
+
informational: Watch
|
|
471
|
+
|
|
472
|
+
status_vocabulary:
|
|
473
|
+
- draft
|
|
474
|
+
- prepared
|
|
475
|
+
- sent
|
|
476
|
+
- acknowledged
|
|
477
|
+
- accepted
|
|
478
|
+
- paid
|
|
479
|
+
- rejected
|
|
480
|
+
- denied
|
|
481
|
+
- void
|
|
482
|
+
|
|
483
|
+
gate_ship: true
|
|
484
|
+
gate_ship_extensions:
|
|
485
|
+
- blocks-discharge # finding blocks patient discharge
|
|
486
|
+
- requires-authorization # finding requires payer auth before proceeding
|
|
487
|
+
|
|
488
|
+
ownership_adapter: ldap
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
**Default startup road — Guard lane.yaml:**
|
|
492
|
+
|
|
493
|
+
```yaml
|
|
494
|
+
name: guard
|
|
495
|
+
domain: security
|
|
496
|
+
finding_prefix: GRD
|
|
497
|
+
gate_ship: true
|
|
498
|
+
gate_ship_extensions:
|
|
499
|
+
- unresolved-critical
|
|
500
|
+
- accepted-risk-expired
|
|
501
|
+
status_vocabulary:
|
|
502
|
+
- open
|
|
503
|
+
- in-flight
|
|
504
|
+
- blocked
|
|
505
|
+
- closed
|
|
506
|
+
- accepted-risk
|
|
507
|
+
```
|
|
508
|
+
|
|
509
|
+
**Default startup road — Verify lane.yaml:**
|
|
510
|
+
|
|
511
|
+
```yaml
|
|
512
|
+
name: verify
|
|
513
|
+
domain: qa
|
|
514
|
+
finding_prefix: VFY
|
|
515
|
+
gate_ship: true
|
|
516
|
+
gate_ship_extensions:
|
|
517
|
+
- release-blocker
|
|
518
|
+
```
|
|
519
|
+
|
|
520
|
+
**Default startup road — Compass lane.yaml (no gate-ship):**
|
|
521
|
+
|
|
522
|
+
```yaml
|
|
523
|
+
name: compass
|
|
524
|
+
domain: strategy
|
|
525
|
+
finding_prefix: CPS
|
|
526
|
+
# gate_ship defaults to false — strategy findings don't block shipping
|
|
527
|
+
```
|
|
528
|
+
|
|
529
|
+
### Inheritance and override rules
|
|
530
|
+
|
|
531
|
+
1. **Severity vocabulary:** lane overrides road. If neither declares one, the framework default applies (🔴/🟡/🟢).
|
|
532
|
+
2. **Status vocabulary:** lane overrides road. If neither declares one, the framework default applies (open/in-flight/blocked/closed).
|
|
533
|
+
3. **Ownership adapter:** resolved at the most specific level declared. Lane > Road > Weeve. If none is set, no ownership routing (findings are unowned).
|
|
534
|
+
4. **`finding_prefix`:** always lane-level. Required. Must be registered in §3.
|
|
535
|
+
5. **`schema_version`:** declared at road level. Lanes inherit it. A lane cannot target a different schema version than its road.
|
|
536
|
+
6. **`gate_ship`:** lane-level. Default `false`. Only lanes that set `true` are consulted by `/pilot-ship`. `gate_ship_extensions` are only meaningful when `gate_ship: true`.
|
|
537
|
+
|
|
538
|
+
### Validation rules
|
|
539
|
+
|
|
540
|
+
1. Every severity name must map to exactly one of: `Now`, `Next`, `Watch`.
|
|
541
|
+
2. Every status value in a finding must be a member of the lane's effective `status_vocabulary` (own or inherited from road).
|
|
542
|
+
3. `finding_prefix` must be registered in §3 — unregistered prefixes are a schema error. All prefixes must be exactly 3 uppercase letters.
|
|
543
|
+
4. `schema_version` must match a published schema version. Roads targeting older schemas are accepted but generate a staleness warning.
|
|
544
|
+
|
|
545
|
+
---
|
|
546
|
+
|
|
547
|
+
## 8b. Current conformance
|
|
548
|
+
|
|
549
|
+
Assessment against the canonical finding shape (§4): id · severity · status · location · what's wrong · what to do.
|
|
550
|
+
|
|
551
|
+
**v0.4 note:** All lanes need to adopt the new 3-letter prefix (`CPS-`, `LYR-`, etc.) and add the `status` column. Conformance below reflects v0.3 state with v0.4 migration notes.
|
|
552
|
+
|
|
553
|
+
### Compass (`/compass-signals`)
|
|
554
|
+
|
|
555
|
+
**Status: Conformant with extensions. Needs v0.4 migration (prefix `SR` → `CPS`, add status field).**
|
|
556
|
+
|
|
557
|
+
Compass uses heading-block format. All canonical fields are present:
|
|
558
|
+
- ID: `SR<N>` prefix, stable. → migrate to `CPS-<N>`.
|
|
559
|
+
- Severity: implied by tier (T1 = High, T2 = Medium, T3 = Watch).
|
|
560
|
+
- Status: not yet present — add `**Status:**` field.
|
|
561
|
+
- Location: "Closes findings: [lens finding IDs]" satisfies location indirectly.
|
|
562
|
+
- What's wrong: `**Why now:**` field.
|
|
563
|
+
- What to do: `**Move:**` field.
|
|
564
|
+
- Evidence trace: present and required.
|
|
565
|
+
|
|
566
|
+
---
|
|
567
|
+
|
|
568
|
+
### Layers+ (`/layers-plus-roadmap`)
|
|
569
|
+
|
|
570
|
+
**Status: Conformant. v0.4 migration complete (prefix `LYR-<N>`, status + location + finding columns present).**
|
|
571
|
+
|
|
572
|
+
- ID: `LYR-<N>` prefix. Stable.
|
|
573
|
+
- Status: present as column.
|
|
574
|
+
- Location: present as column.
|
|
575
|
+
- Finding (what's wrong): present as column.
|
|
576
|
+
- What to do: present as column.
|
|
577
|
+
- Effort: extension field, present.
|
|
578
|
+
|
|
579
|
+
---
|
|
580
|
+
|
|
581
|
+
### Ally (`/ally-plan`)
|
|
582
|
+
|
|
583
|
+
**Status: Conformant with extensions. Needs v0.4 migration (prefix `T1-`/`T2-`/`T3-` → `ALY`, add status column).**
|
|
584
|
+
|
|
585
|
+
- ID: `T1-<N>` / `T2-<N>` / `T3-<N>` → migrate to `ALY-<N>`. Resolves the Layers+/Ally namespace collision.
|
|
586
|
+
- Status: not yet present — add column.
|
|
587
|
+
- Minor gap: "Finding" (what's wrong) not restated inline.
|
|
588
|
+
|
|
589
|
+
---
|
|
590
|
+
|
|
591
|
+
### Rubric (`/rubric-status` → `rubric-signals.md`)
|
|
592
|
+
|
|
593
|
+
**Status: Conformant. Needs v0.4 migration (prefix `RR` → `RBR`, add status field).**
|
|
594
|
+
|
|
595
|
+
- ID: `RR<N>` → migrate to `RBR-<N>`.
|
|
596
|
+
- Status: not yet present — add `**Status:**` field.
|
|
597
|
+
|
|
598
|
+
---
|
|
599
|
+
|
|
600
|
+
### Maven (`/maven-signals`)
|
|
601
|
+
|
|
602
|
+
**Status: Conformant with extensions. Needs v0.4 migration (prefix `MR` → `MVN`, add status field).**
|
|
603
|
+
|
|
604
|
+
- ID: `MR<N>` → migrate to `MVN-<N>`.
|
|
605
|
+
- Status: not yet present — add `**Status:**` field.
|
|
606
|
+
|
|
607
|
+
---
|
|
608
|
+
|
|
609
|
+
### Forge (`/forge-signals`)
|
|
610
|
+
|
|
611
|
+
**Status: Diverges — needs v0.4 migration (prefix `FR` → `FRG`).**
|
|
612
|
+
|
|
613
|
+
Registered prefix: `FR` → `FRG`. Existing divergences (D2, D3, D4, D7) plus v0.4 additions (status field, 3-letter prefix).
|
|
614
|
+
|
|
615
|
+
---
|
|
616
|
+
|
|
617
|
+
### Helm (`/helm-signals`)
|
|
618
|
+
|
|
619
|
+
**Status: Diverges. Needs v0.4 migration (prefix `HR` → `HLM`).**
|
|
620
|
+
|
|
621
|
+
Registered prefix: `HR` → `HLM`. Same divergences as Forge.
|
|
622
|
+
|
|
623
|
+
---
|
|
624
|
+
|
|
625
|
+
### Verify (`/verify-signals`)
|
|
626
|
+
|
|
627
|
+
**Status: Diverges. Needs v0.4 migration (prefix `VR` → `VFY`).**
|
|
628
|
+
|
|
629
|
+
Registered prefix: `VR` → `VFY`. Ship-gate lane.
|
|
630
|
+
|
|
631
|
+
---
|
|
632
|
+
|
|
633
|
+
### Guard (`/guard-signals`)
|
|
634
|
+
|
|
635
|
+
**Status: Diverges. Needs v0.4 migration (prefix `GR` → `GRD`).**
|
|
636
|
+
|
|
637
|
+
Registered prefix: `GR` → `GRD`. Ship-gate lane. `accepted-risk` triage state is a Guard-specific extension.
|
|
638
|
+
|
|
639
|
+
---
|
|
640
|
+
|
|
641
|
+
### Charter, Anchor, Ledger, Roster, Pitch
|
|
642
|
+
|
|
643
|
+
**Status: Scaffold only — signals skills not yet written.**
|
|
644
|
+
|
|
645
|
+
Registered prefixes: `CHR` (Charter), `ANC` (Anchor), `LDG` (Ledger), `RST` (Roster), `PCH` (Pitch). Will adopt v0.4 format from first write.
|
|
646
|
+
|
|
647
|
+
---
|
|
648
|
+
|
|
649
|
+
### Summary table
|
|
650
|
+
|
|
651
|
+
| Road | Prefix | v0.3 state | v0.4 migration |
|
|
652
|
+
|---|---|---|---|
|
|
653
|
+
| Compass | `CPS` | Conformant | Prefix + status field |
|
|
654
|
+
| Layers+ | `LYR` | Conformant | v0.4 complete |
|
|
655
|
+
| Ally | `ALY` | Conformant (minor gap) | Prefix + status (resolves namespace collision) |
|
|
656
|
+
| Rubric | `RBR` | Conformant | Prefix + status field |
|
|
657
|
+
| Maven | `MVN` | Conformant | Prefix + status field |
|
|
658
|
+
| Forge | `FRG` | Diverges (D2/D3/D4/D7) | Prefix + status + reconciliation fixes |
|
|
659
|
+
| Helm | `HLM` | Diverges | Prefix + status + reconciliation fixes |
|
|
660
|
+
| Verify | `VFY` | Diverges | Prefix + status + reconciliation fixes |
|
|
661
|
+
| Guard | `GRD` | Diverges | Prefix + status + reconciliation fixes |
|
|
662
|
+
| Charter | `CHR` | Scaffold | Adopt v0.4 from first write |
|
|
663
|
+
| Anchor | `ANC` | Scaffold | Adopt v0.4 from first write |
|
|
664
|
+
| Ledger | `LDG` | Scaffold | Adopt v0.4 from first write |
|
|
665
|
+
| Roster | `RST` | Scaffold | Adopt v0.4 from first write |
|
|
666
|
+
| Pitch | `PCH` | Scaffold | Adopt v0.4 from first write |
|
|
667
|
+
| Felt | `FLT` | Scaffold | Adopt v0.4 from first write |
|
|
668
|
+
|
|
669
|
+
---
|
|
670
|
+
|
|
671
|
+
## 9. Schema changelog
|
|
672
|
+
|
|
673
|
+
_Section numbers updated in v0.4: former §8 (conformance) is now §8b. §8a (manifest hierarchy) is new._
|
|
674
|
+
|
|
675
|
+
| Version | Date | Change |
|
|
676
|
+
|---|---|---|
|
|
677
|
+
| v0.1 | 2026-05-22 | Initial publication — making the implicit schema explicit. No changes to road skill specs in this version; conformance gaps noted above are addressed as follow-on work. |
|
|
678
|
+
| v0.2 | 2026-05-24 | Register prefixes for 9 new lanes (FR/HR/VR/GR/CR/AR/LR/RO/PR). Add `gate-ship` field to canonical finding shape §4. Add §1 file paths and §8 conformance entries for all new lanes. |
|
|
679
|
+
| v0.3 | 2026-05-24 | Register `FL` prefix for Felt (UX research lane). |
|
|
680
|
+
| v0.4 | 2026-05-26 | **Status as first-class field.** Add `status` to canonical finding shape (§4) — severity and status are now orthogonal dimensions. Roads declare status vocabularies in `road.yaml`. Default vocabulary: open/in-flight/blocked/closed (no migration). **Severity-mapping decoupling.** Roads may declare custom severity names that map to the 3 framework tiers (Now/Next/Watch). Default retains 🔴/🟡/🟢. **3-letter finding prefixes.** All road prefixes migrated from 2-letter to 3-letter codes with dash separator (e.g. `SR1` → `CPS-1`). Resolves the Layers+/Ally `T1-` namespace collision. Legacy prefixes accepted during transition. **Road manifest spec** (§8a): `road.yaml` shape for declaring vocabularies, zones, gate-ship extensions, and ownership adapter. `weeve.yaml` repo-level registry for Tapestry discovery. **Vocabulary: "pack" → "road"** throughout — Lane/Road/Weave metaphor. |
|
|
681
|
+
|
|
682
|
+
---
|
|
683
|
+
|
|
684
|
+
_Maintained in `weeve` repo · `spec/signals-schema.md`_
|
|
685
|
+
_Next review: when any road skill spec is updated to change its finding table shape, or when a new road is added._
|