@ericrisco/rsc 3.6.0 → 3.7.1

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.
@@ -0,0 +1,106 @@
1
+ ---
2
+ name: sales-funnel
3
+ description: "Use when planning the steps from an offer to purchase or booking: pages, transitions, recovery paths and measurement handoffs. NOT writing one page (that is `landing-copy`), running deals (that is `sales-pipeline`) or implementing payment (that is `stripe`)."
4
+ tags: [sales-funnel, vsl, buyer-journey, conversion, checkout, campaign]
5
+ recommends: [customer-research, offer-design, vsl-script, landing-copy, marketing, analytics, stripe]
6
+ origin: risco
7
+ ---
8
+
9
+ # Sales funnel — connect the buying decisions
10
+
11
+ Turn an offer into the smallest coherent route a buyer can complete. Deliver a build brief:
12
+ which steps exist, why each exists, how people leave or recover, and what proves a step completed.
13
+ Do not turn a request for one page into a multi-page campaign.
14
+
15
+ ## Establish the campaign record
16
+
17
+ Read the existing campaign and brand material before asking for missing facts. By default use
18
+ `02-DOCS/wiki/marketing/<campaign>/research.md` and `offer.md`; honor an established location instead.
19
+ Record the offer ID and revision in `funnel.md`, link its source and retain the same evidence IDs.
20
+ Index new campaign artifacts in `02-DOCS/wiki/index.md`. For an explanation-only request, respond
21
+ without saving files. Writing a brief authorizes that brief, not messages, purchases or deployment.
22
+
23
+ An existing offer can be enough; the user need not run another skill just to satisfy a sequence.
24
+ If offer documents conflict, identify the authoritative revision before treating disputed terms as
25
+ publishable. Continue with the undisputed route and visibly unresolved terms. Price, included work,
26
+ conditions and primary action must agree across all downstream handoffs.
27
+
28
+ Establish traffic source, buyer readiness, intended action, delivery method and existing pages.
29
+ Ask only for missing facts that change the route. Distinguish observations from assumptions;
30
+ use `customer-research` for missing buyer evidence and `offer-design` for an unsettled offer.
31
+
32
+ ## Choose the fewest useful steps
33
+
34
+ Each added step needs a buyer reason. Price alone does not decide whether someone needs a call,
35
+ email sequence or checkout. Use the actual buying uncertainty, qualification needs and delivery
36
+ constraints. A free or open-source product can end in a trial, installation or download.
37
+
38
+ | Buyer needs before acting | Route choice |
39
+ | --- | --- |
40
+ | Understand a demonstrated offer and buy | Sales page or VSL → checkout → confirmation/delivery |
41
+ | Assess suitability with a person | Explanation → necessary qualification → booking → confirmation |
42
+ | Learn before deciding, and wants follow-up | Optional resource/capture → delivery → permissioned follow-up → offer |
43
+ | Already understands the offer | Preserve the existing short route; remove repeated explanations |
44
+
45
+ Choose one route and explain the trade-off. Add a complementary offer only when it exists and the
46
+ user's scope includes it; declining must lead onward. A VSL does not require hiding the purchase
47
+ action until a timer expires. Give people who cannot watch a readable way to understand the offer.
48
+
49
+ ## Specify transitions, not just page names
50
+
51
+ For each step write: **entry context; buyer question; information/proof needed; one primary action;
52
+ success condition; next destination; decline/exit; failure/recovery; data collected; implementation owner**.
53
+ Keep the brief about decisions and handoffs. `landing-copy` writes final page text, `vsl-script`
54
+ writes the video, `marketing` writes follow-up, and the existing web stack builds the pages.
55
+
56
+ Attach each consequential claim to its evidence ID and explain the scope of support. A screenshot
57
+ of a feature proves its visible behavior, not the revenue it will generate. Carry missing evidence
58
+ as a draft gap with an owner; never fill the page with fabricated social proof.
59
+
60
+ Where money or access changes hands, map **checkout requested → pending → confirmed or failed**
61
+ separately from the pages showing them. A return URL, button click or thank-you view is not payment
62
+ confirmation. Specify the authoritative success signal as an integration requirement and have
63
+ `stripe` or the chosen provider specialist verify it against current documentation.
64
+
65
+ For pending payments, show status and a way to return or obtain help. For failure/cancellation,
66
+ preserve context and provide a deliberate retry or exit. Refreshes and revisits must not by
67
+ themselves create a new charge or repeat delivery. State the order/booking identity that persists
68
+ across retries, and require deduplication at the operation that fulfills the order. Do not claim a
69
+ hosted provider supports this until checked. Include confirmed-payment/delivery-failure recovery
70
+ when delivery is separate; a buyer should not pay again to retrieve an already-paid purchase.
71
+
72
+ ## Make completion measurable
73
+
74
+ Give `analytics` an event brief, not speculative tracking code. For each important transition name
75
+ the event, its verified trigger, the entity counted, deduplication key, numerator and denominator.
76
+ Separate visits, checkout attempts, confirmed orders and fulfilled orders. Purchase counts come
77
+ from unique confirmed orders, not refreshes or callback deliveries. Report refund/cancellation
78
+ outcomes separately; do not silently redefine initial conversion.
79
+
80
+ State the observation window and attribution limits. If the account has no baseline, mark targets
81
+ unmeasured and collect one before promising a rate or choosing a winner. Route experiment design
82
+ to `ab-testing`; a sample of a few purchases does not establish a causal improvement. Collect only
83
+ data required for the journey and ask the relevant privacy/analytics skills about consent wiring.
84
+
85
+ ## Deliver the brief and reconcile it
86
+
87
+ Deliver the chosen route, per-step decisions, event brief, dependency order and unresolved questions
88
+ with owners. Put payment/delivery uncertainty before cosmetic refinements in the build order.
89
+ Include a continuity check: **offer revision, price, inclusions, conditions, evidence IDs and action**
90
+ must match the page and video assignments. Name each stale artifact and the required correction.
91
+
92
+ Review the journey as a buyer who succeeds, declines, fails, refreshes and comes back later. A
93
+ complete planning brief can still be marked **implementation unverified**. Publication readiness
94
+ requires observed implementation tests; planning alone proves neither charges nor delivery work.
95
+
96
+ ## Failure patterns
97
+
98
+ | Pattern | Repair |
99
+ | --- | --- |
100
+ | More screens are assumed to mean more revenue | Remove steps with no distinct buyer question or existing offer. |
101
+ | Email signup and purchase are mixed into one success rate | Define each conversion and its eligible denominator separately. |
102
+ | A polished page hides an undefined handoff | Name the completion signal, receiving owner and failure path. |
103
+
104
+ ## Orientación (siempre)
105
+
106
+ Habla con la voz de `orient`: frases cortas, una idea por frase, y cada respuesta se entiende sola. Registro técnico o con analogías según `technical_level` en `02-DOCS/wiki/harness/user-profile.md`. Cierra cada turno con el **bloque-brújula** (📍 dónde estás · ➡️ siguiente, terminando en pregunta; ✅ y 🧭 cuando hay algo hecho o decidido). **Nunca termines en seco.** Protocolo completo: skill `orient` → `skills/orient/references/orientation-contract.md`. (Defiere a `suggest` el "¿instalo la skill que falta?".)
@@ -0,0 +1,28 @@
1
+ # Sales funnel evaluation
2
+
3
+ Run routing in fresh sessions using only the skill description. Repeat each positive and negative
4
+ prompt three times; require at least 90% correct majority decisions across the cases. Check that
5
+ each negative case's owner exists in the catalog. Structural eval-lint does not measure routing.
6
+
7
+ For capability, give the complete scenario to independent agents with and without the skill.
8
+ Both arms receive the same source facts and have separate temporary output directories. The
9
+ baseline must not read any skill or this rubric. Randomize output labels and have an independent
10
+ grader score every rubric item with quoted evidence and quality on completeness, actionability,
11
+ correctness and grounding. Use the catalog behavioral scorer; require absolute >= 8.5 and lift >= 1.0.
12
+ Repeat three times for a stable estimate and retain all outputs, scores and failed runs.
13
+
14
+ These are model/human judgments, not deterministic CI. Record run count and uncertainty. No
15
+ behavioral result is claimed by these case definitions. Re-run after description or method changes.
16
+ No shell checker is provided: planning truth and payment-path adequacy need the supplied scenario
17
+ and semantic review, not a grep for headings.
18
+
19
+ ## Initial evaluation — 2026-10-31
20
+
21
+ One capability scenario, one fresh execution per arm, independently blind-graded:
22
+ with skill **9.8/10**, without **9.8/10**, difference **+0.0**.
23
+ The catalog scorer requires absolute >=8.5 and improvement >=1.0. This run
24
+ passed absolute quality but did not meet the improvement threshold.
25
+ This is a single-trial result, not the repeated-trial protocol above or evidence of conversion gains.
26
+ Arms used separate contexts and files; the scorer reported transcript integrity **not checked**.
27
+ The owner authorized release 3.7.0 with the pack’s incomplete behavioral evidence documented.
28
+ The thresholds remain unchanged; release authorization is not an evaluation pass.
@@ -0,0 +1,50 @@
1
+ skill: sales-funnel
2
+
3
+ should_trigger:
4
+ - prompt: "Plan the pages between my video ad and delivery of my paid workshop."
5
+ why: "Owns the multi-step purchase journey and its handoffs."
6
+ - prompt: "Tenemos una VSL y un checkout, pero no sabemos qué mostrar si falla el pago."
7
+ why: "An incomplete failure path is a journey-design problem."
8
+ - prompt: "People watch our pitch, then have nowhere clear to go. Map the next steps."
9
+ why: "A symptom of disconnected steps, without naming a funnel."
10
+ - prompt: "Decide whether this offer needs email capture before the sales page."
11
+ why: "Chooses the minimum useful route based on buyer readiness."
12
+ - prompt: "Make a build brief connecting our landing, booking form and confirmation."
13
+ why: "Specifies transitions and responsibilities across pages."
14
+
15
+ should_not_trigger:
16
+ - prompt: "Rewrite the headline and FAQ of this single landing page."
17
+ route_to: landing-copy
18
+ why: "The route already exists; this is page wording."
19
+ - prompt: "Configure Stripe webhook signature verification."
20
+ route_to: stripe
21
+ why: "Payment integration implementation belongs to the provider skill."
22
+ - prompt: "Set up purchase events in PostHog."
23
+ route_to: analytics
24
+ why: "Instrumentation implementation is not journey planning."
25
+ - prompt: "Write the three emails after our launch announcement."
26
+ route_to: marketing
27
+ why: "Campaign copy is downstream of the route."
28
+
29
+ capability:
30
+ - scenario: >-
31
+ Create a concrete funnel brief, not implementation code, for a live online workshop.
32
+ Offer W1 revision 4 is authoritative: EUR 180 total, one workshop plus recording,
33
+ access after confirmed payment, refund requests accepted until 48 hours before the event.
34
+ The existing landing draft uses revision 3 and says EUR 150 and lifetime coaching.
35
+ Warm subscribers arrive from our newsletter; the approved VSL already presents W1 revision 4.
36
+ Evidence E1 is a permitted screenshot of the actual workshop agenda; no outcome testimonials exist.
37
+ Checkout is hosted, can redirect back before payment is confirmed, and customers can refresh or return later.
38
+ We have no additional product and want the shortest path, with no new email capture.
39
+ The developer needs page purposes, transitions including failed or pending payment,
40
+ delivery handoff, required events and how to measure purchases without counting retries twice.
41
+ There is no conversion baseline. Draft the brief with explicit unresolved integration questions.
42
+ must_include:
43
+ - "Uses W1 revision 4 throughout and explicitly removes the EUR 150/lifetime-coaching claims from the landing handoff."
44
+ - "Keeps a direct route without new capture or an invented upsell, using existing warm audience context."
45
+ - "Separates checkout return, payment pending, confirmed payment and failed/cancelled payment; pending return does not unlock workshop access."
46
+ - "Specifies a safe refresh/return or retry path that preserves order identity and avoids triggering delivery or a new charge solely from a page load."
47
+ - "Links E1 to an agenda/process claim, does not imply it proves buyer outcomes, and states unavailable outcome proof as a gap."
48
+ - "Defines completed-purchase measurement using a confirmed order identity and an explicit denominator; retries and page refreshes are not additional purchases."
49
+ - "Assigns payment/delivery integration and instrumentation questions to implementation handoffs without claiming provider capabilities were verified."
50
+ - "Labels conversion targets as unmeasured and proposes baseline collection rather than an invented expected conversion rate."
@@ -0,0 +1,150 @@
1
+ ---
2
+ name: tidy
3
+ description: "Use when every repository in the workspace must end synced and clean: each one on its default branch, everything pushed, everything pulled, no leftover branches or worktrees. Covers the root repo and every nested repo (child projects). Fires on 'limpia el harness', 'actualiza todo', 'sincroniza todo', 'déjalo todo en main', 'sube y baja todo', 'tidy up the repos', 'sync everything'. NOT upgrading the rsc version (that is `npx @ericrisco/rsc upgrade`), NOT opening isolation for new work (that is `worktrees`), NOT landing one finished branch (that is `ship`)."
4
+ tags: [git, sync, cleanup, branches, worktrees, limpieza, sincronizar, main]
5
+ recommends: [worktrees, ship]
6
+ profiles: [minimal, core, full]
7
+ origin: risco
8
+ ---
9
+
10
+ # tidy — every repo on main, pushed, pulled, nothing left over
11
+
12
+ One request, every repository in the workspace. When it ends, each repo shows the same picture:
13
+
14
+ - the main checkout is on the **default branch**, up to date with the remote;
15
+ - **nothing local is missing from the remote** — no unpushed commit, on any branch;
16
+ - **no worktree and no branch whose work has already landed**, locally or on the remote.
17
+
18
+ The job is cleanup, and cleanup is where work gets lost. So the rule under every step: **delete only
19
+ what is proven to be in the default branch already.** Anything else is pushed, kept and reported —
20
+ never thrown away to make the picture look clean.
21
+
22
+ ## 1. Find the repositories
23
+
24
+ The workspace root, plus every nested git repository below it (child projects keep their own git):
25
+
26
+ ```bash
27
+ git rev-parse --show-toplevel # the root repo, if any
28
+ find . -name .git -maxdepth 4 -not -path '*/node_modules/*' -not -path '*/.worktrees/*'
29
+ ```
30
+
31
+ A `.git` that is a *file* is a linked worktree or a submodule, not a repo of its own: skip it here,
32
+ it is handled from its parent in step 4. Name the list in one line before touching anything.
33
+
34
+ **Never change the working directory into a child repo.** Use `git -C <repo>` and absolute paths.
35
+ Session hooks take the cwd as the project, and a `cd` plants state inside the child.
36
+
37
+ ## 2. Read everything before changing anything
38
+
39
+ Per repo, one pass, no writes except the fetch:
40
+
41
+ ```bash
42
+ git -C <repo> fetch --all --prune --quiet
43
+ git -C <repo> symbolic-ref --short refs/remotes/origin/HEAD # the default branch (origin/main)
44
+ git -C <repo> status --short --branch # current branch, ahead/behind, dirty
45
+ git -C <repo> for-each-ref --format='%(refname:short) %(upstream:short) %(upstream:track)' refs/heads
46
+ git -C <repo> worktree list --porcelain
47
+ git -C <repo> stash list
48
+ gh pr list --state open --json number,headRefName 2>/dev/null # open PRs, when gh is there
49
+ ```
50
+
51
+ No remote at all → the repo cannot be "pushed"; report it and only tidy what is local.
52
+
53
+ ## 3. Classify every item
54
+
55
+ Each branch, worktree and remote branch lands in exactly one row. Decide by the commands, not by
56
+ reading names.
57
+
58
+ | Item | Proof | Action |
59
+ | --- | --- | --- |
60
+ | Worktree whose work landed | `npx @ericrisco/rsc worktrees` calls it safe | `npx @ericrisco/rsc worktrees reap` |
61
+ | Worktree whose directory is gone | `prunable` in the porcelain list | `git -C <repo> worktree prune` |
62
+ | Worktree with live or unsaved work | anything the reaper refuses | keep; report the reaper's reason |
63
+ | Local branch merged into the default | `merge-base --is-ancestor <b> origin/<default>` | `git branch -d <b>` |
64
+ | Local branch squash-merged | its content is in the default (below) | `git branch -D <b>`, tip SHA in the report |
65
+ | Local branch with unlanded commits | neither of the two above | push it (`git push -u origin <b>`), keep it |
66
+ | Remote branch whose content landed | same content check, against `origin/<b>` | delete it, after one confirmation (step 6) |
67
+ | Remote branch with an open PR | `gh pr list` | keep; it is live |
68
+ | Remote branch unlanded, no PR | not in the default, no PR | keep; report it as an open question |
69
+ | Stash | any | keep; report it. Never `stash drop` without a yes |
70
+
71
+ **The content check** (what makes a squash merge count as landed): merge the branch into the default
72
+ in memory and see whether anything changes.
73
+
74
+ ```bash
75
+ git -C <repo> merge-tree --write-tree origin/<default> <branch> | head -1 # resulting tree
76
+ git -C <repo> rev-parse origin/<default>^{tree} # default's tree
77
+ ```
78
+
79
+ Same tree → the branch adds nothing; it has landed. A conflict, a different tree, or a git older
80
+ than 2.38 (no `--write-tree`) → **not proven**, so it is kept. A branch that never carried a commit
81
+ of its own is a live workspace someone just opened, not leftovers: keep it.
82
+
83
+ Never delete the default branch, the current branch of another checkout, or `rsc/knowledge`.
84
+
85
+ ## 4. Act, in this order
86
+
87
+ 1. **Uncommitted changes stop that repo.** Show the files and ask once: commit them, stash them, or
88
+ leave the repo as is. Never commit or discard someone's work in progress on your own. Another
89
+ session working in that checkout (the isolation notice says so) → do not touch its branch or its
90
+ files at all; report it.
91
+ 2. **Push what is only local.** Every branch with unlanded commits goes to the remote. The default
92
+ branch ahead of `origin`: push it if the default branch is open here; if it is protected
93
+ (branches and PRs), move those commits to a branch and open a PR — ask first.
94
+ 3. **Retire what landed.** `npx @ericrisco/rsc worktrees reap` for worktrees (it refuses anything
95
+ that would lose a file, and its refusal stands), `worktree prune`, then the branches from step 3.
96
+ Without rsc in that repo, follow the manual path in `../worktrees/SKILL.md`.
97
+ 4. **Back to the default and pull.** Clean checkout on another branch whose work is pushed →
98
+ `git -C <repo> switch <default>`. Then `git -C <repo> pull --ff-only`. A pull that cannot
99
+ fast-forward means the local default diverged: stop and report, never `reset --hard`.
100
+
101
+ ## 5. What is never done
102
+
103
+ - `reset --hard`, `clean -fdx`, `push --force`, `worktree remove --force`, `stash drop` or `clear` —
104
+ not to make the picture tidy, not on a "probably fine".
105
+ - Deleting a branch or worktree because its name looks old. Only the proofs in step 3 count.
106
+ - Committing straight to a protected default branch.
107
+
108
+ ## 6. Remote branches: one confirmation, for all of them
109
+
110
+ Deleting a remote branch reaches everyone who clones the repo. Collect every remote branch whose
111
+ content landed, across all repos, and ask **once** with the full list:
112
+
113
+ > Remote branches already in main, to delete: `rsc-harness: feat/x, fix/y` · `rsc-brain: feat/z`.
114
+ > ¿Las borro? (sí/no)
115
+
116
+ On yes: `git -C <repo> push origin --delete <b> ...`. On no: keep them and say so in the report.
117
+
118
+ ## 7. The report
119
+
120
+ One table, one row per repo, then the open questions. Only facts you observed in this run.
121
+
122
+ | Repo | Branch | ↑ / ↓ | Worktrees | Local branches | Remote branches | Pending |
123
+ | --- | --- | --- | --- | --- | --- | --- |
124
+ | rsc-harness | main | 0 / 0 | 0 | 0 | 2 deleted | — |
125
+ | rsc-brain | main | 0 / 0 | 1 kept | 1 pushed | — | `feat/z`: live, no PR |
126
+
127
+ Under it: every deleted squash-merged branch with its tip SHA (it can be brought back with
128
+ `git branch <name> <sha>`), and every item kept with the one action that would close it. A repo that
129
+ is not fully clean is reported as not clean, with the reason; a tidy-looking summary that hides one
130
+ kept item is the failure this skill exists to prevent.
131
+
132
+ ## Anti-patterns → STOP
133
+
134
+ | Rationalization | Reality / Fix |
135
+ | --- | --- |
136
+ | "It's an old branch, nobody uses it" | Age proves nothing. Ancestor or same tree, or it stays. |
137
+ | "Squash-merged, so `-D` is fine without checking" | Check the tree first. A branch with one extra commit after the PR looks identical by name. |
138
+ | "The tree is dirty, I'll stash it to switch to main" | That is someone's work. Ask first; a stash is easy to forget for ever. |
139
+ | "Pull failed, I'll `reset --hard origin/main`" | That throws away local commits. Report the divergence instead. |
140
+ | "I'll `cd` into each child to run git" | `git -C <repo>`. A `cd` plants session state inside the child. |
141
+ | "I'll delete the remote branches as I go" | One list, one confirmation, at the end. |
142
+ | "Report says clean; the kept worktree is a detail" | Say what was kept and why. The report is the deliverable. |
143
+
144
+ **Next:** after a clean report there is nothing to hand over. Neighbours: `../worktrees/SKILL.md`
145
+ opens isolation for new work; `../ship/SKILL.md` lands one finished branch; `npx @ericrisco/rsc
146
+ upgrade` updates the harness itself, which is a different "actualiza".
147
+
148
+ ## Orientación (siempre)
149
+
150
+ Habla con la voz de `orient`: frases cortas, una idea por frase, y cada respuesta se entiende sola. Registro técnico o con analogías según `technical_level` en `02-DOCS/wiki/harness/user-profile.md`. Cierra cada turno con el **bloque-brújula** (📍 dónde estás · ➡️ siguiente, terminando en pregunta; ✅ y 🧭 cuando hay algo hecho o decidido). **Nunca termines en seco.** Protocolo completo: skill `orient` → `skills/orient/references/orientation-contract.md`. (Defiere a `suggest` el "¿instalo la skill que falta?".)
@@ -0,0 +1,23 @@
1
+ # Evals — tidy
2
+
3
+ The claim under test is the boundary with three neighbours that also say "update" or "clean":
4
+ `rsc upgrade` (the harness version), `worktrees` (opening isolation) and `ship` (landing one
5
+ branch). The negatives prove the split.
6
+
7
+ ## Triggering
8
+
9
+ Load only `tidy` and run every prompt in 3–5 fresh sessions. A positive passes when `tidy` loads in
10
+ a majority of trials; a negative passes when it stays quiet. Require at least 90% accuracy, and treat
11
+ a trigger on "actualiza rsc a la última versión" as blocking: that one is the same verb, a
12
+ different job.
13
+
14
+ ## Capability
15
+
16
+ Fixture: a workspace with a root repo and two child repos holding, between them, a merge-landed
17
+ branch, a squash-landed branch whose remote is gone, a branch with one unpushed commit, a landed
18
+ worktree, a worktree with an untracked `.env`, and a child checkout left on a feature branch.
19
+
20
+ Pass when, after the run: both landed branches are gone (the squash one with its SHA reported); the
21
+ unpushed branch exists on the remote and locally; the landed worktree is gone; the `.env` worktree is
22
+ still there and reported; every checkout is on `main`, 0 ahead and 0 behind; and no remote branch was
23
+ deleted before the single confirmation. Any lost commit or file fails the run outright.
@@ -0,0 +1,53 @@
1
+ skill: tidy
2
+
3
+ # `tidy` owns the end-of-day sweep across every repo in the workspace: each on its default
4
+ # branch, pushed, pulled, no landed branch or worktree left. Upgrading rsc itself, opening
5
+ # isolation for new work and landing one branch belong to neighbours.
6
+ should_trigger:
7
+ - prompt: "Limpia el harness."
8
+ why: "The owner's own phrase for the whole sweep."
9
+
10
+ - prompt: "Actualiza todo a main en estos proyectos, que esté todo subido y sin ramas."
11
+ why: "Default branch, pushed, no branches: the contract in one sentence."
12
+
13
+ - prompt: "Sube y baja todo y quita los worktrees que sobren."
14
+ why: "Push, pull and retire leftovers across the workspace."
15
+
16
+ - prompt: "Tidy up the repos, I have branches and worktrees everywhere."
17
+ why: "Leftover branches and worktrees across repos, in English."
18
+
19
+ - prompt: "Déjalo todo en main y limpio antes de irme."
20
+ why: "End-of-session state for every repo."
21
+
22
+ - prompt: "Sync everything with GitHub and delete the merged branches."
23
+ why: "Push/pull plus landed-branch cleanup is this skill's whole job."
24
+
25
+ should_not_trigger:
26
+ - prompt: "Actualiza rsc a la última versión."
27
+ route_to: "suggest"
28
+ why: "Upgrading the harness itself is `rsc upgrade`, not a git sweep."
29
+
30
+ - prompt: "Abre un worktree para empezar la feature de pagos."
31
+ route_to: "worktrees"
32
+ why: "Opening isolation for new work is the opposite move."
33
+
34
+ - prompt: "Esta rama ya pasó review, fusiónala."
35
+ route_to: "ship"
36
+ why: "Landing one verified branch is ship."
37
+
38
+ - prompt: "Borra los ficheros temporales y el node_modules del proyecto."
39
+ route_to: "bash-scripting"
40
+ why: "Disk cleanup inside a project is not branch and remote hygiene."
41
+
42
+ capability:
43
+ - scenario: "User says: 'Limpia el harness.' The workspace has a root repo and two child repos. Between them: a branch merged into main, a squash-merged branch whose remote is gone, a branch with one unpushed commit, a worktree whose work landed, a worktree holding an untracked `.env`, and one child checkout left on a clean, pushed feature branch. Another child has an uncommitted edit to README.md."
44
+ must_include:
45
+ - "Lists the repos it found (root plus every nested repo) before changing anything, and runs git with `git -C <repo>` instead of changing directory into a child"
46
+ - "Fetches with prune and reads branches, worktrees, stashes and status for every repo before the first write"
47
+ - "Deletes the merged branch with `git branch -d`, and the squash-merged one only after the content check (merge-tree tree equals the default's tree), reporting its tip SHA"
48
+ - "Pushes the branch with the unpushed commit and keeps it, instead of deleting it"
49
+ - "Retires the landed worktree through `npx @ericrisco/rsc worktrees reap` and keeps the `.env` worktree, reporting the reaper's reason"
50
+ - "Stops on the uncommitted README.md edit and asks (commit, stash or leave) instead of stashing or discarding it on its own"
51
+ - "Switches the clean child checkout back to main and pulls with `--ff-only`"
52
+ - "Asks once, with the full list, before deleting any remote branch"
53
+ - "Ends with one table per repo plus the kept items and the action that would close each, and never uses reset --hard, push --force, clean -fdx or stash drop"
@@ -0,0 +1,96 @@
1
+ ---
2
+ name: vsl-script
3
+ description: "Use when writing or revising a spoken sales video with timed narration, visual cues, supported claims and one next action. NOT writing the surrounding page (that is `landing-copy`) or rendering the video (that is `remotion-video`)."
4
+ tags: [vsl, sales-video, script, storyboard, narration, conversion]
5
+ recommends: [customer-research, offer-design, sales-funnel, landing-copy, remotion-video]
6
+ origin: risco
7
+ ---
8
+
9
+ # VSL script — make the offer understandable on camera
10
+
11
+ Write the words a person will say and the visible evidence that makes them credible. A VSL is a
12
+ video sales letter: it helps a specific viewer understand an offer and take one next action.
13
+ Its deliverable is a production-ready script, not rendered video or a conversion guarantee.
14
+
15
+ ## Load the offer and the viewing situation
16
+
17
+ Read existing brand voice and campaign artifacts. Default to
18
+ `02-DOCS/wiki/marketing/<campaign>/research.md`, `offer.md` and `funnel.md`; reuse an established
19
+ location instead of duplicating them. Identify the authoritative offer ID/revision and retain its
20
+ evidence IDs in the script. Ask only for missing facts that affect the argument: buyer, entry source,
21
+ what they already know, desired action, duration and delivery constraints.
22
+
23
+ The same offer governs price, inclusions, trial conditions, refund terms and CTA destination in the
24
+ page and video. If these disagree, name the stale artifact and correct its handoff; do not choose
25
+ whichever promise sounds stronger. If authority is unresolved, mark the disputed text as draft and
26
+ continue with verified material. Missing testimonials need not block a useful demonstration.
27
+
28
+ Choose the opening for the viewing situation. A viewer arriving from an explanatory email may
29
+ need a concrete demonstration immediately. Someone who does not recognize the problem may need
30
+ context first. Use research-supported objections rather than a compulsory sequence of emotions.
31
+ One action can be buying, booking, trying or installing; a free product needs no invented price.
32
+
33
+ ## Build an argument that can be shown
34
+
35
+ Write a short argument map before the full script: **viewer question → answer → visible support →
36
+ next question**. Spend time on the decision that is hardest to believe. Offer an outline alone only
37
+ when requested, or when a consequential unknown prevents the complete draft.
38
+
39
+ For each claim, retain its source ID, what it actually supports and whether publication is permitted.
40
+ Distinguish a demonstrated function from a measured customer outcome. Keep research-only quotes,
41
+ unapproved names and unsupported numbers outside publishable narration. Rewrite around missing
42
+ proof and list the gap separately; placeholders must not look like actual endorsements.
43
+
44
+ Explain why the product works using its actual behavior or method. Route an unresolved offer or
45
+ differentiation question to `offer-design`; coining a method name is not evidence. Use deadlines,
46
+ capacity limits and guarantees only when they belong to the authoritative offer. A strong reason
47
+ to act can be the demonstrated fit, without manufactured urgency.
48
+
49
+ ## Budget speech and screen time together
50
+
51
+ Establish a planning speech rate from the presenter or an explicit assumption. It is a production
52
+ estimate, not an audience benchmark. Reserve silent demonstrations, pauses and title/end cards
53
+ before allocating speech. Overlapping narration and visuals share elapsed time; silent intervals
54
+ cannot also be counted as narration time.
55
+
56
+ `spoken-word budget = (total seconds − silent seconds) × words per minute / 60`
57
+
58
+ Draft within that budget, then **count the actual spoken words**. Exclude headings, source notes,
59
+ on-screen text and stage directions. Use one stated counting convention consistently (for example,
60
+ whitespace-delimited words). Calculate the resulting speech duration and reconcile scene timings.
61
+ If it overflows, cut repetition or propose more runtime; do not label an impossible script with
62
+ optimistic timestamps. Leave headroom for breathing where the requested timing allows it.
63
+
64
+ Give each scene a start/end time, narration, on-screen text or action, and evidence/asset notes.
65
+ The timeline must cover the intended runtime without unexplained gaps or overlap. Write for a
66
+ single listener, with pronounceable prices and ordinary spoken sentences. Place source IDs in a
67
+ production column, not in the presenter's mouth. Use the same primary action when repeated.
68
+
69
+ ## Hand off a filmable draft
70
+
71
+ Deliver the full script with a brief stating buyer, entry source, offer revision, action, runtime,
72
+ spoken count and timing assumption. Include concrete demonstration/capture instructions, asset
73
+ requirements and a separate list of unsupported claims removed or awaiting evidence/permission.
74
+ For a scene-by-scene production handoff, read [references/storyboard-handoff.md](references/storyboard-handoff.md).
75
+
76
+ Give `landing-copy` a continuity note containing the exact offer terms, action and evidence IDs;
77
+ do not write the surrounding page unless requested. Give production to `remotion-video` or the
78
+ user's chosen editor, with accessibility and playback needs noted. The script may be approved
79
+ while footage, consent or rendering remains pending; report those states separately.
80
+
81
+ When saving is requested or part of the campaign task, write `vsl.md` in the campaign folder and
82
+ link it from `02-DOCS/wiki/index.md`. An explanation-only request writes nothing. After a real
83
+ release, use observed viewing drop-offs and actions as revision evidence; separate hypotheses
84
+ about why people left from the measurements themselves. Experiments belong to `ab-testing`.
85
+
86
+ ## Failure patterns
87
+
88
+ | Pattern | Repair |
89
+ | --- | --- |
90
+ | Narration describes every pixel while the demo races ahead | Let the demonstration carry its evidence; reserve silent viewing time. |
91
+ | A feature screenshot is cited for a savings promise | Narrow the promise to the behavior shown, or obtain outcome evidence. |
92
+ | The spoken price differs from the page | Reconcile both against the identified offer revision before recording. |
93
+
94
+ ## Orientación (siempre)
95
+
96
+ Habla con la voz de `orient`: frases cortas, una idea por frase, y cada respuesta se entiende sola. Registro técnico o con analogías según `technical_level` en `02-DOCS/wiki/harness/user-profile.md`. Cierra cada turno con el **bloque-brújula** (📍 dónde estás · ➡️ siguiente, terminando en pregunta; ✅ y 🧭 cuando hay algo hecho o decidido). **Nunca termines en seco.** Protocolo completo: skill `orient` → `skills/orient/references/orientation-contract.md`. (Defiere a `suggest` el "¿instalo la skill que falta?".)
@@ -0,0 +1,27 @@
1
+ # VSL script evaluation
2
+
3
+ Run routing in fresh sessions using only the skill description. Repeat each positive and negative
4
+ prompt three times; require at least 90% correct majority decisions across the cases. Check actual
5
+ near-miss ownership. Structural eval-lint proves only case shape and route existence.
6
+
7
+ Run the self-contained capability task with and without the skill in independent sessions and
8
+ separate temporary output directories. The baseline must not read skills or rubrics. Blind-grade
9
+ randomized outputs against every must_include item, quoting evidence, plus completeness,
10
+ actionability, correctness and grounding. Score with the catalog behavioral scorer and require
11
+ absolute >= 8.5 and lift >= 1.0. Repeat three times, retain failures and report run count.
12
+
13
+ Independently count spoken words in the final script. Timing feasibility is arithmetic; performance,
14
+ natural delivery and persuasion remain judgments. Do not report a predicted conversion lift as
15
+ evidence. These definitions claim no executed behavioral result. Re-run after method edits.
16
+ There is no grep-based publication gate: source permissions and claim support need semantic review.
17
+
18
+ ## Initial evaluation — 2026-10-31
19
+
20
+ One capability scenario, one fresh execution per arm, independently blind-graded:
21
+ with skill **9.9/10**, without **9.9/10**, difference **+0.0**.
22
+ The catalog scorer requires absolute >=8.5 and improvement >=1.0. This run
23
+ passed absolute quality but did not meet the improvement threshold.
24
+ This is a single-trial result, not the repeated-trial protocol above or evidence of conversion gains.
25
+ Arms used separate contexts and files; the scorer reported transcript integrity **not checked**.
26
+ The owner authorized release 3.7.0 with the pack’s incomplete behavioral evidence documented.
27
+ The thresholds remain unchanged; release authorization is not an evaluation pass.
@@ -0,0 +1,51 @@
1
+ skill: vsl-script
2
+
3
+ should_trigger:
4
+ - prompt: "Write a spoken sales video for the top of my landing page."
5
+ why: "Creates the narration and visual plan for a VSL."
6
+ - prompt: "Quiero explicar mi oferta en vídeo y llevar al espectador a reservar una demo."
7
+ why: "Spanish sales-video request with a single action."
8
+ - prompt: "Our presenter cannot get through this pitch in the promised two minutes. Fix the script."
9
+ why: "Timing feasibility is a script problem even without the VSL label."
10
+ - prompt: "Turn these verified customer objections into a five-minute video sales argument."
11
+ why: "Uses evidence and objections to shape a spoken buying decision."
12
+ - prompt: "Prepare narration, on-screen text and demo cues for our sales video."
13
+ why: "Produces the production handoff rather than rendering footage."
14
+
15
+ should_not_trigger:
16
+ - prompt: "Build the actual video in Remotion from this approved script."
17
+ route_to: remotion-video
18
+ why: "Rendering and code are downstream production work."
19
+ - prompt: "Write the sales page headline, price section and FAQ."
20
+ route_to: landing-copy
21
+ why: "Owns written web copy, not spoken narration."
22
+ - prompt: "Plan the registration and reminder sequence for a live webinar."
23
+ route_to: webinar
24
+ why: "The live event journey has its own owner."
25
+ - prompt: "Set bids and audiences for our Meta video campaign."
26
+ route_to: ads
27
+ why: "Paid acquisition management is not a VSL deliverable."
28
+
29
+ capability:
30
+ - scenario: >-
31
+ Write a complete 60-second spoken VSL for a landing visited by warm email subscribers,
32
+ plus on-screen cues and a short production handoff. The only action is opening a free trial.
33
+ Offer Q2 revision 7: scheduling app, free trial for 14 days, no card needed, then EUR 12/month
34
+ if the customer chooses to subscribe. An older page draft says EUR 9/month and a 30-day trial.
35
+ E1 is a verified product demo showing a customer choosing an available slot and receiving a confirmation;
36
+ it proves those steps work, not time saved. E2 is a private customer interview saying
37
+ "I stopped chasing appointment confirmations", with no permission to quote it publicly.
38
+ No measured time-saving study, customer-count proof, deadline or guarantee exists.
39
+ The founder wants to say "save five hours every week" and to fit a 20-second silent demo inside
40
+ the same 60 seconds. Use a planning pace of 135 spoken words per minute. Produce a feasible draft
41
+ now, explain unsupported claim changes separately, preserve the silent demo, and keep price and trial
42
+ terms aligned with the authoritative offer. Do not write the surrounding landing page.
43
+ must_include:
44
+ - "Delivers actual spoken lines, on-screen cues and a single free-trial action rather than only an outline."
45
+ - "Preserves Q2 revision 7 terms: 14 days, no card, EUR 12/month only on subscription; explicitly flags the old page terms for correction."
46
+ - "Allocates 20 seconds with no narration to the demo and at most 40 seconds to speech, yielding a maximum 90 spoken words at 135 words/minute."
47
+ - "Counts the delivered spoken words, excludes on-screen notes from that count, and gives a timing plan that fits the complete 60 seconds."
48
+ - "Uses E1 only for observable scheduling/confirmation behavior; removes or qualifies the unsupported five-hours claim rather than presenting it as fact."
49
+ - "Does not publish or attribute E2's private quote without permission; records the permission gap separately from publishable narration."
50
+ - "Provides concrete demo capture/visual instructions and source references outside the spoken lines, without claiming a video was rendered."
51
+ - "Uses no invented testimonial, customer count, scarcity deadline or money-back promise."
@@ -0,0 +1,39 @@
1
+ # Make the script filmable
2
+
3
+ Use this reference when the script will go to an editor, presenter or animation tool. Keep a single
4
+ script record; a storyboard is a view of the approved narration, not another independently edited offer.
5
+
6
+ ## Scene contract
7
+
8
+ For each scene, give the editor:
9
+
10
+ - **Time:** elapsed start/end and whether speech overlaps the visual.
11
+ - **Narration:** exact spoken words, or an explicit silent interval.
12
+ - **Screen:** the action to capture and the minimum readable text.
13
+ - **Evidence:** source ID, permitted use and the particular claim supported.
14
+ - **Asset:** existing file/link, capture needed, or unresolved permission.
15
+ - **Transition:** the visual or verbal connection to the next scene.
16
+
17
+ For example, a booking-app scene could show a real test account selecting an available slot and
18
+ receiving confirmation. Its evidence is the recorded behavior. It does not establish an average
19
+ time saving. Use test data and conceal personal customer information in the capture.
20
+
21
+ ## Production decisions
22
+
23
+ Ask about aspect ratio, placement, presenter and visual style only when these are needed and not
24
+ already supplied. A landing embed may need readable interface crops rather than a full desktop
25
+ recording. If no assets exist, mark capture tasks; a proposed screenshot is not an available asset.
26
+
27
+ Provide captions matching the spoken words and a transcript for the surrounding page. Important
28
+ visual-only information needs a text or audio equivalent. Account for this in the timing instead of
29
+ adding narration after the budget is closed. A silent demo can retain its silence with concise,
30
+ readable captions and a descriptive transcript.
31
+
32
+ List production dependencies in execution order: verify offer and permitted claims, collect assets,
33
+ record or synthesize approved narration, assemble scenes, review readable text and captions, then
34
+ test the actual playback and destination. Respect the user's chosen production tools and existing
35
+ authorization; a script request does not authorize buying assets or publishing a video.
36
+
37
+ Before handoff, compare the narration and end card against the linked offer revision. If the offer
38
+ changes after recording, identify affected scenes and page text together. Record what is ready,
39
+ what needs capture and what requires approval; never label the unrendered storyboard a finished film.