@sellable/mcp 0.1.37 → 0.1.38-rc.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.
@@ -761,831 +761,17 @@ Do not:
761
761
 
762
762
  ## Step 3: Generate Message
763
763
 
764
- Read `brief.md`, `lead-review.md`, `lead-sample.json`, optional
765
- `lead-filter.md`, optional `message-prep.md`, and optional
766
- `message-candidate-drafts.md`.
764
+ The full Step 3 detail (~45k chars: message-validation workflow, gold-standard rules, proof inventory, candidate generation, finalizer pass, message-review-decision contract, A+B+C subject shape, token-fill rules, etc.) lives in a dedicated on-demand subskill to keep this entry prompt fast to load.
767
765
 
768
- This branch can run in parallel with Step 2 once `lead-review.md` and
769
- `lead-sample.json` exist. If `lead-filter.md` is not ready yet, draft from the
770
- lead-review message handoff rows, then reconcile after the filter lands.
766
+ When you reach Step 3, **load the dedicated subskill verbatim**:
771
767
 
772
- Write:
773
-
774
- - `message-validation.md`
775
-
776
- Run the `generate-messages` skill in caller-declared `DRY MODE`. Its SKILL.md
777
- holds the full drafting contract (retrieval, proof inventory, candidates,
778
- finalizer pass, voice rules, safety). This step only covers orchestration.
779
- This is not optional: before any write to `message-validation.md`,
780
- `message-review.md`, `approval-packet.md`, or a commit-gate question, the
781
- current run must load the full `generate-messages` prompt. In hosted/from-
782
- scratch runs, load it with chunked `get_subskill_prompt({ subskillName:
783
- "generate-messages", offset, limit })` calls so every tool result stays small
784
- enough for the streamed harness. Start with `offset: 0`; the MCP will apply a
785
- portable default limit when omitted. Keep calling with `offset: nextOffset`
786
- until `hasMore` is false.
787
- In Codex-hosted runs, this is a quality gate, not just provenance: if the
788
- model cannot retrieve the complete prompt or cannot follow the required
789
- gold-standard deliberation flow, stop at `message-review` and ask for
790
- `revise-messaging`. Do not mint the campaign to compensate for weak copy.
791
- Do not hand-write `message-validation.md` from `message-prep.md` or
792
- `message-candidate-drafts.md`. Those files are planning inputs only; the final
793
- message-validation artifact must come from the actual `generate-messages`
794
- prompt path (`get_message_prompt` / `generate-messages`).
795
-
796
- Orchestration requirements:
797
-
798
- - start once real leads exist: `brief.md`, `lead-review.md`, and
799
- `lead-sample.json` are enough to run generate-message
800
- - use only the find-leads message handoff rows as basis examples, e.g.
801
- "prospects 1, 5, and 6 are solid enough to think from"
802
- - if `lead-filter.md` is ready, use it; if it arrives after message drafting,
803
- reconcile before approval and rerun or revise messaging if the selected
804
- winner depended on rows that fail the final filter
805
- - never write `message-validation.md`, render a message review, render an
806
- approval packet, or ask the commit gate until 100% of the real
807
- `generate-messages` prompt has been read
808
- - before `message-review` can recommend `approve-message`, verify
809
- `message-validation.md` contains the full generate-messages shape:
810
- `Gold Standard Strategy Map`, `Proof Inventory`, `Token Fill Rules`,
811
- `Token Adherence Table`, `Angle Drafts`, `Kill / Combine Review`,
812
- `Finalists`, `Finalizer Pass`, `Gold-Standard Quality Gate`,
813
- `Skeptical Prospect Review`, `Winner Gate`, and a raw sendable
814
- `Selected Winner`. If any are missing, recommend `revise-messaging` and do
815
- not continue to approval or mint.
816
- - pass no `campaignId`
817
- - read only `brief.md`, `lead-review.md`, `lead-sample.json`, optional
818
- `lead-filter.md`, and the `gold-standard-*` references. If
819
- `message-prep.md` exists, use it as a
820
- planning cache instead of redoing the same element inventory from scratch. If
821
- `message-candidate-drafts.md` exists, use it as provisional draft input only
822
- after checking its basis rows against the completed `lead-filter.md`, when
823
- available.
824
- - generate 2-3 sample messages inline
825
- - start output with `Mode: DRY MODE (no DB mutation)`
826
- - treat the archived examples as the **quality bar**, not a paste source;
827
- write messages that could plausibly belong in the archive for this motion
828
- - exact-template preservation only applies when the archived winner is the
829
- same company as the brief
830
- - draft 3 internal candidates and run a Finalizer Pass that combines the
831
- best opener, proof sentence, bridge, and CTA across them into one winner
832
- - if all finalists use the same first substantive line, treat the opener
833
- test as failed; compare materially different opener jobs before selecting
834
- a winner, or route to `revise-message`
835
- - the Finalizer Pass must block adjacent repeated copy. Do not let a pain
836
- line and mechanism line reuse the same noun stack unless the second line
837
- adds plainly new buyer value. Merge, translate, bullet, or cut instead.
838
- - the selected winner subject/body must not contain semicolons.
839
- - the selected winner subject must not be generic category copy like
840
- `first LinkedIn campaign`, `quick question`, `outbound`, or `intro`. Prefer the
841
- original gold-standard A + B + C subject shape: a concrete row/company token
842
- plus a concrete workflow/object plus the offer/result, for example
843
- `{{company}} + LinkedIn outbound + Claude/Codex` or
844
- `{{source_post_topic}} + active leads + first message test`. Keep it short,
845
- buyer-native, and free of abstract category nouns.
846
- - A + B + C is a quality shape, not permission to stuff tokens into the
847
- subject. The subject must pique buyer interest and name a buyer-relevant
848
- problem, workflow, or useful artifact. Do not use sender names, founder names,
849
- "Austin's review", "founder call", "demo", "quick call", or similar
850
- sender-centered language in the subject. Do not use a row token in the subject
851
- unless the filled version is natural, lowercase/common-word where appropriate,
852
- and more interesting than the non-tokenized version.
853
- - the selected winner must not contain sender-intro fragments like
854
- `Usama here`, `derm here`, `board-cert derm here`, `[credential] here`,
855
- or `[role] at [company] here`.
856
- - the selected winner must not use generic signal tokens such as
857
- `{{recentSignal}}`, `{{recent_signal}}`, or `{{recent_signal_quote}}`.
858
- Row personalization must use concrete enriched-row fields such as
859
- `{{post_context}}`, `{{comment_summary}}`, `{{profile_summary}}`,
860
- `{{source_post_topic}}`, `{{headline}}`, or `{{row_proof_note}}`, and it
861
- must avoid source-citation phrases like `caught my eye`.
862
- - do not default to founder-to-founder, MD-to-MD, doctor-to-doctor,
863
- peer-call, compare-notes, or similar identity-call CTA framing unless
864
- the user explicitly selected that route or the brief makes it the
865
- approved offer. Even then, the CTA must name the useful return artifact,
866
- preview, teardown, or working session.
867
- - if the message is selling or introducing a product, the selected winner
868
- must make the product plain before asking for time, but the opener must
869
- not sound like homepage copy. A line shaped like `[Product] is a
870
- [category] platform -- feature, feature, feature` is blocked when it reads
871
- like product copy instead of a human note. For command-native products,
872
- describe the buyer job (`launch a LinkedIn campaign from Claude/Codex`)
873
- before category nouns like `platform` or `MCP`.
874
- - pass the Thomas revision filters before writing findings
875
- - immediately after `message-validation.md` is confirmed and reconciled with
876
- `lead-filter.md`, write `message-review.md` and render the slim chat version
877
- inline starting with `Status: message-review` as the first visible line. Do
878
- not put a markdown heading, preface, or summary before that status line.
879
- This is a customer checkpoint optimized for fast approve / revise judgment.
880
- - Chat-vs-file split (this is the rule the user pinned):
881
- - `message-review.md` (the file) keeps the full detail: `Status:
882
- message-review`, `Subject:`, `Tokenized template:`, `Sample prospect fill:` + `Token fill basis:`, `Rendered examples:`, `Good token fill:`,
883
- `Good omit:`, `Bad token fill:`, `Why bad:`, `Fallback if missing:`,
884
- `Token notes:`, `My take:`, `Suggested adjustment:`, `Question:
885
- approve-message or revise-messaging?`, `Recommendation:
886
- approve-message|revise-messaging`. The detailed gold-standard/rule audit
887
- stays in `message-validation.md`. Both files are unchanged in scope and
888
- are still required.
889
- - The chat rendering shows ONLY: `Status: message-review`, `Subject:`,
890
- `Tokenized template:`, `Sample prospect fill:` (with `Token fill basis:`),
891
- `My take:`, `Suggested adjustment:`, `Question: approve-message or
892
- revise-messaging?`, `Recommendation:`. Then `Open artifacts:` links to
893
- `message-review.md` and `message-validation.md` so the user can read the
894
- full token guidance, good/omit/bad examples, and fallbacks if they want
895
- to before deciding.
896
- - Do NOT inline `Rendered examples:`, `Good token fill:`, `Good omit:`,
897
- `Bad token fill:`, `Why bad:`, `Fallback if missing:`, or `Token notes:`
898
- in chat. Those exist in the file and are linked. Keeping them out of
899
- chat is what makes the gate easy to approve or revise on.
900
- - Never ask the message approval question until the slim chat review is fully
901
- visible. A summary like `Message review is ready` or `the draft avoids a
902
- generic pitch` is not enough. The user must see the actual subject, the
903
- actual tokenized message template, one filled sample prospect version with
904
- its token fill basis, your take, and the suggested adjustment before any
905
- `approve-message` / `revise-messaging` question appears. If you catch
906
- yourself wanting to offer `show me message` as a choice, stop: render the
907
- slim chat review first, then ask only `approve-message` or
908
- `revise-messaging`. Include `Open artifacts:` links to `message-review.md`
909
- and `message-validation.md` before the approval question.
910
- - `My take:` and `Suggested adjustment:` are mandatory customer-facing decision
911
- fields, not optional summary text. They must appear after `Token notes:` and
912
- before the question in every rendered message review. They must each be
913
- non-empty, specific to the current message, and useful for one last manual
914
- feedback pass. Never render a message review that jumps straight from token
915
- notes to `Question:` or `Recommendation:`.
916
- - `Tokenized template:` in `message-review.md` must be a tokenized template with supported
917
- enriched-row tokens such as `{{first_name}}`, `{{company}}`,
918
- `{{workflow_context}}`, `{{headline}}`, `{{source_post_topic}}`, or
919
- `{{row_proof_note}}`. It must not be a one-row-only raw sample. It must
920
- include at least one literal `{{...}}` token. Keep only tokens that future
921
- enriched rows can actually fill or safely omit. If you cannot produce a
922
- tokenized template from supported enriched-row fields, stop with
923
- `Recommendation: revise-messaging`.
924
- - `Sample prospect fill:` must render the same template for one named sample
925
- prospect from `lead-sample.json` or the selected row used in
926
- `message-validation.md`. It must show the complete subject and body the
927
- prospect would receive, plus a one-line `Token fill basis:` naming which row
928
- fields filled each token. This is the user-facing proof that the template
929
- works. Do not ask for approval if the user cannot compare the template to a
930
- concrete filled message.
931
- - `{{profile_signal}}` is never a supported customer-facing token. It is an
932
- internal enrichment label and must not appear in `Subject:`, `Tokenized
933
- template:`, `Sample prospect fill:`, rendered examples, `Token notes:`,
934
- `message-validation.md` selected copy, or `approval-packet.md`. If a
935
- profile-derived signal matters, translate it into a buyer-readable derived
936
- token with a clear fill rule, such as `{{workflow_context}}` or
937
- `{{row_proof_note}}`; otherwise omit the line.
938
- - `Rendered examples:` must include at least one `Good token fill:` rendered
939
- message where the row has a clean signal and one `Good omit:` rendered message
940
- where an optional token line is omitted instead of forced. Each example must
941
- be a complete rendered subject + body, not a bullet list of token names or a
942
- single bridge-line fragment. Do not use bracketed instructions, deferred row
943
- notes, or phrases like `approve the selected winner above`.
944
- - `Bad token fill:` must show at least one realistic wrong fill for the current
945
- campaign, followed by `Why bad:`. This teaches the user and the live campaign
946
- runtime what not to do. Examples: overclaiming signal intent (`you are
947
- evaluating Clay` when the only evidence is a post reaction), using forbidden
948
- phrasing (`you engaged with content...` when the approved voice is `raised
949
- your hand in a conversation around...`), forcing a weak optional token,
950
- lowercasing proper nouns, or making row signal sound like AI mail merge.
951
- - `Fallback if missing:` is required for every token in the template. Each
952
- fallback must say exactly what to do when the row lacks clean data: use a
953
- safe segment-level phrase, omit the sentence/line, or route to
954
- `revise-messaging` if omission would break the message. It must include a
955
- concrete example of the fallback behavior, such as `omit the noticed... line`,
956
- `use "operators"`, or `use "your outbound workflow"`. Never leave a token
957
- with "N/A", "unknown", empty braces, bracketed instructions, or a generic
958
- fill that sounds robotic or creepy.
959
- - rendered examples may only use token values that exist in `lead-sample.json`,
960
- `lead-review.md`, `lead-filter.md`, or the selected winner's documented
961
- supported-token plan. Do not invent example values to make the template look
962
- better. If a token is absent, weak, or not a supported enriched-row field,
963
- show the `Good omit:` version instead of filling it.
964
- - token casing must look intentional. Keep proper nouns, recipient names,
965
- company names, product names, acronyms, and the pronoun `I` capitalized in
966
- both the template examples and rendered output. Casual lowercase is allowed
967
- only for static common words when the chosen message voice uses it. Do not
968
- lowercase token values or invent transform syntax like `{{company_lower}}`,
969
- `{{first_name | lower}}`, or bracketed casing instructions.
970
- - Token usage must be intelligent, not decorative. If a tokenized opener reads
971
- like mail merge (`Reaching out because {{reporting_context}} sits in...`,
972
- `your {{role_context}} work`, `saw your {{topic}}`, or similar), rewrite the
973
- base line so the token either sounds like a natural noun phrase or is omitted.
974
- Prefer row-derived tokens that change the reply reason; otherwise use a clean
975
- segment-level line and document why the row token is omitted.
976
- - founder/sender names should not be used as the hook. Mention a founder name
977
- only when the buyer already has a reason to care about that person or when the
978
- user explicitly wants named-founder branding. In normal first-touch copy,
979
- frame the CTA around the useful return artifact (`map one reporting problem`,
980
- `review one dashboard`, `pressure-test one workflow`) instead of "call with
981
- Austin" or another founder-name CTA.
982
- - message-review hard-fail preflight: before rendering `Status: message-review`,
983
- scan the subject, tokenized template, good-fill example, good-omit example,
984
- `My take`, `Suggested adjustment`, and recommendation. If any of them contain
985
- `felt close enough to send`, `close enough to send`,
986
- `thought this was relevant enough`, `seemed close
987
- enough`, `{{profile_signal}}`, `profile signal`, `is why I thought this might
988
- be relevant`, `Austin's`, a sender/founder name in the subject, a one-row raw
989
- sample under `Tokenized template:`, rendered examples without full copy, a
990
- mail-merge-sounding tokenized opener, missing or empty `My take:`, missing or
991
- empty `Suggested adjustment:`, `My take:` that only says `looks good`,
992
- `strong`, or `approved`, `Suggested adjustment:` that only says `none`, or no
993
- literal `{{...}}` token in `Tokenized template:`, revise the message before
994
- showing it. Do not output
995
- `Recommendation: approve-message` when any hard-fail preflight item is
996
- present.
997
- - `My take` must be 1-3 short bullets or sentences, focused on what a founder
998
- needs to decide: approve as-is, revise once, make it shorter, make it more
999
- specific, change proof, change CTA, or preserve the current length because
1000
- cutting would remove reply reason. If a shorter version is recommended,
1001
- `Suggested adjustment` must say exactly what to remove or compress. Do not
1002
- include a long `What works`, `Gold-standard/rule check`, or internal checklist
1003
- in this checkpoint.
1004
- - `Suggested adjustment` must give the founder a concrete final-edit option even
1005
- when the recommendation is `approve-message`. Use a useful shape like
1006
- `Approve as-is, or revise once to [specific edit] if you want [effect]`. It
1007
- must invite the user to give manual feedback before minting, for example:
1008
- `Reply revise-messaging with the exact line change, proof change, CTA change,
1009
- or tone feedback you want before I build the approval packet.` Do not write
1010
- `none`.
1011
- - if the message is merely plausible, generic, template-shaped, or weaker than
1012
- the loaded gold-standard examples, set `Recommendation: revise-messaging`.
1013
- The next Codex UAT goal is to prove message quality before mint, so no
1014
- approval packet or campaign mutation should happen just because the mechanics
1015
- are working.
1016
- - immediately after rendering `message-review.md`, use the structured question
1017
- gate with exactly two choices, in this order: `approve-message`,
1018
- `revise-messaging`. Stop after the question. Do not write `approval-packet.md`,
1019
- `customer-roleplay.md`, or a commit-gate question until
1020
- `message-review-decision.md` contains `approve-message`.
1021
- - if the selected winner or PS uses named customer/logo proof, quantified proof,
1022
- team credentials, or investor/accelerator proof that is not explicitly
1023
- supported by `brief.md`, `lead-review.md`, `lead-sample.json`, or loaded
1024
- reference material, the review must set `Recommendation: revise-messaging`.
1025
- Do not approve speculative credibility claims.
1026
- - if the selected winner or PS uses vague proof wrappers like `spoken publicly
1027
- about`, `publicly talked about`, `trusted by`, `worked with`, `used by`, or
1028
- bare customer-logo lists without naming a concrete buyer-relevant result,
1029
- mechanism, or risk reducer, the review must set `Recommendation:
1030
- revise-messaging`. Supported logos are not automatically body-worthy proof.
1031
- Translate to a concrete proof line or omit the proof from the message.
1032
- - if customer/logo proof is useful mainly for credibility, prefer a concise PS
1033
- over interrupting the body. The PS must name what the customers used the
1034
- product/service for, not just list logos. If the body already carries buyer
1035
- pain, mechanism, and CTA clearly, adding concrete social proof in the PS is
1036
- allowed when it lowers vendor risk.
1037
- - the selected winner or PS must not use internal labels like `p.s. relevant
1038
- proof:`, `p.s. useful proof:`, `p.s. proof:`, or `p.s. social proof:`.
1039
- Rewrite as a natural aside before asking the user to approve.
1040
- - if the user chooses `revise-messaging`, write `message-review-decision.md`
1041
- with `revise-messaging`, preserve upstream artifacts, delete/regenerate
1042
- only `message-validation.md`, `message-review.md`,
1043
- `message-review-decision.md`, `customer-roleplay.md`, and
1044
- `approval-packet.md`, then rerun this message step.
1045
- - after `message-review-decision.md` contains `approve-message`, write
1046
- `approval-packet.md` in customer-facing order and render the same approval
1047
- packet inline before the commit gate. The approval packet and six-choice
1048
- commit question must appear in the same customer-visible turn. Do not emit a
1049
- standalone commit-gate question. Include a clear `## Message Review` section
1050
- inside the approval packet before `## Approved Message Template`. It should
1051
- summarize the customer checkpoint from `message-review.md` and preserve the
1052
- same literal `My take:`, `Suggested adjustment:`, `Good token fill:`,
1053
- `Good omit:`, `Bad token fill:`, `Why bad:`, `Fallback if missing:`,
1054
- `Token fill basis:`, and `Recommendation:` labels.
1055
- Include `Open artifacts:` links to `approval-packet.md`,
1056
- `message-review.md`, `lead-review.md`, and `brief.md` before the commit-gate
1057
- question.
1058
- - if `message-validation.md` contains an extractable `Selected Winner`, use
1059
- that exact winner as the `## Approved Message Template` in
1060
- `approval-packet.md` and in the campaign brief passed to `create_campaign`.
1061
- Only substitute concrete enriched-prospect-row `{{tokens}}`; do not rewrite
1062
- the copy inline at approval time. Do not use abstract slot tokens like
1063
- `{{hookLine}}`, `{{painLine}}`, `{{productLine}}`, `{{closeLine}}`, or
1064
- `{{psLine}}`, and do not use `{{recent_signal_quote}}`; use fields that exist
1065
- on the enriched prospect row instead.
1066
- - the live body under `## Approved Message Template` must be sender-ready copy.
1067
- Bracketed text in the body is allowed only when it is a fully-specified
1068
- AI-native token (`[ALL_CAPS_NAME — Intent. DO: ... DON'T: ... FALLBACK:
1069
- omit the line.]` — see
1070
- `mcp/sellable/skills/create-campaign/references/ai-native-tokens.md` for the
1071
- contract). Bracketed instruction placeholders that lack a contract are
1072
- BLOCKED — including `[ROW BRIDGE ...]`, `[insert ...]`, `[generated ...]`,
1073
- and any prose that defers per-row composition to a later step without
1074
- giving the model the rules. Either upgrade the placeholder to a full
1075
- AI-native token (Intent / DO / DON'T / FALLBACK), put the per-row rules in
1076
- `## Token Fill Rules` with concrete enriched-row fields, or route to
1077
- `revise-messaging`.
1078
- - `approval-packet.md` and the live campaign brief passed to `create_campaign`
1079
- must include `## Approved Message Template`, `## Token Fill Rules`, and
1080
- `## Token Fill Examples`. `## Token Fill Examples` must copy the approved
1081
- examples from `message-review.md` / `message-validation.md`, including
1082
- `Good token fill:`, `Good omit:`, `Bad token fill:`, `Why bad:`,
1083
- `Fallback if missing:`, and `Token fill basis:`. Do not call
1084
- `create_campaign` if these sections are missing from the campaign brief.
1085
- - `message-validation.md` must not call the winner a canonical template or
1086
- hide per-row generation in bracketed body text. `## Selected Winner` must
1087
- be a real sendable message that could be approved as-is.
1088
- - block awkward bridge phrasing like `felt close enough to send this`,
1089
- `thought this was relevant enough`, or `seemed close enough`. Replace with a
1090
- crisp row-backed bridge using a buyer-readable row-derived token, such as
1091
- `That {{workflow_context}} work is where teams usually need cleaner reporting
1092
- ownership.` If the signal is weak or absent, omit the bridge line entirely.
1093
- - if subject, tokenized template, or rendered examples do not meet the bar,
1094
- `message-review.md` must recommend `revise-messaging`, not `approve-message`.
1095
-
1096
- Do not:
1097
-
1098
- - call `get_campaign`
1099
- - call `get_rows`
1100
- - call `update_cell`
1101
- - call `update_campaign_brief`
1102
- - fetch fresh web or LinkedIn research
1103
- - mutate DB-backed campaign state
1104
-
1105
- `message-validation.md` must contain:
1106
-
1107
- - `Status`
1108
- - `Mode`
1109
- - `Template Used`
1110
- - `Primary Example`
1111
- - `Secondary Influence`
1112
- - `Lead Sample Basis`
1113
- - `Strongest Reply Reason`
1114
- - `Pre-Draft Buyer-Role Analysis`
1115
- - `Campaign Element Pool`
1116
- - `Gold Standard Strategy Map`
1117
- - `Current Campaign Translation`
1118
- - `Element Scoring`
1119
- - `Proof Inventory`
1120
- - `Token Fill Rules`
1121
- - `Token Adherence Table`
1122
- - `Angle Drafts`
1123
- - `Kill / Combine Review`
1124
- - `Finalists`
1125
- - `Candidate Messages`
1126
- - `Finalizer Pass`
1127
- - `Gold-Standard Quality Gate`
1128
- - `Skeptical Prospect Review`
1129
- - `Winner Gate`
1130
- - `Selected Winner`
1131
- - `Findings`
1132
- - `Recommendation`
1133
-
1134
- `approval-packet.md` must contain:
1135
-
1136
- - campaign direction
1137
- - lead source and sample
1138
- - filters and rubrics
1139
- - selected message(s)
1140
- - `## Message Review` with literal `My take:`, `Suggested adjustment:`, and
1141
- `Recommendation:` (`approve-message` or `revise-messaging`). If the message
1142
- is only okay, say so plainly so the user can choose `revise-messaging` at the
1143
- commit gate.
1144
- - `## Approved Message Template`; when `message-validation.md` has a selected
1145
- winner, this section must preserve that selected winner rather than a newly
1146
- drafted approval-template variant
1147
- - risks / caveats
1148
- - next action: the six-choice commit gate
1149
-
1150
- `message-review.md` must contain:
1151
-
1152
- - `Status: message-review`
1153
- - `Subject:` using the approved tokenized A + B + C subject shape
1154
- - `Tokenized template:` followed by the tokenized approved message template
1155
- - `Sample prospect fill:` with one concrete sample prospect's complete rendered
1156
- subject + body and a `Token fill basis:` line
1157
- - `Rendered examples:`
1158
- - `Good token fill:` with a complete concrete rendered subject + body
1159
- - `Good omit:` with a complete concrete rendered subject + body where optional
1160
- row signal is omitted cleanly
1161
- - `Bad token fill:` with a realistic wrong fill for the current campaign
1162
- - `Why bad:` explaining the exact overclaim, unsupported token, weak signal,
1163
- casing mistake, or mail-merge phrasing that makes the bad fill unacceptable
1164
- - `Fallback if missing:` with one concrete fallback or omit example for every
1165
- token in the template
1166
- - `Token notes:` naming which tokens are safe to fill, which optional token line
1167
- should be omitted when absent, and whether the message uses standard sentence
1168
- case or casual lowercase static words
1169
- - `My take:`
1170
- - `Suggested adjustment:` with a concrete final-edit option and explicit
1171
- invitation to give manual feedback before approval
1172
- - `Question: approve-message or revise-messaging?`
1173
- - `Recommendation:` exactly `approve-message` or `revise-messaging`
1174
- - The two-choice structured question gate immediately after the rendered review
1175
-
1176
- `message-review-decision.md` must contain exactly one selected route:
1177
- `approve-message` or `revise-messaging`. It does not authorize DB mutation.
1178
-
1179
- If token sourcing is weak, revise token fill rules or route back to
1180
- `revise-filter` or `revise-message` instead of guessing.
1181
-
1182
- </step_contracts>
1183
-
1184
- <resume_rules>
1185
-
1186
- Phase 84 validation resume:
1187
-
1188
- - No `brief-v1.md` / `brief.md` present -> run `create-campaign-brief`
1189
- - `brief-v1.md` present but no `brief.md` -> copy `brief-v1.md` to `brief.md`,
1190
- then run `find leads`
1191
- - Only `brief.md` present -> compatibility resume: run `find leads`
1192
- - `lead-review.md` + `lead-sample.json` present, but no `lead-filter.md` and
1193
- no `message-validation.md` -> run `filter leads` and `generate message`
1194
- from the same find-leads basis; do not ask the user between them when
1195
- lead-review is confirmed
1196
- - `lead-review.md` + `lead-sample.json` present, but no `lead-filter.md` -> run
1197
- `filter leads`
1198
- - `lead-review.md` + `lead-sample.json` present, but no
1199
- `message-validation.md` -> run `generate message`
1200
- - `lead-filter.md` + `message-validation.md` present -> reconcile message
1201
- basis rows against the final filter, then write/render `message-review.md`
1202
- and ask the two-choice message review gate
1203
- - `message-validation.md` present but no `message-review-decision.md` -> write
1204
- `message-review.md`, render it inline starting with `Status:
1205
- message-review`, then ask `approve-message` vs `revise-messaging`
1206
- - `message-review-decision.md` contains `revise-messaging` -> preserve
1207
- upstream artifacts; delete only `message-validation.md`,
1208
- `message-review.md`, `message-review-decision.md`,
1209
- `customer-roleplay.md`, and `approval-packet.md`; rerun `generate message`
1210
- - `message-review-decision.md` contains `approve-message` but no
1211
- `approval-packet.md` -> write `approval-packet.md`, render that packet inline
1212
- starting with `Status: approval-packet`, then ask the six-choice commit gate
1213
- in the same turn
1214
- - `message-validation.md` + `message-review-decision.md` +
1215
- `approval-packet.md` present -> validation complete,
1216
- render `approval-packet.md` inline starting with `Status: approval-packet`,
1217
- then ask the six-choice commit gate in the same turn
1218
- - `lead-review.md` without `lead-sample.json`, or vice versa -> stop with a
1219
- contract violation
1220
- - `lead-filter.md` without upstream lead artifacts -> stop with a contract violation
1221
-
1222
- Phase 85 commit-gate + atomic-mint resume:
1223
-
1224
- - All validation artifacts present and `message-review-decision.md` contains
1225
- `approve-message` but no `approval-packet.md` yet -> write the approval
1226
- packet, render it inline, then show the commit gate in the same turn (see
1227
- `<commit_gate>` below)
1228
- - `approval-packet.md` present but no `commit-gate-decision.md` -> show the
1229
- approval packet inline and then the commit gate in the same turn; an existing
1230
- positive `customer-roleplay.md` is advisory only
1231
- - `commit-gate-decision.md` is a revision choice or `abort` -> route without
1232
- DB mutation
1233
- - `commit-gate-decision.md` contains `approve` and no `CampaignOffer` minted
1234
- yet -> run atomic mint
1235
- - `CampaignOffer` exists and `currentStep = "auto-execute-leads"` -> resume
1236
- via `create_campaign({ campaignId })` to re-fetch state + `watchUrl`,
1237
- re-surface the watch link using `references/watch-link-handoff.md`, and
1238
- continue into the autonomous tail at Step 13
1239
-
1240
- Phase 85 autonomous-tail resume (Plan 85-02):
1241
-
1242
- - `CampaignOffer.currentStep === "auto-execute-leads"` -> run Step 13
1243
- (import) then advance to `validate-sample`
1244
- - `CampaignOffer.currentStep === "validate-sample"` -> run Step 14 sample
1245
- validation loop. Read the persisted `revisionRound` counter and do NOT
1246
- reset it to 0 on resume
1247
- - `CampaignOffer.currentStep === "auto-execute-messaging"` -> run Step 15
1248
- messaging scale-up
1249
- - `CampaignOffer.currentStep === "awaiting-user-greenlight"` -> Step 16:
1250
- re-surface `watchUrl` + `handoff.orientation` and STOP. Do not call
1251
- `start_campaign` on resume. Wait for UI start or a Claude greenlight
1252
- turn
1253
- - `CampaignOffer.currentStep === "running"` -> campaign is live. Surface
1254
- a "campaign is live" confirmation + `watchUrl`. Do not re-start
1255
-
1256
- On every tail resume, re-surface the `watchUrl` and the current step's
1257
- orientation string (v1 create-campaign watch-mode pattern). Load the
1258
- relevant reference for the active step:
1259
-
1260
- - Step 14 -> `references/sample-validation-loop.md`
1261
- - any escalation path -> `references/escalation-ladder.md`
1262
- - Step 16 -> `references/final-handoff-contract.md`
1263
-
1264
- </resume_rules>
1265
-
1266
- <commit_gate>
1267
-
1268
- After Phase 84 artifacts are complete, show the user a commit gate before any
1269
- DB mutation. Load `references/approval-gate-framing.md` for the full
1270
- framing — especially the approval packet ordering and per-choice draft
1271
- directory effects.
1272
-
1273
- Preconditions (block the gate when missing):
1274
-
1275
- - `brief-v1.md` should exist for from-scratch runs
1276
- - `brief.md` must exist
1277
- - `lead-review.md` must exist
1278
- - `lead-sample.json` must exist
1279
- - `lead-filter.md` must exist
1280
- - `message-validation.md` must exist
1281
- - `message-review.md` must exist
1282
- - `message-review-decision.md` must exist and contain `approve-message`
1283
- - `approval-packet.md` must be written before asking for a commit decision
1284
- - `rubric.json` is optional but strongly preferred
1285
-
1286
- Anchor validation (block `approve` when empty):
1287
-
1288
- - `brief.md` has a non-empty `## Message Thesis`
1289
- - `lead-review.md` status is `confirmed`
1290
- - `lead-sample.json` parses and contains at least one row
1291
- - `lead-filter.md` has `Decision`, `Who We'll Keep`, `Who We'll Exclude`,
1292
- `Pass Rate`, `Recommendation`, and `Implementation Details`
1293
- - `message-validation.md` has `Status: confirmed`, `Mode: DRY MODE (no DB
1294
- mutation)`, a `Selected Winner`, and a non-empty `Token Adherence Table`
1295
- - `message-review.md` has `Status: message-review`, `Subject:`,
1296
- `Tokenized template:` with at least one literal `{{...}}` token,
1297
- `Sample prospect fill:` with a complete rendered subject + body and
1298
- `Token fill basis:`, `Rendered examples:`, `Good token fill:` with a complete
1299
- rendered subject + body, `Good omit:` with a complete rendered subject + body,
1300
- `Bad token fill:`, `Why bad:`, `Fallback if missing:`, `Token notes:`,
1301
- `My take:`, `Suggested adjustment:`, `Question:
1302
- approve-message or revise-messaging?`, and
1303
- `Recommendation: approve-message`
1304
- - `message-review-decision.md` is exactly `approve-message`
1305
-
1306
- Present the approval packet in user-facing order: brief, lead sample, lead
1307
- filter, message validation. Do not dump raw JSON or opaque validation
1308
- anchors at the user.
1309
-
1310
- When rendering the approval packet inline, start it with exactly
1311
- `Status: approval-packet`. Write the same content to `approval-packet.md`
1312
- before showing the gate. The same assistant turn must then use the structured
1313
- question gate with the six commit choices below. In Claude Code, call
1314
- `AskUserQuestion`; in Codex, call `request_user_input` when available. A
1315
- commit-gate question without the inline `Status: approval-packet` packet is
1316
- invalid UX. If a
1317
- customer roleplay is performed, write `customer-roleplay.md` before the final
1318
- choice. A roleplay result that says "looks good", "approve", or equivalent is
1319
- only critique; it does not satisfy the gate. Write `commit-gate-decision.md`
1320
- only after the user/operator makes one explicit choice.
1321
-
1322
- Use the structured question gate with exactly these 6 choices, in this order:
1323
-
1324
- ```text
1325
- approve
1326
- revise-brief
1327
- revise-leads
1328
- revise-rubric
1329
- revise-messaging
1330
- abort
1331
768
  ```
769
+ mcp__sellable__get_subskill_prompt({ subskillName: "create-campaign-v2-generate-message" })
770
+ ```
771
+
772
+ Follow that prompt verbatim. It contains the full message-validation workflow, gold-standard rules, proof inventory, candidate generation, finalizer pass, message-review-decision contract, and all token-fill rules (A+B+C subject shape, Good/Bad token-fill examples, fallback-if-missing logic, tokenized templates).
1332
773
 
1333
- Do not collapse, reorder, or add choices. Do not auto-select.
1334
-
1335
- If the host UI caps options per question, preserve the same six routes with a
1336
- two-question gate: Q1 = `approve`, `revise`, `abort`; Q2 =
1337
- `revise-brief`, `revise-leads`, `revise-rubric`, `revise-messaging`. Do not
1338
- tell the customer this is because of schema/tool limits. In the split form,
1339
- `revise` is only the parent choice for the second question, not a new route.
1340
-
1341
- </commit_gate>
1342
-
1343
- <sender_resolution>
1344
-
1345
- Before atomic mint, the skill needs a concrete sender identity. Resolve
1346
- it in this order — stop at the first step that yields a confirmed
1347
- sender, and NEVER invent / guess / brute-force LinkedIn URLs:
1348
-
1349
- 1. **If the fixture/caller provides `senderIdentity.senderId`**, use it
1350
- directly. Call `get_sender({ senderId })` to confirm it exists in
1351
- the active workspace, then call `enrich_sender({ senderId })` ONCE
1352
- to populate `companySnapshot` + `proofDigest`. Do not call
1353
- `list_senders`, do not guess alternate URLs.
1354
- 2. **Else if the fixture/caller provides a confirmed
1355
- `senderIdentity.linkedinUrl`**, call `enrich_sender({ linkedinUrl
1356
- })` ONCE. If it errors, DO NOT retry with a variation of the URL.
1357
- Fall through to step 3.
1358
- 3. **Else if the caller provides `senderIdentity.name` +
1359
- `companyDomain` (or workspace context), do ONE `WebSearch` pass**
1360
- for the authoritative LinkedIn profile URL ("`{name}` `{company}`
1361
- linkedin"). Use ONLY a URL that appears verbatim in a web search
1362
- result. Never synthesize a URL from the name. If WebSearch returns
1363
- no clean match, escalate to step 4.
1364
- 4. **Else escalate.** Print the available sender context and ask the
1365
- user to resolve (senderId or confirmed linkedinUrl). Do not proceed
1366
- with atomic mint.
1367
-
1368
- Hard rules:
1369
-
1370
- - At most ONE `enrich_sender` retry per run, only when the first
1371
- response was a transient (5xx) error. Do not retry on 400/404 by
1372
- changing the URL.
1373
- - At most ONE `WebSearch` pass per run for sender resolution.
1374
- - NEVER call `enrich_sender` on a lead's LinkedIn URL. `enrich_sender`
1375
- is for the single sender entity only. Lead enrichment happens via
1376
- the Enrich Prospect column in the workflow table.
1377
- - If the fixture's `mustMatchWorkspaceSender` flag is true and the
1378
- resolved sender isn't in the active workspace, ABORT the run with an
1379
- explicit mismatch error.
1380
-
1381
- </sender_resolution>
1382
-
1383
- <atomic_mint>
1384
-
1385
- Only run this sequence when the user picks `approve`. Load
1386
- `references/watch-link-handoff.md` before starting; it owns the watch-link
1387
- surfacing protocol and the partial-mint recovery rules.
1388
-
1389
- Exact sequence:
1390
-
1391
- 1. Read `brief.md` and `rubric.json` from the draft directory.
1392
- 2. Validate anchors one more time. An empty anchor blocks the approve path.
1393
- The brief must include an `## Approved Message Template` section with
1394
- the exact live message template and at least one supported `{{token}}`
1395
- such as `{{first_name}}`. Rendered examples are not enough. The
1396
- Generate Message column switches to template mode only when
1397
- `campaignBrief.content` contains `{{...}}`; without this marker it will
1398
- use full-generation mode and may rewrite the approved message.
1399
- The live template body must contain only sender-ready copy plus supported
1400
- tokens. Two token shapes are allowed:
1401
- - `{{snake_case}}` field-substitution tokens for atomic values that drop
1402
- directly into a fixed slot (greeting, subject, company name).
1403
- - `[ALL_CAPS_NAME — Intent. DO: ... DON'T: ... FALLBACK: omit the line.]`
1404
- AI-native tokens for personalization sentences. The bracket carries
1405
- the contract inline; the model writes a sentence (or omits the line)
1406
- per the inline rules. Full spec:
1407
- `mcp/sellable/skills/create-campaign/references/ai-native-tokens.md`.
1408
- No other bracketed placeholders are allowed — bracketed prose without an
1409
- explicit Intent / DO / DON'T / FALLBACK contract (e.g., `[ROW BRIDGE]`,
1410
- `[insert ...]`, `[generated ...]`) is BLOCKED because it leaves the
1411
- per-row generation under-specified.
1412
- Include `## Token Fill Rules` for every token in the template. Field
1413
- tokens may be row fields such as `{{first_name}}`, `{{company}}`,
1414
- `{{role}}`, `{{headline}}`, `{{profile_summary}}`, `{{post_context}}`,
1415
- `{{comment_summary}}`, `{{source_post_topic}}`, or `{{row_proof_note}}`
1416
- when those exact fields are supported by the row/enrichment data. AI-native
1417
- tokens are listed in the rules table by name and type with a pointer back
1418
- to the inline contract (the rules themselves live inside the bracket — do
1419
- not duplicate them in the table). Do not document static sender identity,
1420
- product name, proof points, casing style, `{{recent_signal_quote}}`, or
1421
- abstract slot tokens such as `{{hookLine}}`, `{{painLine}}`,
1422
- `{{productLine}}`, `{{closeLine}}`, or `{{psLine}}` — those are abstract
1423
- slots without a contract; convert them to AI-native bracket tokens with
1424
- real Intent / DO / DON'T / FALLBACK clauses, or cut them.
1425
- Include `## Token Fill Examples` copied from the approved message review and
1426
- validation artifacts. It must preserve `Good token fill:`, `Good omit:`,
1427
- `Bad token fill:`, `Why bad:`, `Fallback if missing:`, and
1428
- `Token fill basis:` so the minted campaign brief teaches future row
1429
- generation how to fill tokens, what fills are blocked, and what to do when
1430
- row data is missing. If the brief does not contain `## Token Fill Rules` and
1431
- `## Token Fill Examples`, do not call `create_campaign`; route back to
1432
- message review or approval packet generation.
1433
- 3. Call `bootstrap_create_campaign({ flowVersion: "v2" })`. Respect
1434
- `safeToProceed`; on blocking errors, surface and stop.
1435
- 4. Call
1436
- `create_campaign({ campaignBrief, currentStep: "auto-execute-leads" })`.
1437
- The `campaignBrief` argument must preserve the approved message
1438
- template section verbatim, including the `{{tokens}}`.
1439
- If the brief has no supported `{{token}}`, do not call
1440
- `create_campaign`. Fail the approve path and ask for a corrected
1441
- template, unless the user explicitly approved freeform AI-generated
1442
- messages and the tool call sets `messageGenerationMode:
1443
- "ai-generated"`.
1444
- Include `senderIds` when a workspace sender is available. If the
1445
- customer-named sender is not configured in the current UAT workspace,
1446
- use an available workspace sender for the rehearsal and state that
1447
- mismatch in the final runtime notes. Do not silently mint without a
1448
- sender because sequence selection depends on sender tier/settings.
1449
- Capture `{ campaignId, watchUrl }` from the response.
1450
- - If the call errors, surface the error and stop. No rollback needed; no
1451
- campaign exists.
1452
- - If the response is missing `watchUrl`, treat it as a recoverable
1453
- failure. Stop before `save_rubrics`. Do not print a watch link.
1454
- Surface the contract violation explicitly — a missing `watchUrl` is a
1455
- plumbing bug, not a silent skip.
1456
- 5. Call `save_rubrics({ campaignOfferId: campaignId, rubric })` using the
1457
- payload derived from `rubric.json` (or from `lead-filter.md` if
1458
- `rubric.json` is absent).
1459
- - If this call fails after `create_campaign` succeeded, either rollback
1460
- the `CampaignOffer` row, or mark an explicit recoverable failure state
1461
- so the user can retry. Never leave a silent partial campaign. Do NOT
1462
- print the watch link during this recovery window.
1463
- 6. Flip the brief status in the draft to `committed`. Move the draft
1464
- directory from
1465
- `.sellable/create-campaign-v2/drafts/{workspace-slug}/{campaign-slug}/`
1466
- to
1467
- `.sellable/create-campaign-v2/drafts/{workspace-slug}/.committed/{campaign-slug}/`.
1468
- 7. Surface the `watchUrl` using the exact block defined in
1469
- `references/watch-link-handoff.md`. Only print after both
1470
- `create_campaign` AND `save_rubrics` have succeeded.
1471
- 8. Hand off to the autonomous tail (Plan 85-02). Do not run Step 13 lead
1472
- import here.
1473
-
1474
- If the approved lead source exists only as a provider lane in
1475
- `lead-review.md` (for example a Sales Navigator filter/search URL) and no
1476
- live `searchId` or `sourceLeadListId` is present, recreate the approved
1477
- source by calling the matching provider search tool first, then import from
1478
- the returned id. This is replaying the approved lane, not inventing a new
1479
- source. Do not skip import/messages on that basis.
1480
-
1481
- Do NOT call `import_leads` during atomic mint. Full lead sourcing and import
1482
- happen in Plan 85-02 Step 13 after mint.
1483
-
1484
- </atomic_mint>
1485
-
1486
- <revision_routing>
1487
-
1488
- When the user picks a revision choice, do not mint a campaign. Do not print
1489
- a watch link. Route back to the relevant upstream step and reset the draft
1490
- directory per `references/approval-gate-framing.md`:
1491
-
1492
- - `revise-brief` -> back to Phase 83 or Phase 84 depending on what changed.
1493
- Preserve `brief.md`; delete all downstream artifacts.
1494
- - `revise-leads` -> back to Phase 84 `find leads`. Preserve `brief.md`;
1495
- delete lead and downstream artifacts.
1496
- - `revise-rubric` -> back to Phase 84 `filter leads`. Preserve `brief.md`,
1497
- `lead-review.md`, `lead-sample.json`; delete `lead-filter.md`,
1498
- `message-validation.md`, and `rubric.json`.
1499
- - `revise-messaging` -> back to Phase 84 `generate message`. Preserve
1500
- upstream artifacts; delete only `message-validation.md`,
1501
- `message-review.md`, `message-review-decision.md`,
1502
- `customer-roleplay.md`, and `approval-packet.md`.
1503
- - `abort` -> move the draft directory to
1504
- `.sellable/create-campaign-v2/drafts/{workspace-slug}/.aborted/{campaign-slug}-{timestamp}/`.
1505
- No DB rows touched.
1506
-
1507
- Revisions must produce zero DB rows.
1508
-
1509
- </revision_routing>
1510
-
1511
- <boundaries>
1512
-
1513
- Phase 84 (pre-commit-gate) boundary:
1514
-
1515
- Do not create live campaign state during validation. Specifically, do not:
1516
-
1517
- - mint a campaign
1518
- - import leads
1519
- - persist selected lead lists
1520
- - attach downstream assets
1521
- - save remote rubric state
1522
- - move the user into a live execution step
1523
-
1524
- Phase 85 (commit-gate and beyond) boundary:
1525
-
1526
- - The commit gate is the only place in this skill where DB mutation is
1527
- authorized. Do not call `create_campaign`, `save_rubrics`,
1528
- `update_campaign`, or any other mutating tool before the user picks
1529
- `approve`.
1530
- - Revision choices and `abort` must never call a mutating tool.
1531
- - `import_leads` is not part of atomic mint. Defer it to Plan 85-02 Step 13.
1532
- - Never print the `watchUrl` until both `create_campaign` and `save_rubrics`
1533
- have succeeded.
1534
- - Never fabricate or reconstruct the `watchUrl` — capture it from the
1535
- `create_campaign` response.
1536
- - Once a campaign has been minted, every provider search and every
1537
- provider-import call from this skill MUST include the minted
1538
- `campaignOfferId`. This is universal — Prospeo, Sales Nav, Apollo,
1539
- Signal Discovery, and any future provider. The only place a
1540
- campaignless search is correct is the pre-mint Phase 84 `find leads`
1541
- discovery sample. Post-mint expansion, scale-up imports, alternate
1542
- lane explorations, account-based reruns, signal-monitor lanes, and
1543
- operator-driven follow-up searches all persist to the campaign and
1544
- must carry `campaignOfferId`. A search without `campaignOfferId`
1545
- after mint orphans the search from the campaign UI's Contact
1546
- Search panel and the campaign's `Searches` history, even when the
1547
- search produced rows that later get imported. If the search
1548
- helper enforces a `confirmed: true` gate, pass that with
1549
- `campaignOfferId` rather than dropping it.
1550
-
1551
- </boundaries>
1552
-
1553
- <autonomous_tail>
1554
-
1555
- The review-batch tail runs AFTER the atomic mint succeeds. It is driven by
1556
- `core/auto-execute.yaml` and progresses through four steps — Step 13
1557
- (import review batch), Step 14 (validate-sample), Step 15
1558
- (auto-execute-messaging for the review batch), Step 16
1559
- (awaiting-user-greenlight) — before stopping and waiting for a user
1560
- greenlight.
1561
-
1562
- Cost boundary: the commit gate approves creating a campaign and producing a
1563
- real review batch. It does NOT approve spending enrichment/message credits on
1564
- hundreds of leads. Two separate scales apply post-mint and they MUST be kept
1565
- distinct in your head:
1566
-
1567
- - **Import scale** (how many rows land in the campaign table). Defaults to
1568
- `import.importLimit` (25). The user MAY explicitly raise this at or before
1569
- mint with phrasing like "import all of them", "pull the full search", "all
1570
- ~2,000 from this lane", or a numeric target. When the user has stated the
1571
- full-scale import intent, pass that count as `targetLeadCount` so the table
1572
- carries the full pool. Importing rows is cheap (no enrichment runs yet);
1573
- storing them up front lets the user kick remaining enrichment manually
1574
- without re-importing later.
1575
- - **Cascade scale** (how many rows get enriched/scored/messaged before user
1576
- approval). ALWAYS stays at the configured review batch (`sample.sampleSize`
1577
- or `import.importLimit` — default 25) until the user explicitly approves the
1578
- sample. This is the cost gate. Even when the user said "import all", you
1579
- queue Enrich Prospect cells for only the first review-batch rows. The
1580
- remaining rows sit `pending` in the table for the user to kick manually
1581
- after they've eyeballed the sample.
1582
-
1583
- A pre-stated full-import intent is NOT a pre-approval to cascade everything.
1584
- Re-confirm before queueing enrichment beyond the review batch.
1585
-
1586
- If the source lane contains hundreds of leads and the user has not stated a
1587
- full-import intent, leave the rest untouched in the source — do not import
1588
- beyond `importLimit` until the user asks to expand.
774
+ Do NOT proceed to Step 4 (message review gate) without loading and following the generate-message subskill — message-validation.md must prove the full generate-messages workflow ran, and that workflow is defined in the subskill.
1589
775
 
1590
776
  ## MANDATORY TOOL ORDER (read this BEFORE any tail step)
1591
777