Skip to content

Commit f5e5200

Browse files
rdbruhnclaude
andcommitted
evolve: payload-reference-convention — evolution report and cycle artifacts
VINE cycle complete. Captures product verification (all 7 ACs pass, trellis 11/11, tests 30/30), the three-bucket-convention knowledge ADR, and a [Unreleased] CHANGELOG entry. Project resolved and archived. Refs #142, #141, #138 (closed via PR). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent 3b09b15 commit f5e5200

8 files changed

Lines changed: 241 additions & 1 deletion

File tree

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# Shipped skills are self-contained — `references/` is contributor documentation, not a runtime contract
2+
3+
## Status
4+
5+
Accepted — 2026-06-23
6+
Source: workflow/payload-reference-convention · Actor: Rob + Claude
7+
Supersedes: none
8+
9+
## Context
10+
11+
A shipped VINE skill runs with the *consuming* repo as cwd. After the v0.4.0 payload-slimming
12+
(`source: ./plugins/vine`, see `2026-06-23-scope-the-plugin-payload-with-a-plugins-vine-source-dir`),
13+
`references/` is deliberately **not** in the payload — so the ~67 `references/STATE.md` pointers in
14+
shipped skill bodies all resolved to nothing from a consuming repo, and `vine:init` actively *wrote*
15+
dead `references/…` pointers into other repos' README/CLAUDE.md (#142, #141, #138).
16+
17+
Two directions were on the table:
18+
19+
- **(a) Self-contained skills.** Treat `references/STATE.md` as *contributor documentation*. Stop
20+
instructing the runtime to read it; inline whatever a skill genuinely needs via the existing
21+
*operative-copy* pattern (`evolve/SKILL.md` already carried one); cite nothing VINE-source-internal
22+
on a shipped surface.
23+
- **(b) Ship the contract.** Move/copy `references/` *inside* `plugins/vine/` and reference it
24+
portably (`${CLAUDE_PLUGIN_ROOT}/…`, the help-skill Glob). There is no file-level payload
25+
exclusion, so this means physically duplicating the file into the source dir.
26+
27+
## Decision
28+
29+
Take **(a): shipped skills, agents, and hooks are self-contained.** A path on a shipped surface must
30+
fall into exactly one of three buckets:
31+
32+
1. **Payload-internal** (`plugins/vine/`): reference an agent/hook by its **invocable name**; when a
33+
literal path is unavoidable, write `${CLAUDE_PLUGIN_ROOT}/…` — never a bare `agents/…`, `skills/…`,
34+
`hooks/…`.
35+
2. **Consumer working tree** (`.vine/…`, `.vine.local/…`): legitimate runtime paths resolving against
36+
the consumer's cwd — cite as-is.
37+
3. **VINE-source-internal** (`references/…`, repo-root docs, `.claude/…`): does not exist in a
38+
consuming repo — **forbidden** on a shipped surface. Inline what the runtime needs; drop the rest.
39+
40+
Direction (b) was rejected: it partially *reverses* the just-made payload-scope exclusion and accepts
41+
a duplication/sync cost, to ship a file that is contributor documentation in the first place. This is
42+
the **third** time the team has resolved "should VINE ship X?" toward *documentation, not mechanism*
43+
after `2026-06-23-overlay-distribution-is-documentation-not-a-mechanism` and the payload-scope record.
44+
The thread is now a settled heuristic: VINE ships the product, not its own contributor contracts.
45+
46+
The rule itself is the operative authority and lives where every contributor session loads it —
47+
CLAUDE.md "Skill Authoring Conventions" (the three buckets + self-contained rule) and
48+
`references/CONTRACTS.md` "Path resolution by audience" (the why: the #138 two-audience split between
49+
a plugin user's cwd and a contributor's repo root). This record is the durable *judgment* behind that
50+
rule — why (a) beat (b) — not the rule's text.
51+
52+
## Consequences
53+
54+
- 60 `references/` citations removed from skill bodies; runtime-critical content (chiefly the
55+
PROFILE.md `## Domain Expertise` format) inlined via operative-copy. Triage was near-binary: the
56+
vast majority were provenance pointers ("see X for detail"), safe to drop because the runtime-needed
57+
text was already inlined — confirming verify's read that hard dependencies were rare.
58+
- `references/STATE.md` was renamed to `references/CONTRACTS.md` (the file carries the artifact
59+
templates *and* cross-cutting conventions, far broader than "state," which also collided with
60+
*session* state). Historical records (CHANGELOG, dated `.vine/knowledge/` ADRs) were left naming
61+
`STATE.md`, period-accurate.
62+
- A `/trellis` Check 13 guard now fails the build on any bucket-3 path or bare bucket-1 path on a
63+
shipped surface, so the convention can't silently drift back.
64+
- A removed cross-reference can break `/trellis` from the *other* side: Check 10 couples a skill's
65+
pointer phrase to an anchor pair, so deleting a pointer requires deleting its pair (the rename
66+
lockstep, run in reverse). Anchor pairs live in three coupled homes — `trellis-check.sh`,
67+
`trellis.md`, `run-tests.sh` — and move together or the check fails.

.vine/projects/.archive/workflow/payload-reference-convention/.resolved

Whitespace-only changes.

.vine/projects/workflow/payload-reference-convention/CONTEXT.md renamed to .vine/projects/.archive/workflow/payload-reference-convention/CONTEXT.md

File renamed without changes.
Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
# Evolution Report: Payload-Relative Reference Convention
2+
## Date: 2026-06-23
3+
4+
### Product Evolution
5+
6+
#### Acceptance Criteria Results
7+
8+
Cycle-level contract from SPEC.md, mapped to evidence. All pass — verified by grep battery +
9+
`trellis-check.sh` (11/11 skills, exit 0) + `run-tests.sh` (30/30).
10+
11+
| Acceptance criterion (SPEC) | Evidence (slice / commit) |
12+
|---|---|
13+
| `grep references/STATE.md plugins/vine/skills/` returns zero; same for any `references/…` (#142) | Slice 2 — e72f448 (grep: 0 matches) |
14+
| No bare `agents/`, `skills/`, `hooks/` path in a skill body; cross-refs by name or `${CLAUDE_PLUGIN_ROOT}` (#138) | Slice 2 — e72f448 (grep: 0 matches) |
15+
| `references/STATE.md` gone; `references/CONTRACTS.md` present; no live file references `STATE.md`; CHANGELOG + dated ADRs period-accurate | Slice 0 — e75b744 (file moved; 5 CHANGELOG + 6 ADR refs preserved) |
16+
| `vine:init` README (step 4) + CLAUDE.md (step 8) write no `references/…` pointer (#141) | Slice 2 — e72f448 (grep: 0 in init/optimize) |
17+
| Convention documented in CLAUDE.md "Skill Authoring Conventions" + CONTRACTS.md "Reference Legibility" companion | Slice 1 — bc04aef (both homes present) |
18+
| Runtime-critical content inlined; a spot-run of one phase still produces a correct artifact | Slice 2 — e72f448 (PROFILE.md format inlined in verify+evolve; the live navigate session itself + this evolve run are the spot-run) |
19+
| `/trellis` fails on a deliberate `references/…` injection, passes on the corrected tree, does not trip on bucket-2 `.vine/context/…` | Slice 3 — 01db36c (Check 13; 3 CI-parity tests, both directions) |
20+
21+
No **unaccounted** criteria. The three remaining `STATE.md` reference sites are all
22+
period-accurate by design: CHANGELOG (5), this feature's own CONTEXT/SPEC/NAVIGATION, and the
23+
dated `.vine/knowledge/workflow/` ADRs.
24+
25+
#### Spec Deviations
26+
27+
All three were navigate-annotated in SPEC.md addenda — justified, in-scope tactical extensions,
28+
none changing user-facing behavior beyond what the issues' ACs already required:
29+
30+
| Deviation | Slice | Verdict |
31+
|---|---|---|
32+
| `optimize/SKILL.md` also wrote a dead `references/STATE.md` pointer into a consumer CLAUDE.md (spec named only init) | 2 | Justified — required by the zero-`references/` AC regardless; same #141 class as init |
33+
| Removed the navigate/evolve "verification-tier contract" pointer broke `/trellis` Check 10; removed the two stale anchor pairs from all three coupled homes | 2 | Justified — mechanical consequence of pointer removal; CONTRACTS + agent anchors (6 pairs) still resolve |
34+
| Three descriptive bare-payload-path prose mentions reworded (init `skills/<name>/SKILL.md`, init `hooks/hooks.json`, evolve "skills/commands"); plus a prose "skills/agents" despaced for the guard | 2, 3 | Justified — within the #138 no-bare-path AC; the prose `X/Y` despace is a known limitation of Check 13's non-slash-boundary heuristic, documented in the check prose |
35+
36+
#### Follow-Up Items
37+
38+
None new. The cycle closes #142, #141, #138 in full. Two pre-existing, already-tracked notes
39+
remain (not new work this cycle introduced):
40+
- Legacy `.vine/hooks/` fallback warnings in init harden to failures at 0.5 (tracked with the
41+
0.4.0 release; warning-only by design today).
42+
- Version bump (patch vs minor) is a release-time call — see Handoff. A `[Unreleased]` CHANGELOG
43+
entry was staged this cycle.
44+
45+
### Agent Evolution
46+
47+
#### CLAUDE.md Suggestions
48+
49+
None to draft — the convention itself was written into CLAUDE.md "Skill Authoring Conventions"
50+
during Slice 1 (bc04aef), with the rationale in CONTRACTS.md "Path resolution by audience." The
51+
agent-capability gain this cycle is already committed.
52+
53+
#### Skill Suggestions
54+
55+
None. No repeatable scaffold or workflow emerged — this was a one-time convention cleanup.
56+
57+
#### VINE Process Observations
58+
59+
- **Dogfooding meta-note**: this very evolve run executed from a *cached 0.4.0 plugin copy* whose
60+
body still cites `references/STATE.md` — the exact dead-pointer the feature fixes, surviving in
61+
the install cache until the next plugin refresh. A live demonstration of why the convention
62+
matters, and a reminder that contributor sessions should refresh the local plugin install after
63+
editing skills (the dev loop). Transient, no action needed.
64+
- The strictly-sequential 0→1→2→3 slicing held cleanly: rename first meant Slice 2 touched each
65+
citation once against the final name. The one recurring friction was Check 10's anchor coupling
66+
surfacing twice (Slice 0 forward, Slice 2 in reverse) — captured as durable knowledge below.
67+
68+
#### Context Overlay Updates
69+
70+
None. The Check 13 guard is already wired into `trellis-check.sh`, which the `## Validation` block
71+
in `shared.md` already points at — no overlay edit needed.
72+
73+
### User Evolution
74+
75+
#### Engineer Contributions
76+
77+
- **The (a) vs (b) direction call** — choosing "shipped skills are self-contained / `references/`
78+
is contributor-doc" over "ship `references/` into the payload." This was the headline open
79+
question left deliberately open at verify; resolving it toward documentation-not-mechanism
80+
extended an established thread rather than reversing the just-shipped payload-scope decision.
81+
- **The STATE → CONTRACTS rename insight** — recognizing the file's name had outgrown its content
82+
("state" was both too narrow and colliding with session state), folded into Slice 0 so later
83+
edits touched each citation once.
84+
- **The period-accurate historical carve-out** — insisting CHANGELOG and dated ADRs keep saying
85+
`STATE.md`. This is the same instinct applied before (issue freshness, knowledge immutability):
86+
historical records are period-accurate, not drift.
87+
88+
#### Profile Updates
89+
90+
No change. `workflow` stays `confident` — this cycle was convention-cleanup squarely in the
91+
engineer's wheelhouse (they drove the v0.4.0 payload-scope decisions this builds on). No growth
92+
log entry (engineer's call: skip).
93+
94+
#### Claude Memory Suggestions
95+
96+
None surfaced. No new general interaction preference emerged — the cycle ran free-climb,
97+
batch-by-size, consistent with existing recorded preferences.
98+
99+
#### Durable Decisions Distilled
100+
101+
One knowledge record written: `.vine/knowledge/workflow/2026-06-23-shipped-skills-are-self-contained-references-is-contributor-doc.md`
102+
— captures *why* direction (a) beat (b), the non-regenerable judgment CLAUDE.md's rule-text doesn't
103+
preserve. The guard's non-slash-boundary regex heuristic was considered and skipped (recoverable
104+
from the script + comments).
105+
106+
### Handoff Package
107+
108+
#### PR Description
109+
110+
```markdown
111+
## Summary
112+
Shipped VINE skills cited `references/STATE.md` (~67×) and bare `agents/…` paths that don't
113+
exist where the code runs — a skill executes with the *consuming* repo as cwd, and `references/`
114+
isn't in the plugin payload. `vine:init` even wrote those dead pointers into other repos' README
115+
and CLAUDE.md. This establishes one convention — shipped skills are self-contained — and applies
116+
it everywhere, with a guard so it can't drift back. Closes #142, #141, #138.
117+
118+
## Changes
119+
- **Rename** `references/STATE.md``references/CONTRACTS.md` (name now matches the content —
120+
artifact templates plus cross-cutting conventions, not just "state"). Live references updated;
121+
CHANGELOG and dated knowledge ADRs left period-accurate. (e75b744)
122+
- **Document** the three-bucket reference convention in CLAUDE.md and CONTRACTS.md. (bc04aef)
123+
- **Apply** it across 9 skills: ~60 dead `references/` pointers removed (runtime-critical content
124+
inlined), agent citations switched to invocable names, and init/optimize no longer write
125+
VINE-internal pointers into consumer repos. (e72f448)
126+
- **Guard** it: `/trellis` Check 13 fails on any shipped-surface VINE-internal reference. (01db36c)
127+
128+
## Decisions Made
129+
- Direction: `references/` is contributor documentation, not a runtime contract — so it doesn't
130+
ship and the runtime is never told to read it. Honors the payload-scope and overlay-distribution
131+
decisions; no payload duplication.
132+
- Historical records (CHANGELOG, dated ADRs) keep naming `STATE.md` — period-accurate, not drift.
133+
134+
## Testing
135+
- `grep -rn "references/" plugins/vine/skills/` → 0 matches; no bare `agents|skills|hooks/` paths.
136+
- `sh .vine/scripts/trellis-check.sh` → exit 0 (11/11 skills, Check 13 green).
137+
- `sh .vine/scripts/run-tests.sh` → 30/30 (includes 3 new Check 13 tests, both directions).
138+
139+
## Follow-up
140+
None — the three issues are fully closed. Version bump (patch vs minor) is a release-time call;
141+
a `[Unreleased]` CHANGELOG entry is staged.
142+
```
143+
144+
#### Reviewer Notes
145+
146+
- **The rename is the riskiest mechanical bit.** Check 10 in `/trellis` couples a skill's pointer
147+
phrase to an anchor pair living in three places (`trellis-check.sh`, `trellis.md`,
148+
`run-tests.sh`). The rename and the later pointer removals each had to update all three in
149+
lockstep; the green `trellis-check` + 30/30 tests confirm they did.
150+
- **Three navigate addenda go beyond SPEC's named scope** (optimize's consumer pointer, the
151+
removed Check 10 anchor pairs, the despaced prose `X/Y`). All are annotated in SPEC.md and
152+
required by the issues' ACs — not scope creep.
153+
- **Bucket-2 is legitimate.** The shipped `vine-verification` agent reads `.vine/context/shared.md`
154+
(the consumer's working tree) — that's a valid runtime path and Check 13 correctly leaves it
155+
alone. Don't "fix" it.
156+
157+
#### Commit Suggestions
158+
159+
Already committed as 4 slice commits (e75b744, bc04aef, e72f448, 01db36c) plus the navigate close
160+
(c3911f5). The evolve commit adds EVOLUTION.md, the knowledge ADR, the CHANGELOG entry, and the
161+
PROJECT-MAP update.
162+
163+
#### Multi-PR Summary
164+
165+
Not applicable — single PR, no Milestones table. All four slices ship together (tightly coupled;
166+
shipping separately would risk the divergent partial fixes CONTEXT warned against).

.vine/projects/workflow/payload-reference-convention/NAVIGATION.md renamed to .vine/projects/.archive/workflow/payload-reference-convention/NAVIGATION.md

File renamed without changes.

.vine/projects/workflow/payload-reference-convention/PROJECT-MAP.md renamed to .vine/projects/.archive/workflow/payload-reference-convention/PROJECT-MAP.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,4 @@
99
| verify || 2026-06-23 |
1010
| inquire || 2026-06-23 |
1111
| navigate || 2026-06-23 |
12-
| evolve | | |
12+
| evolve | | 2026-06-23 |

.vine/projects/workflow/payload-reference-convention/SPEC.md renamed to .vine/projects/.archive/workflow/payload-reference-convention/SPEC.md

File renamed without changes.

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,13 @@ All notable changes to VINE are documented here. Format follows [Keep a Changelo
44

55
## [Unreleased]
66

7+
### Changed
8+
- **Shipped skills are self-contained (#142, #141, #138)** — A shipped skill runs with the consuming repo as cwd, so its body no longer cites any VINE-source-internal file. The ~60 dead `references/STATE.md` pointers across 9 skills are removed (runtime-critical content inlined via the operative-copy pattern), payload cross-references use invocable names or `${CLAUDE_PLUGIN_ROOT}/…` instead of bare `agents/…` paths, and `vine:init` no longer writes dead `references/…` pointers into a consuming repo's README/CLAUDE.md. The convention is one rule with three buckets — payload-internal, consumer working tree, VINE-source-internal (forbidden on shipped surfaces) — documented in CLAUDE.md "Skill Authoring Conventions" and `references/CONTRACTS.md` "Path resolution by audience."
9+
- **`references/STATE.md` renamed to `references/CONTRACTS.md`** — The file carries the artifact templates and cross-cutting conventions, far broader than "state" (which also collided with the session state it merely documents). Live/operative references updated; historical records (this CHANGELOG, dated `.vine/knowledge/` ADRs) left period-accurate.
10+
11+
### Added
12+
- **Trellis Check 13: shipped-surface reference guard**`/trellis` fails the build on any `references/…` path or bare `agents|skills|hooks/` path in `plugins/vine/{skills,agents,hooks}/`, so the self-contained convention can't silently drift back. Bucket-2 consumer paths (`.vine/…`) and name-based agent references don't trip it.
13+
714
## [0.4.0] - 2026-06-23
815

916
This is the 0.4.0 "platform alignment" cycle — aligning VINE's vocabulary and mechanics with

0 commit comments

Comments
 (0)