marketing-mindset 1.2.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/bin/cli.js +80 -0
- package/package.json +4 -3
package/README.md
CHANGED
|
@@ -13,6 +13,12 @@ npx marketing-mindset read numbers # print one section
|
|
|
13
13
|
npx marketing-mindset install # copy the skill into your agent's skills dir
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
+
## `jd` — marketing engineer job description
|
|
17
|
+
|
|
18
|
+
`npx marketing-mindset jd --level senior` prints the JD with the artifacts due by day 90,
|
|
19
|
+
the sample-size floors, the kill rule and the screening questions. Web version:
|
|
20
|
+
https://axelfreeman.github.io/marketing-mindset/tools/marketing-engineer-jd-generator.html
|
|
21
|
+
|
|
16
22
|
## Floors that do not move
|
|
17
23
|
|
|
18
24
|
| Test | Volume before a verdict means anything |
|
package/bin/cli.js
CHANGED
|
@@ -64,6 +64,7 @@ function readSkill() {
|
|
|
64
64
|
/* --- agent-readiness / AEO checklist (23 weighted checks) -------------------------------
|
|
65
65
|
* The same checklist that runs in the browser tool, as data: agents can read it and score
|
|
66
66
|
* a site without fetching HTML.
|
|
67
|
+
* marketing-mindset jd marketing engineer job description
|
|
67
68
|
* marketing-mindset aeo grouped checklist with weights and the max score
|
|
68
69
|
* marketing-mindset aeo --json machine-readable
|
|
69
70
|
*/
|
|
@@ -91,6 +92,81 @@ function runAeo(opts) {
|
|
|
91
92
|
return 0;
|
|
92
93
|
}
|
|
93
94
|
|
|
95
|
+
|
|
96
|
+
/* --- job description (marketing engineer) ------------------------------------------------
|
|
97
|
+
* The same generator as the free web tool, as text: artifacts due by day 90, the sample-size
|
|
98
|
+
* floors, the kill rule, and the screening questions that separate an engineer from a marketer.
|
|
99
|
+
* marketing-mindset jd senior, all surfaces
|
|
100
|
+
* marketing-mindset jd --level contract --mode contract
|
|
101
|
+
* marketing-mindset jd --surfaces seo,out,analytics
|
|
102
|
+
*/
|
|
103
|
+
const JD_SURFACES = {
|
|
104
|
+
seo: "search and answer engines (pages written to be quoted, schema, llms.txt)",
|
|
105
|
+
out: "outbound and lifecycle email (list, sequence, deliverability, suppression)",
|
|
106
|
+
paid: "paid acquisition (structure, creative, spend gates)",
|
|
107
|
+
auto: "automation and tracking (routing, events, failure alerts)",
|
|
108
|
+
analytics: "measurement (one event that matters, sample-size floors, kill rules)",
|
|
109
|
+
ai: "agent skills and AI-assisted production (reusable operating files, not one-off prompts)",
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
function runJd(opts) {
|
|
113
|
+
const jdOpt = (v, dflt) => (v === undefined || v === true || (typeof v === "number" && isNaN(v))) ? dflt : String(v);
|
|
114
|
+
const level = jdOpt(opts.level, "senior");
|
|
115
|
+
const mode = jdOpt(opts.mode, level === "contract" ? "contract" : "fulltime");
|
|
116
|
+
const sv = jdOpt(opts.surfaces, null);
|
|
117
|
+
const keys = sv ? sv.split(",").map((s) => s.trim()).filter((s) => JD_SURFACES[s]) : Object.keys(JD_SURFACES);
|
|
118
|
+
const surf = keys.length ? keys : Object.keys(JD_SURFACES);
|
|
119
|
+
const company = jdOpt(opts.company, "[company, product, what you sell in one line]");
|
|
120
|
+
const bottleneck = jdOpt(opts.bottleneck, "[the bottleneck you are hiring against]");
|
|
121
|
+
const ninety = mode === "contract"
|
|
122
|
+
? "A 6-week engagement with one written kill rule, then a decision"
|
|
123
|
+
: level === "lead"
|
|
124
|
+
? "A documented system: which paths exist, what each one costs, what gets killed next quarter"
|
|
125
|
+
: "A path live in production with its event recording, or a written note saying why it was killed";
|
|
126
|
+
const L = [];
|
|
127
|
+
L.push("# Marketing Engineer (" + level + ", " + mode + ")", "");
|
|
128
|
+
L.push("## The company and the job");
|
|
129
|
+
L.push(company + ".", "");
|
|
130
|
+
L.push("We are hiring a marketing engineer because: " + bottleneck + ".", "");
|
|
131
|
+
L.push("You will not be handed a channel to run and a deck to fill in. You will be handed a broken or "
|
|
132
|
+
+ "unmeasured path and be expected to make it work, show the number, and write the rule that decides "
|
|
133
|
+
+ "whether it lives.", "");
|
|
134
|
+
L.push("## What the role owns");
|
|
135
|
+
surf.forEach((k, i) => L.push((i + 1) + ". " + JD_SURFACES[k]));
|
|
136
|
+
L.push("", "## What must exist by day 90");
|
|
137
|
+
L.push("1. One path live in production: entry point, sequence or flow, and the event that fires on a conversion.");
|
|
138
|
+
L.push("2. A written declaration of the sample size each running test needs before a result counts as a result.");
|
|
139
|
+
L.push("3. A kill rule per test, written before the test starts: at what volume and what result we stop.");
|
|
140
|
+
L.push("4. One dashboard we can open without asking you for an export.");
|
|
141
|
+
L.push("5. " + ninety + ".");
|
|
142
|
+
L.push("", "## How we will measure you");
|
|
143
|
+
L.push("- Cost per qualified conversation or per activated account, when the volume is above the declared floor.");
|
|
144
|
+
L.push("- Live, openable artifacts still running 30 days after you last touched them.");
|
|
145
|
+
L.push("- Whether a decision made last month can be re-checked today from the data, without you in the room.");
|
|
146
|
+
L.push("- We do not count posts published, prompts written, or hours logged.");
|
|
147
|
+
L.push("", "## Requirements");
|
|
148
|
+
L.push("- You have shipped something that is still running: a page, a sequence, a script, an integration. Links beat adjectives.");
|
|
149
|
+
L.push("- You can explain, in one paragraph, why a 4-of-100 result is not a win.");
|
|
150
|
+
L.push("- You work in the tooling yourself: HTML/CSS, a spreadsheet, analytics, basic scripting, or an agent that writes them for you.");
|
|
151
|
+
L.push("- You write plainly; internal names and jargon are not allowed in anything a customer reads.");
|
|
152
|
+
L.push("", "## Nice to have");
|
|
153
|
+
L.push("- Experience writing pages that answer engines quote (schema, FAQ markup, plain HTML).");
|
|
154
|
+
L.push("- A history of killing your own work in public, with the numbers attached.");
|
|
155
|
+
L.push("", "## Not this role");
|
|
156
|
+
L.push("- Meeting-led account management, community management, brand campaigns, reporting for its own sake.");
|
|
157
|
+
L.push("", "## Screening questions (ask these first)");
|
|
158
|
+
L.push("1. Send us one link to something you built that is still live.");
|
|
159
|
+
L.push("2. We ran 40 sends, got 4 replies, variant B looks better. What do you do next?");
|
|
160
|
+
L.push("3. How many sends does a two-variant email test need before the result means anything? "
|
|
161
|
+
+ "(Expected: ~1,500-2,000 per arm at a 3% baseline, 80% power, 20% relative lift.)");
|
|
162
|
+
L.push("4. Name one thing you killed and what the number was.");
|
|
163
|
+
L.push("5. What will you build in the first two weeks here, and how will we see it?");
|
|
164
|
+
L.push("", "--", "Generated by marketing-mindset (npm). Method and pricing: " + OFFER
|
|
165
|
+
+ " | Packages: " + COST + " | Web version of this tool: " + JD_TOOL);
|
|
166
|
+
console.log(L.join("\n"));
|
|
167
|
+
return 0;
|
|
168
|
+
}
|
|
169
|
+
|
|
94
170
|
const cmd = (process.argv[2] || "").toLowerCase();
|
|
95
171
|
const rest = process.argv.slice(3);
|
|
96
172
|
|
|
@@ -125,6 +201,8 @@ if (cmd === "sample") {
|
|
|
125
201
|
}, null, 2));
|
|
126
202
|
} else if (cmd === "aeo") {
|
|
127
203
|
process.exit(runAeo(flags(rest)));
|
|
204
|
+
} else if (cmd === "jd") {
|
|
205
|
+
process.exit(runJd(flags(rest)));
|
|
128
206
|
} else if (cmd === "sections") {
|
|
129
207
|
sections(readSkill()).forEach((s, i) => console.log(String(i + 1).padStart(2) + ". " + s.title));
|
|
130
208
|
} else if (cmd === "read") {
|
|
@@ -147,6 +225,8 @@ Usage:
|
|
|
147
225
|
--base 0.03 --lift 0.2 --power 0.8 --alpha 0.05
|
|
148
226
|
npx marketing-mindset kill kill rule for a running test
|
|
149
227
|
--base 0.03 --n 1500 --lift 0.2
|
|
228
|
+
npx marketing-mindset jd marketing engineer job description
|
|
229
|
+
--level senior --mode fulltime --surfaces seo,out,analytics
|
|
150
230
|
npx marketing-mindset aeo agent-readiness / AEO checklist (23 weighted checks)
|
|
151
231
|
--json machine-readable
|
|
152
232
|
npx marketing-mindset sections every section of the skill
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "marketing-mindset",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "A marketer's operating mindset as an installable agent skill and CLI: test-size floors, kill rules,
|
|
3
|
+
"version": "1.3.0",
|
|
4
|
+
"description": "A marketer's operating mindset as an installable agent skill and CLI: test-size floors, kill rules, agent-readiness checklist, marketing-engineer job description. npx marketing-mindset sample|kill|aeo|jd|sections|read|install.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agent-skill",
|
|
7
7
|
"skill",
|
|
@@ -12,7 +12,8 @@
|
|
|
12
12
|
"codex",
|
|
13
13
|
"llm",
|
|
14
14
|
"prompt",
|
|
15
|
-
"sample-size"
|
|
15
|
+
"sample-size",
|
|
16
|
+
"job-description"
|
|
16
17
|
],
|
|
17
18
|
"license": "MIT",
|
|
18
19
|
"author": "Axel Freeman",
|