@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.
Files changed (98) hide show
  1. package/README.md +75 -19
  2. package/bin/weeve.js +467 -2
  3. package/examples/core/CODEOWNERS.template +9 -0
  4. package/examples/core/README.md +63 -0
  5. package/examples/core/demo/README.md +38 -0
  6. package/examples/core/demo/weeve/ally/ally-intake.md +16 -0
  7. package/examples/core/demo/weeve/compass/compass-intake.md +15 -0
  8. package/examples/core/demo/weeve/layers-plus/figma-notes.md +31 -0
  9. package/examples/core/demo/weeve/layers-plus/layers-plus-intake.md +13 -0
  10. package/examples/core/demo/weeve/rubric/component-inventory.md +42 -0
  11. package/examples/core/demo/weeve/rubric/rubric-intake.md +14 -0
  12. package/examples/core/demo/weeve/shared/competitive.md +28 -0
  13. package/examples/core/demo/weeve/shared/roadmap.md +26 -0
  14. package/examples/core/demo/weeve/shared/weeve-guardrails.md +28 -0
  15. package/examples/core/demo/weeve/shared/weeve-intake.md +18 -0
  16. package/examples/core/demo/weeve/shared/weeve-project.md +33 -0
  17. package/examples/core/demo/weeve.yaml +15 -0
  18. package/examples/core/weeve.yaml +14 -0
  19. package/examples/engineering/CODEOWNERS.template +9 -0
  20. package/examples/engineering/README.md +61 -0
  21. package/examples/engineering/demo/README.md +20 -0
  22. package/examples/engineering/demo/weeve/forge/architecture.md +39 -0
  23. package/examples/engineering/demo/weeve/forge/ci-metrics.md +47 -0
  24. package/examples/engineering/demo/weeve/forge/forge-intake.md +41 -0
  25. package/examples/engineering/demo/weeve/guard/guard-intake.md +17 -0
  26. package/examples/engineering/demo/weeve/helm/helm-intake.md +16 -0
  27. package/examples/engineering/demo/weeve/helm/incidents.md +40 -0
  28. package/examples/engineering/demo/weeve/helm/on-call-runbook.md +33 -0
  29. package/examples/engineering/demo/weeve/shared/roadmap.md +25 -0
  30. package/examples/engineering/demo/weeve/shared/team.md +33 -0
  31. package/examples/engineering/demo/weeve/shared/weeve-guardrails.md +27 -0
  32. package/examples/engineering/demo/weeve/shared/weeve-intake.md +18 -0
  33. package/examples/engineering/demo/weeve/shared/weeve-project.md +29 -0
  34. package/examples/engineering/demo/weeve/verify/coverage-report.md +49 -0
  35. package/examples/engineering/demo/weeve/verify/verify-intake.md +16 -0
  36. package/examples/engineering/demo/weeve.yaml +15 -0
  37. package/examples/engineering/weeve.yaml +14 -0
  38. package/examples/gtm/CODEOWNERS.template +8 -0
  39. package/examples/gtm/README.md +59 -0
  40. package/examples/gtm/demo/README.md +19 -0
  41. package/examples/gtm/demo/weeve/compass/compass-intake.md +15 -0
  42. package/examples/gtm/demo/weeve/maven/maven-intake.md +35 -0
  43. package/examples/gtm/demo/weeve/maven/website-notes.md +33 -0
  44. package/examples/gtm/demo/weeve/pitch/pitch-intake.md +54 -0
  45. package/examples/gtm/demo/weeve/pitch/sales-deck-notes.md +28 -0
  46. package/examples/gtm/demo/weeve/pitch/win-loss-notes.md +40 -0
  47. package/examples/gtm/demo/weeve/shared/competitive.md +30 -0
  48. package/examples/gtm/demo/weeve/shared/roadmap.md +19 -0
  49. package/examples/gtm/demo/weeve/shared/weeve-guardrails.md +24 -0
  50. package/examples/gtm/demo/weeve/shared/weeve-intake.md +18 -0
  51. package/examples/gtm/demo/weeve/shared/weeve-project.md +25 -0
  52. package/examples/gtm/demo/weeve.yaml +22 -0
  53. package/examples/gtm/weeve.yaml +14 -0
  54. package/examples/product/CODEOWNERS.template +10 -0
  55. package/examples/product/README.md +67 -0
  56. package/examples/product/demo/README.md +21 -0
  57. package/examples/product/demo/weeve/ally/ally-intake.md +16 -0
  58. package/examples/product/demo/weeve/compass/compass-intake.md +15 -0
  59. package/examples/product/demo/weeve/felt/felt-intake.md +37 -0
  60. package/examples/product/demo/weeve/felt/user-research.md +68 -0
  61. package/examples/product/demo/weeve/layers-plus/layers-plus-intake.md +14 -0
  62. package/examples/product/demo/weeve/rubric/component-inventory.md +42 -0
  63. package/examples/product/demo/weeve/rubric/rubric-intake.md +14 -0
  64. package/examples/product/demo/weeve/shared/competitive.md +28 -0
  65. package/examples/product/demo/weeve/shared/roadmap.md +32 -0
  66. package/examples/product/demo/weeve/shared/weeve-guardrails.md +27 -0
  67. package/examples/product/demo/weeve/shared/weeve-intake.md +18 -0
  68. package/examples/product/demo/weeve/shared/weeve-project.md +29 -0
  69. package/examples/product/demo/weeve.yaml +21 -0
  70. package/examples/product/weeve.yaml +14 -0
  71. package/examples/strategy/CODEOWNERS.template +8 -0
  72. package/examples/strategy/README.md +59 -0
  73. package/examples/strategy/demo/README.md +19 -0
  74. package/examples/strategy/demo/weeve/compass/compass-intake.md +34 -0
  75. package/examples/strategy/demo/weeve/compass/customer-segments.md +34 -0
  76. package/examples/strategy/demo/weeve/layers-plus/layers-plus-intake.md +15 -0
  77. package/examples/strategy/demo/weeve/maven/maven-intake.md +33 -0
  78. package/examples/strategy/demo/weeve/shared/competitive.md +40 -0
  79. package/examples/strategy/demo/weeve/shared/roadmap.md +29 -0
  80. package/examples/strategy/demo/weeve/shared/weeve-guardrails.md +22 -0
  81. package/examples/strategy/demo/weeve/shared/weeve-intake.md +17 -0
  82. package/examples/strategy/demo/weeve/shared/weeve-project.md +25 -0
  83. package/examples/strategy/demo/weeve.yaml +15 -0
  84. package/examples/strategy/weeve.yaml +14 -0
  85. package/package.json +14 -3
  86. package/spec/contributing-template.md +109 -0
  87. package/spec/readme-template.md +55 -0
  88. package/{docs/shared/SHIP-GATE.md → spec/ship-gate.md} +7 -7
  89. package/spec/signals-schema.md +685 -0
  90. package/spec/weeve-yaml.md +274 -0
  91. package/.github/SECURITY.md +0 -22
  92. package/GOVERNANCE.md +0 -173
  93. package/WORKFLOW.md +0 -354
  94. package/docs/shared/engineering-pack-contract.md +0 -94
  95. package/docs/shared/id-prefix-reference.md +0 -235
  96. package/docs/shared/idea-intake-pattern.md +0 -99
  97. package/docs/shared/lane-conventions.md +0 -207
  98. 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._