@exaudeus/workrail 3.70.6 → 3.71.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/dist/cli/commands/worktrain-daemon.d.ts +3 -0
- package/dist/cli/commands/worktrain-daemon.js +122 -47
- package/dist/cli-worktrain.js +6 -2
- package/dist/console-ui/assets/index-DyREuUoq.js +28 -0
- package/dist/console-ui/index.html +1 -1
- package/dist/daemon/workflow-runner.d.ts +76 -1
- package/dist/daemon/workflow-runner.js +328 -228
- package/dist/manifest.json +14 -14
- package/docs/ideas/backlog.md +604 -7512
- package/docs/reference/worktrain-daemon-invariants.md +225 -0
- package/package.json +5 -5
- package/spec/workflow-tags.json +6 -0
- package/workflows/wr.competitive-analysis.json +473 -0
- package/dist/console-ui/assets/index-RNEvfTvk.js +0 -28
|
@@ -0,0 +1,473 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "wr.competitive-analysis",
|
|
3
|
+
"name": "Competitive Analysis Workflow",
|
|
4
|
+
"version": "1.0.0",
|
|
5
|
+
"description": "Structured, evidence-driven competitive analysis for software/technology competitors. Produces a decision ledger with forced verdicts, a battlecard, and a 5-sentence executive summary. Optimized for direct feature competitors with inline divergences for alternative-approach, open-source, and platform/ecosystem competitors.",
|
|
6
|
+
"about": "## Competitive Analysis Workflow\n\nThis workflow conducts a structured, evidence-driven competitive analysis of a specific software or technology competitor. It is built for cases where you need analysis that directly informs a real decision -- not a general market survey filed away and forgotten.\n\n**What it does:**\nThe workflow begins with a mandatory intake gate that forces you to name the decision the analysis must inform. It then builds a weighted source inventory, spawns four parallel evidence-collection subagents across technical, commercial, user-voice, and strategy-signal domains, consolidates and scores all evidence, synthesizes it through a JTBD lens and four-force switching model, runs an adversarial red-hat review, and produces three decision-forcing artifacts: a battlecard, a decision ledger with forced verdicts, and a 5-sentence executive summary. A second human gate validates the ledger verdicts before the workflow closes with re-run trigger configuration.\n\n**When to use it:**\nBefore a roadmap, positioning, pricing, or sales-enablement decision that depends on understanding a specific competitor. Not for general market research.\n\n**What it produces:**\n- `07_battlecard.md`: ready-to-use sales battlecard with honest We Lose When bullets and proof points\n- `07_decision_ledger.md`: every signal as a forced-verdict table row (ignore/backlog/urgent/changes-positioning)\n- `07_so_what.md`: 5-sentence executive summary suitable for a Slack message or board slide\n- `08_human_signoff.md`: human-validated ledger with changed verdicts tracked\n- `09_triggers.json`: re-run trigger configuration for time-based and event-based refresh\n\n**How to get good results:**\nProvide a competitor name and URL. Name the specific decision this analysis must inform before evidence gathering begins -- analysis without a decision target is the dominant filed-away failure mode. The workflow has web-fetch capability requirements for external source gathering.",
|
|
7
|
+
"examples": [
|
|
8
|
+
"Analyze Linear before our roadmap planning session to decide how to respond to their project-management features",
|
|
9
|
+
"Competitive analysis of Cursor vs our AI coding tool before the Q3 pricing change decision",
|
|
10
|
+
"Analyze Notion as an alternative-approach competitor before we finalize our positioning messaging",
|
|
11
|
+
"Run a competitive analysis of Vercel before deciding whether to build-vs-buy our deployment infrastructure"
|
|
12
|
+
],
|
|
13
|
+
"recommendedPreferences": {
|
|
14
|
+
"recommendedAutonomy": "guided",
|
|
15
|
+
"recommendedRiskPolicy": "conservative"
|
|
16
|
+
},
|
|
17
|
+
"metricsProfile": "research",
|
|
18
|
+
"features": [
|
|
19
|
+
"wr.features.subagent_guidance",
|
|
20
|
+
"wr.features.capabilities"
|
|
21
|
+
],
|
|
22
|
+
"preconditions": [
|
|
23
|
+
"A specific competitor name and URL must be provided at invocation.",
|
|
24
|
+
"A decision that the analysis must inform must be identified before evidence gathering begins.",
|
|
25
|
+
"The agent must have web-fetch capability to gather external sources.",
|
|
26
|
+
"Running this workflow without a clear decision target will produce a filed-away report -- the most common competitive analysis failure mode."
|
|
27
|
+
],
|
|
28
|
+
"metaGuidance": [
|
|
29
|
+
"SHIPPED VS ANNOUNCED: tag every claim as shipped_verified | shipped_claimed | announced_dated | announced_undated | speculation. Only shipped_verified and shipped_claimed enter the gap analysis. Never report an announced capability as shipped.",
|
|
30
|
+
"MIRROR PROBLEM DEFENSE: the four-force table in step 5 requires ALL FOUR CELLS: push away from us, pull toward competitor, anxiety about switching, habit/inertia. Incomplete tables are the most common AI analysis failure mode.",
|
|
31
|
+
"DECISION LEDGER IS PRIMARY: the decision ledger (07_decision_ledger.md) is the primary artifact. Everything else is derivative. If the analysis does not produce forced verdicts, it has failed.",
|
|
32
|
+
"GITHUB STAR COUNT UNRELIABLE: raw GitHub star counts are an unreliable metric. Always use behavioral metrics: fork-to-star ratio, monthly unique contributors, issue close time. Flag if fork-to-star is below 50 per 1000 alongside any star spike.",
|
|
33
|
+
"VERDICT CONSTRAINT: the decision ledger hard constraint is <=3 urgent items and <=1 changes-positioning item. This is not a style preference -- it forces real prioritization. If the draft exceeds this, re-rank and demote. No TBD verdicts allowed.",
|
|
34
|
+
"MARKETING COPY IS NOT EVIDENCE: every vendor landing-page claim must be paired with at least one independent user artifact (review, forum, support thread). If no pairing is found, file as vendor_only and weight near zero in synthesis.",
|
|
35
|
+
"ADVERSARIAL REVIEW IS CORRECTNESS: step 6 is a correctness mechanism, not optional polish. Every adversarial point must be incorporated into the outputs or explicitly rebutted with cited evidence. Unanswered points weaken the analysis."
|
|
36
|
+
],
|
|
37
|
+
"assessments": [
|
|
38
|
+
{
|
|
39
|
+
"id": "output-completeness-gate",
|
|
40
|
+
"purpose": "The three decision-forcing output artifacts are complete and meet their hard constraints before handoff to the human reviewer.",
|
|
41
|
+
"dimensions": [
|
|
42
|
+
{
|
|
43
|
+
"id": "decision_ledger_integrity",
|
|
44
|
+
"purpose": "Decision ledger has no TBD verdicts, at most 3 urgent items, and at most 1 changes-positioning item. Every finding has a forced-choice verdict with rationale.",
|
|
45
|
+
"levels": [
|
|
46
|
+
"incomplete",
|
|
47
|
+
"complete"
|
|
48
|
+
]
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"id": "battlecard_completeness",
|
|
52
|
+
"purpose": "All required battlecard fields are present. The We Lose When section contains 2-3 honest bullets with proof points. The battlecard cannot ship without this section.",
|
|
53
|
+
"levels": [
|
|
54
|
+
"incomplete",
|
|
55
|
+
"complete"
|
|
56
|
+
]
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"id": "adversarial_coverage",
|
|
60
|
+
"purpose": "Every adversarial point from step 6 is either incorporated into the output artifacts or explicitly rebutted with cited evidence. Unanswered points are surfaced to the human reviewer.",
|
|
61
|
+
"levels": [
|
|
62
|
+
"incomplete",
|
|
63
|
+
"complete"
|
|
64
|
+
]
|
|
65
|
+
}
|
|
66
|
+
]
|
|
67
|
+
}
|
|
68
|
+
],
|
|
69
|
+
"steps": [
|
|
70
|
+
{
|
|
71
|
+
"id": "intake-and-scoping",
|
|
72
|
+
"title": "Intake & Scoping",
|
|
73
|
+
"requireConfirmation": true,
|
|
74
|
+
"promptBlocks": {
|
|
75
|
+
"goal": "Collect and confirm the scope of this competitive analysis with the human before any evidence gathering begins. This gate is the primary defense against the most common failure mode: analysis without a clear decision target.",
|
|
76
|
+
"constraints": [
|
|
77
|
+
"Do NOT proceed to step 1 without a confirmed decision target. Analysis without a decision target produces a filed-away report.",
|
|
78
|
+
"The decision target must be a forced choice from the allowed values -- do not accept vague alternatives.",
|
|
79
|
+
"Competitor type defaults to direct_feature if not specified."
|
|
80
|
+
],
|
|
81
|
+
"procedure": [
|
|
82
|
+
"Collect the following from the human (ask for anything not already provided in the invocation): competitor name and primary domain/URL; competitor product name(s); competitor type (direct_feature | alternative_approach | open_source | platform_ecosystem -- default: direct_feature); the decision this analysis must inform (FORCED CHOICE -- workflow cannot proceed without it): roadmap_prioritization | positioning_messaging | pricing_change | partnership_build_vs_buy | sales_enablement | exec_briefing; our product context: ICP, top-3 differentiators we currently claim, any recent deals lost to this competitor; path to a prior analysis artifact if one exists (enables diff in step 8 -- use empty string if none); time-box target (default 45 minutes).",
|
|
83
|
+
"Present a brief confirmation summary to the human showing: competitor, type, decision target, and key product context. Wait for explicit confirmation.",
|
|
84
|
+
"Set context variables before advancing: competitorName, competitorType, decisionTarget, priorArtifactPath (empty string if none)."
|
|
85
|
+
],
|
|
86
|
+
"outputRequired": {
|
|
87
|
+
"notesMarkdown": "Confirmed scope: competitor name, type, decision target, our product context, prior artifact path, time-box.",
|
|
88
|
+
"context": "Set competitorName, competitorType, decisionTarget, priorArtifactPath."
|
|
89
|
+
},
|
|
90
|
+
"verify": [
|
|
91
|
+
"The human has confirmed the decision target explicitly.",
|
|
92
|
+
"competitorType is one of the four valid values.",
|
|
93
|
+
"decisionTarget is one of the six valid forced-choice values.",
|
|
94
|
+
"priorArtifactPath is set (empty string is valid)."
|
|
95
|
+
]
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"id": "source-map-and-reach-plan",
|
|
100
|
+
"title": "Source Map & Reach Plan",
|
|
101
|
+
"promptBlocks": {
|
|
102
|
+
"goal": "Build a source inventory weighted by signal/noise for the competitor. Produce 01_source_plan.md listing sources by tier with your assessment of their reachability.",
|
|
103
|
+
"constraints": [
|
|
104
|
+
"Apply the shipped_vs_announced filter rule from metaGuidance to all sources from step 1 onward.",
|
|
105
|
+
"Apply the marketing_vs_user pairing rule from metaGuidance: every vendor landing-page claim must be paired with an independent user artifact.",
|
|
106
|
+
"Embed both rules in the source plan so all subsequent subagents inherit them."
|
|
107
|
+
],
|
|
108
|
+
"procedure": [
|
|
109
|
+
"Categorize sources by tier: HIGH SIGNAL: pricing page + Wayback Machine snapshots, changelog/release notes (what actually shipped), job postings last 90 days, user reviews (G2/Capterra/TrustRadius/Reddit last 12 months), support forums/GitHub Issues/Discord. MEDIUM SIGNAL: product website/marketing copy, HN/Reddit/X technical threads, GitHub metrics (use BEHAVIORAL metrics only: fork-to-star ratio, monthly unique contributors, time-to-close issues -- flag fork-to-star below 50/1000 alongside star spike), YouTube demos. LOW SIGNAL: press releases, analyst reports, Twitter/X founder posts (vaporware risk).",
|
|
110
|
+
"For each source tier, note what you expect to find and what makes it high or low signal for THIS competitor.",
|
|
111
|
+
"Write 01_source_plan.md with: source inventory by tier, reachability assessment, planned approach for high-signal sources, and explicit statement of the two rules (shipped_vs_announced, marketing_vs_user) that all subagents must apply."
|
|
112
|
+
],
|
|
113
|
+
"outputRequired": {
|
|
114
|
+
"notesMarkdown": "Source inventory summary, tier weights, and reachability assessment for each tier."
|
|
115
|
+
},
|
|
116
|
+
"verify": [
|
|
117
|
+
"01_source_plan.md is written.",
|
|
118
|
+
"Both rules (shipped_vs_announced, marketing_vs_user) are embedded in the plan for subagent use.",
|
|
119
|
+
"High-signal sources are prioritized over low-signal ones."
|
|
120
|
+
]
|
|
121
|
+
},
|
|
122
|
+
"promptFragments": [
|
|
123
|
+
{
|
|
124
|
+
"id": "alternative-approach-source-weight",
|
|
125
|
+
"when": {
|
|
126
|
+
"var": "competitorType",
|
|
127
|
+
"equals": "alternative_approach"
|
|
128
|
+
},
|
|
129
|
+
"text": "COMPETITOR TYPE DIVERGENCE (alternative_approach): Reweight community discussion and JTBD framing upward; feature comparison pages downward. Job postings and customer case studies are high-signal for understanding their market positioning."
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"id": "open-source-source-weight",
|
|
133
|
+
"when": {
|
|
134
|
+
"var": "competitorType",
|
|
135
|
+
"equals": "open_source"
|
|
136
|
+
},
|
|
137
|
+
"text": "COMPETITOR TYPE DIVERGENCE (open_source): Reweight GitHub behavioral metrics, governance analysis (who controls steering, where top contributors work), and license terms. Pricing page is often N/A -- reprioritize to contributor-employer analysis, governance model, and commercial vs community edition differences."
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
"id": "platform-ecosystem-source-weight",
|
|
141
|
+
"when": {
|
|
142
|
+
"var": "competitorType",
|
|
143
|
+
"equals": "platform_ecosystem"
|
|
144
|
+
},
|
|
145
|
+
"text": "COMPETITOR TYPE DIVERGENCE (platform_ecosystem): Reweight partner directories, API pricing/rate-limit changes, Terms of Service deltas, and developer relations moves. These signal ecosystem strategy better than product feature pages."
|
|
146
|
+
}
|
|
147
|
+
]
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
"id": "parallel-evidence-collection",
|
|
151
|
+
"title": "Parallel Evidence Collection",
|
|
152
|
+
"promptBlocks": {
|
|
153
|
+
"goal": "Spawn four WorkRail Executor subagents simultaneously, each assigned to a distinct evidence domain. Each subagent has isolated context and only consumes the scoping brief and its assigned source slice. You synthesize all four outputs in step 3.",
|
|
154
|
+
"constraints": [
|
|
155
|
+
"Spawn all four subagents SIMULTANEOUSLY -- do not run them sequentially.",
|
|
156
|
+
"Each subagent must apply the shipped_vs_announced and marketing_vs_user rules from 01_source_plan.md.",
|
|
157
|
+
"Each subagent must URL-cite every claim.",
|
|
158
|
+
"Each subagent must bucket findings into time periods: last_30_days / 30-180_days / 180+_days.",
|
|
159
|
+
"Subagent output is raw evidence only -- the main agent synthesizes in step 3."
|
|
160
|
+
],
|
|
161
|
+
"procedure": [
|
|
162
|
+
"Subagent 2a -- Technical & Product Surface: sources are product docs, API reference, changelog, SDK repos, demo video transcripts. Produce 02a_product_surface.json with: feature inventory (each feature tagged shipped_verified|shipped_claimed|announced_dated|announced_undated|speculation with source URL), architecture inferences with confidence, integration surface, deployment model. Bucket all findings by time period.",
|
|
163
|
+
"Subagent 2b -- Commercial & Pricing: sources are pricing page, Wayback Machine, G2 pricing field, review mentions of negotiated quotes, Vendr/Tropic if accessible. Tag each price datum: official | review | aggregator | inferred. Produce 02b_commercial.json.",
|
|
164
|
+
"Subagent 2c -- User Voice & Sentiment: sources are G2/Capterra/TrustRadius (last 12 months, weight last 6 months more heavily), HN threads, relevant subreddits, GitHub Issues if open_source. Cluster verbatim quotes by theme with cluster size. Specifically extract switch_in_narratives (moved from X to competitor) and switch_out_narratives (left competitor for X) -- these are highest-signal artifacts. Produce 02c_user_voice.json with: top_complaints[], top_praises[], switch_in_narratives[], switch_out_narratives[].",
|
|
165
|
+
"Subagent 2d -- Commercial Strategy Signals: sources are job postings last 90 days, funding history, exec posts, conference talks, partnership announcements. Code each signal as: capability_adding | market_entering | motion_changing. Produce 02d_strategy_signals.json.",
|
|
166
|
+
"After all four subagents return, record what each produced in your notes. You will synthesize in step 3."
|
|
167
|
+
],
|
|
168
|
+
"outputRequired": {
|
|
169
|
+
"notesMarkdown": "Confirmation that all four subagents ran and brief summary of what each returned. Note any subagent that could not complete its scope."
|
|
170
|
+
},
|
|
171
|
+
"verify": [
|
|
172
|
+
"All four subagents ran simultaneously.",
|
|
173
|
+
"All four output files exist (02a, 02b, 02c, 02d).",
|
|
174
|
+
"Each subagent applied the shipped_vs_announced and marketing_vs_user rules.",
|
|
175
|
+
"URL citations are present in subagent outputs."
|
|
176
|
+
]
|
|
177
|
+
},
|
|
178
|
+
"promptFragments": [
|
|
179
|
+
{
|
|
180
|
+
"id": "open-source-repo-metrics",
|
|
181
|
+
"when": {
|
|
182
|
+
"var": "competitorType",
|
|
183
|
+
"equals": "open_source"
|
|
184
|
+
},
|
|
185
|
+
"text": "COMPETITOR TYPE DIVERGENCE (open_source) for Subagent 2a: Also perform a shallow-fetch of the main repository. Extract: primary languages, top dependencies, commit cadence last 90 days, top contributors and their employers. Calculate fork-to-star ratio and monthly unique contributors. These behavioral metrics are higher signal than star count."
|
|
186
|
+
}
|
|
187
|
+
]
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
"id": "evidence-consolidation",
|
|
191
|
+
"title": "Evidence Consolidation",
|
|
192
|
+
"promptBlocks": {
|
|
193
|
+
"goal": "Read all four subagent output files. Deduplicate, reconcile conflicts, and score every claim. Build the canonical evidence base and gap inventory that steps 5-8 will consume.",
|
|
194
|
+
"constraints": [
|
|
195
|
+
"Conflicts get BOTH versions with a conflict tag -- do not silently resolve contradictions.",
|
|
196
|
+
"Score every claim: verified | likely | unconfirmed | inferred.",
|
|
197
|
+
"A gap is decision_critical: true if it is essential to informing the decisionTarget set in step 0.",
|
|
198
|
+
"A gap is recoverable: true if there is a plausible secondary source that could fill it."
|
|
199
|
+
],
|
|
200
|
+
"procedure": [
|
|
201
|
+
"Read 02a_product_surface.json, 02b_commercial.json, 02c_user_voice.json, and 02d_strategy_signals.json.",
|
|
202
|
+
"Deduplicate overlapping claims. For conflicts, keep both versions with a conflict tag and note the source disagreement.",
|
|
203
|
+
"Score every remaining claim: verified (multiple independent sources confirm), likely (one strong source confirms), unconfirmed (single weak source, not independently confirmed), inferred (derived from context, not directly stated).",
|
|
204
|
+
"Build a gap inventory. For each gap, tag decision_critical: true/false and recoverable: true/false.",
|
|
205
|
+
"Write 03_evidence_base.json with the consolidated, scored evidence base and gap inventory.",
|
|
206
|
+
"Determine hasDecisionCriticalGaps: set to true if any gap is tagged decision_critical: true AND recoverable: true."
|
|
207
|
+
],
|
|
208
|
+
"outputRequired": {
|
|
209
|
+
"notesMarkdown": "Evidence consolidation summary: total claims scored, conflict count, gap count, decision-critical gap count, and whether hasDecisionCriticalGaps is true or false.",
|
|
210
|
+
"context": "Set hasDecisionCriticalGaps (true or false)."
|
|
211
|
+
},
|
|
212
|
+
"verify": [
|
|
213
|
+
"03_evidence_base.json is written.",
|
|
214
|
+
"hasDecisionCriticalGaps is set in context.",
|
|
215
|
+
"No silent conflict resolution -- all conflicts are tagged.",
|
|
216
|
+
"Every claim has a confidence score."
|
|
217
|
+
]
|
|
218
|
+
}
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
"id": "gap-closing-pass",
|
|
222
|
+
"title": "Gap-Closing Pass",
|
|
223
|
+
"runCondition": {
|
|
224
|
+
"var": "hasDecisionCriticalGaps",
|
|
225
|
+
"equals": true
|
|
226
|
+
},
|
|
227
|
+
"promptBlocks": {
|
|
228
|
+
"goal": "Close decision-critical recoverable gaps by spawning up to 3 targeted subagents on high-value secondary sources. Unrecovered decision-critical gaps become explicit human-followup flags in the final artifact.",
|
|
229
|
+
"constraints": [
|
|
230
|
+
"Only run this step when hasDecisionCriticalGaps is true (controlled by runCondition).",
|
|
231
|
+
"Spawn at most 3 targeted subagents for the highest-value recoverable gaps.",
|
|
232
|
+
"Subagents must still apply shipped_vs_announced and marketing_vs_user rules.",
|
|
233
|
+
"Unrecovered decision-critical gaps must be surfaced as explicit flags, not silently dropped."
|
|
234
|
+
],
|
|
235
|
+
"procedure": [
|
|
236
|
+
"From 03_evidence_base.json, identify gaps tagged decision_critical: true AND recoverable: true.",
|
|
237
|
+
"Prioritize gaps by decision impact. Spawn up to 3 WorkRail Executor subagents targeting the highest-value gaps using the secondary source playbook (priority order): job postings, engineering blog/conference talks, patent filings, Wayback pricing diffs, customer logos + LinkedIn headcount trends, GitHub Issues for missing-feature signal (users asking for a feature signals the competitor lacks it), conference sponsorship lists.",
|
|
238
|
+
"After subagents return, update 03_evidence_base.json with new findings.",
|
|
239
|
+
"Write 04_gap_closing_notes.md listing: gaps closed, gaps that remain open, and explicit human-followup flags for unrecovered decision-critical gaps."
|
|
240
|
+
],
|
|
241
|
+
"outputRequired": {
|
|
242
|
+
"notesMarkdown": "Which gaps were targeted, what was recovered, and what remains open as human-followup flags."
|
|
243
|
+
},
|
|
244
|
+
"verify": [
|
|
245
|
+
"04_gap_closing_notes.md is written.",
|
|
246
|
+
"Unrecovered decision-critical gaps are marked as explicit human-followup flags.",
|
|
247
|
+
"03_evidence_base.json is updated with new findings."
|
|
248
|
+
]
|
|
249
|
+
}
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
"id": "synthesis",
|
|
253
|
+
"title": "Synthesis: JTBD + Switching Forces + Threat Read",
|
|
254
|
+
"promptBlocks": {
|
|
255
|
+
"goal": "Synthesize the evidence base into three linked analytical sections. These three sections are the intellectual core of the analysis. Write to 05_synthesis.md.",
|
|
256
|
+
"constraints": [
|
|
257
|
+
"JTBD articulation must NOT reference feature categories -- it must describe the underlying job customers hire either product to do.",
|
|
258
|
+
"The four-force table REQUIRES ALL FOUR CELLS. An incomplete table is the mirror problem and invalidates the threat read.",
|
|
259
|
+
"The threat read must cite at least 3 specific evidence items and rate confidence.",
|
|
260
|
+
"Key Assumptions Check and Premortem are required -- they are not optional depth passes.",
|
|
261
|
+
"Avoid overclaim AND underclaim in the threat read."
|
|
262
|
+
],
|
|
263
|
+
"procedure": [
|
|
264
|
+
"Section 5.1 -- JTBD Frame: articulate the underlying job customers hire either product to do, WITHOUT reference to feature categories. Include at least one non-obvious substitute the customer could hire (not another software product -- a process, a workaround, or a different approach entirely).",
|
|
265
|
+
"Section 5.2 -- Four Forces of Switching (Moesta/Spiek model, ALL FOUR CELLS REQUIRED): Push away from us: what makes users look around? (from switch_out_narratives and lost-deal data). Pull toward competitor: their attractive promise? (from review praise and their positioning). Anxiety about switching to them: what stops the move? (from review complaints and forum pain). Habit/inertia with us: what is the lock-in? (from our product context).",
|
|
266
|
+
"Section 5.3 -- Threat Read: cite at least 3 specific evidence items by source and confidence score. Rate overall threat confidence. Avoid overclaim and underclaim.",
|
|
267
|
+
"Key Assumptions Check (append to threat read): list the 3 most load-bearing assumptions in the threat read. Rate each: well_supported | weakly_supported | unsupported_but_assumed.",
|
|
268
|
+
"Premortem (append to threat read): 'Imagine this analysis is wrong in 12 months. What was the most likely reason?' Write one specific answer."
|
|
269
|
+
],
|
|
270
|
+
"outputRequired": {
|
|
271
|
+
"notesMarkdown": "Summary of JTBD frame, four-force highlights, threat read headline with confidence, and any key assumptions that were weakly supported."
|
|
272
|
+
},
|
|
273
|
+
"verify": [
|
|
274
|
+
"05_synthesis.md is written with all three sections.",
|
|
275
|
+
"JTBD frame makes no reference to feature categories.",
|
|
276
|
+
"Four-force table has all four cells populated.",
|
|
277
|
+
"Threat read cites at least 3 specific evidence items.",
|
|
278
|
+
"Key Assumptions Check and Premortem are present."
|
|
279
|
+
]
|
|
280
|
+
},
|
|
281
|
+
"promptFragments": [
|
|
282
|
+
{
|
|
283
|
+
"id": "alternative-approach-synthesis",
|
|
284
|
+
"when": {
|
|
285
|
+
"var": "competitorType",
|
|
286
|
+
"equals": "alternative_approach"
|
|
287
|
+
},
|
|
288
|
+
"text": "COMPETITOR TYPE DIVERGENCE (alternative_approach): JTBD synthesis is the primary output. Feature comparison is demoted to an appendix. The central question is: are we in the same category, adjacent, or is a new category frame needed? Address this explicitly in section 5.1."
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
"id": "open-source-threat-model",
|
|
292
|
+
"when": {
|
|
293
|
+
"var": "competitorType",
|
|
294
|
+
"equals": "open_source"
|
|
295
|
+
},
|
|
296
|
+
"text": "COMPETITOR TYPE DIVERGENCE (open_source): Add a commercial threat model section after the threat read. Choose and defend one of: stay_community (no commercial threat), launch_commercial (will offer paid tier), get_acquired (acquisition target). Cite governance and contributor-employer evidence for your choice."
|
|
297
|
+
},
|
|
298
|
+
{
|
|
299
|
+
"id": "platform-ecosystem-integration-map",
|
|
300
|
+
"when": {
|
|
301
|
+
"var": "competitorType",
|
|
302
|
+
"equals": "platform_ecosystem"
|
|
303
|
+
},
|
|
304
|
+
"text": "COMPETITOR TYPE DIVERGENCE (platform_ecosystem): Add a contested integration surface map section after the threat read. List partners and customers tagged as: ours | theirs | contested | uncommitted. Contested entries are the strategic priority."
|
|
305
|
+
}
|
|
306
|
+
]
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
"id": "adversarial-review",
|
|
310
|
+
"title": "Adversarial Review",
|
|
311
|
+
"promptBlocks": {
|
|
312
|
+
"goal": "Adopt an adversarial persona and challenge the analysis from 05_synthesis.md. This is not optional polish -- it is a correctness mechanism. Write 06_red_hat_critique.md.",
|
|
313
|
+
"constraints": [
|
|
314
|
+
"Adopt the adversarial persona fully: you are a well-informed defender of the competitor. The attached analysis is hostile to your company.",
|
|
315
|
+
"You MUST address all four tasks -- do not skip any.",
|
|
316
|
+
"ACH lite requires two alternative hypotheses with specific disconfirming evidence requirements.",
|
|
317
|
+
"Every unanswered adversarial point in this step becomes a required response in step 7."
|
|
318
|
+
],
|
|
319
|
+
"procedure": [
|
|
320
|
+
"Adopt the persona: 'You are a well-informed defender of [competitorName]. The analysis in 05_synthesis.md is hostile to your company. Argue back.'",
|
|
321
|
+
"Task (a): Which threat claims in the synthesis are overstated? Cite specific evidence that was available but not weighted appropriately.",
|
|
322
|
+
"Task (b): Which competitor strengths did the analysis miss? What is present in the evidence base but not reflected in the synthesis?",
|
|
323
|
+
"Task (c): Which weaknesses of our product did the analysis fail to acknowledge? Where does the analysis defend us more than the evidence warrants?",
|
|
324
|
+
"Task (d): What evidence in the evidence base (03_evidence_base.json) contradicts the synthesis's own conclusions? Look for internal inconsistencies.",
|
|
325
|
+
"ACH Lite: generate two alternative hypotheses to the headline threat claim. For each alternative, list 2-3 specific pieces of evidence that would disconfirm it if true. These constrain what the lead agent needs to verify in step 7.",
|
|
326
|
+
"Write 06_red_hat_critique.md with all four tasks and ACH lite. Organize by task."
|
|
327
|
+
],
|
|
328
|
+
"outputRequired": {
|
|
329
|
+
"notesMarkdown": "Summary of adversarial findings: strongest overstated claims, biggest missed strengths, most important blind spots about our product, any internal contradictions found, and the two ACH alternative hypotheses."
|
|
330
|
+
},
|
|
331
|
+
"verify": [
|
|
332
|
+
"06_red_hat_critique.md is written.",
|
|
333
|
+
"All four tasks are addressed.",
|
|
334
|
+
"ACH lite has two alternative hypotheses with specific disconfirming evidence requirements.",
|
|
335
|
+
"The adversarial persona was genuinely adopted, not used as light critique."
|
|
336
|
+
]
|
|
337
|
+
}
|
|
338
|
+
},
|
|
339
|
+
{
|
|
340
|
+
"id": "decision-forcing-outputs",
|
|
341
|
+
"title": "Decision-Forcing Output Generation",
|
|
342
|
+
"assessmentRefs": [
|
|
343
|
+
"output-completeness-gate"
|
|
344
|
+
],
|
|
345
|
+
"assessmentConsequences": [
|
|
346
|
+
{
|
|
347
|
+
"when": {
|
|
348
|
+
"anyEqualsLevel": "incomplete"
|
|
349
|
+
},
|
|
350
|
+
"effect": {
|
|
351
|
+
"kind": "require_followup",
|
|
352
|
+
"guidance": "Fix whichever dimension scored incomplete: decision_ledger_integrity -- remove TBD verdicts, enforce <=3 urgent and <=1 changes-positioning by re-ranking. battlecard_completeness -- complete all required fields including We Lose When with 2-3 honest bullets. adversarial_coverage -- for each adversarial point from step 6, incorporate it or write an explicit rebuttal with cited evidence."
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
],
|
|
356
|
+
"promptBlocks": {
|
|
357
|
+
"goal": "Produce all three decision-forcing artifacts. These artifacts are the deliverable the human will act on. The decision ledger is the primary artifact -- everything else is derivative.",
|
|
358
|
+
"constraints": [
|
|
359
|
+
"HARD CONSTRAINT on decision ledger: at most 3 urgent items, at most 1 changes-positioning item. If draft exceeds this, re-rank and demote. No TBD verdicts allowed.",
|
|
360
|
+
"HARD CONSTRAINT on battlecard: the We Lose When section is MANDATORY. No battlecard ships without 2-3 honest bullets with proof points.",
|
|
361
|
+
"Every adversarial point from 06_red_hat_critique.md must be either incorporated into the artifacts or explicitly rebutted with cited evidence. Unanswered adversarial points must be surfaced in 07_decision_ledger.md as a reviewer note."
|
|
362
|
+
],
|
|
363
|
+
"procedure": [
|
|
364
|
+
"Artifact 7.1 -- Battlecard (07_battlecard.md): Write fields in this order: (1) one-line competitor description (<25 words); (2) We Win When -- 3 bullets, each with a proof point; (3) We Lose When -- 2-3 bullets, MANDATORY, honest, each with a proof point; (4) Top 3 differentiators tied to the switching forces from step 5; (5) Top 3 landmine discovery questions derived from user complaints in 02c_user_voice.json; (6) Pricing posture; (7) 3 objection->response pairs from review themes; (8) Confidence/freshness metadata: date, sources used, fields flagged as unconfirmed.",
|
|
365
|
+
"Artifact 7.2 -- Decision Ledger (07_decision_ledger.md): For every gap, signal, and threat from the evidence base and synthesis, write one table row: Finding | Source confidence | Verdict | Rationale | Owner. Verdict is a FORCED CHOICE: ignore | backlog | urgent | changes-positioning. Apply the hard constraint: at most 3 urgent, at most 1 changes-positioning. If the draft exceeds this, re-rank and demote lower-priority items. No TBD verdicts. Surface any unanswered adversarial points from step 6 as explicit reviewer notes.",
|
|
366
|
+
"Artifact 7.3 -- So-What Summary (07_so_what.md): Write exactly 5 sentences: (1) who the competitor is; (2) headline threat with confidence; (3) one switching driver that matters most; (4) recommended decision traceable to a specific ledger entry; (5) what single piece of new information would most change this read.",
|
|
367
|
+
"Address or rebut every adversarial point from 06_red_hat_critique.md. Record each response in your notes."
|
|
368
|
+
],
|
|
369
|
+
"outputRequired": {
|
|
370
|
+
"notesMarkdown": "Draft completion status for all three artifacts. Note which adversarial points were incorporated vs rebutted, and how the urgent/changes-positioning constraints were applied (what was demoted and why)."
|
|
371
|
+
},
|
|
372
|
+
"verify": [
|
|
373
|
+
"07_battlecard.md is written with all required fields including We Lose When.",
|
|
374
|
+
"07_decision_ledger.md has no TBD verdicts, at most 3 urgent items, at most 1 changes-positioning item.",
|
|
375
|
+
"07_so_what.md is exactly 5 sentences.",
|
|
376
|
+
"Every adversarial point from 06_red_hat_critique.md is addressed or rebutted.",
|
|
377
|
+
"Unanswered adversarial points are surfaced as reviewer notes in the ledger."
|
|
378
|
+
]
|
|
379
|
+
},
|
|
380
|
+
"promptFragments": [
|
|
381
|
+
{
|
|
382
|
+
"id": "alternative-approach-battlecard-variant",
|
|
383
|
+
"when": {
|
|
384
|
+
"var": "competitorType",
|
|
385
|
+
"equals": "alternative_approach"
|
|
386
|
+
},
|
|
387
|
+
"text": "COMPETITOR TYPE DIVERGENCE (alternative_approach): Replace the standard battlecard with a category positioning brief (07_battlecard.md repurposed). Answer: are we in the same category, an adjacent category, or do we need a new category frame? What is each product's distinctive promise? Where do we win on category frame and where do we lose?"
|
|
388
|
+
},
|
|
389
|
+
{
|
|
390
|
+
"id": "open-source-ledger-additions",
|
|
391
|
+
"when": {
|
|
392
|
+
"var": "competitorType",
|
|
393
|
+
"equals": "open_source"
|
|
394
|
+
},
|
|
395
|
+
"text": "COMPETITOR TYPE DIVERGENCE (open_source): Add a posture field to the battlecard: compete | embrace-and-extend | partner | ignore. Add two required rows to the decision ledger: license-risk (what is our legal exposure if customers adopt this?) and dependency-risk (are any of our customers or integrations already depending on this?)."
|
|
396
|
+
},
|
|
397
|
+
{
|
|
398
|
+
"id": "platform-ecosystem-battlecard-variant",
|
|
399
|
+
"when": {
|
|
400
|
+
"var": "competitorType",
|
|
401
|
+
"equals": "platform_ecosystem"
|
|
402
|
+
},
|
|
403
|
+
"text": "COMPETITOR TYPE DIVERGENCE (platform_ecosystem): Replace the standard battlecard with an ecosystem map (07_battlecard.md repurposed). Show partners and customers tagged: ours | theirs | contested | uncommitted. Highlight contested zone entries as the action items."
|
|
404
|
+
}
|
|
405
|
+
]
|
|
406
|
+
},
|
|
407
|
+
{
|
|
408
|
+
"id": "human-review-and-diff",
|
|
409
|
+
"title": "Human Review + Diff",
|
|
410
|
+
"requireConfirmation": true,
|
|
411
|
+
"promptBlocks": {
|
|
412
|
+
"goal": "Present the three output artifacts to the human reviewer for validation. The human does three concrete things: edits ledger verdicts, responds to adversarial points, and confirms the staleness threshold. Produce 08_human_signoff.md recording all changes.",
|
|
413
|
+
"constraints": [
|
|
414
|
+
"The human reviewer must actively engage -- this is not a passive approval gate.",
|
|
415
|
+
"Track all verdict changes from the human in 08_human_signoff.md.",
|
|
416
|
+
"If priorArtifactPath is set (not empty string), produce 08_diff.md before presenting artifacts."
|
|
417
|
+
],
|
|
418
|
+
"procedure": [
|
|
419
|
+
"If priorArtifactPath is not empty, produce 08_diff.md comparing the current analysis to the prior artifact. Categorize differences as: verdict_changed | new_finding | dropped_finding | confidence_changed.",
|
|
420
|
+
"Present to the human reviewer: 07_battlecard.md, 07_decision_ledger.md, 07_so_what.md, and (if applicable) 08_diff.md.",
|
|
421
|
+
"Ask the human to do three things: (1) Confirm or change each verdict in the decision ledger -- edits will be tracked. (2) Accept or rebut each unanswered adversarial point surfaced from step 6. (3) Confirm when this analysis should be considered stale (default: 90 days).",
|
|
422
|
+
"Record all human changes and responses in 08_human_signoff.md.",
|
|
423
|
+
"If the human changes any verdicts that violate the <=3 urgent / <=1 changes-positioning constraint, note the constraint and ask them to confirm the override."
|
|
424
|
+
],
|
|
425
|
+
"outputRequired": {
|
|
426
|
+
"notesMarkdown": "Summary of human reviewer changes: how many verdicts changed, which adversarial points were accepted vs rebutted, and confirmed staleness date."
|
|
427
|
+
},
|
|
428
|
+
"verify": [
|
|
429
|
+
"08_human_signoff.md is written recording all verdict changes.",
|
|
430
|
+
"Adversarial points from step 6 have been accepted or rebutted by the human.",
|
|
431
|
+
"Staleness date is confirmed.",
|
|
432
|
+
"08_diff.md produced if priorArtifactPath was set."
|
|
433
|
+
]
|
|
434
|
+
},
|
|
435
|
+
"promptFragments": [
|
|
436
|
+
{
|
|
437
|
+
"id": "diff-available",
|
|
438
|
+
"when": {
|
|
439
|
+
"var": "priorArtifactPath",
|
|
440
|
+
"not_equals": ""
|
|
441
|
+
},
|
|
442
|
+
"text": "A prior analysis artifact was provided. Produce 08_diff.md before the human review session, categorizing all differences as: verdict_changed | new_finding | dropped_finding | confidence_changed. Present the diff summary to the human first so they can focus on what changed."
|
|
443
|
+
}
|
|
444
|
+
]
|
|
445
|
+
},
|
|
446
|
+
{
|
|
447
|
+
"id": "rerun-trigger-registration",
|
|
448
|
+
"title": "Re-Run Trigger Registration",
|
|
449
|
+
"promptBlocks": {
|
|
450
|
+
"goal": "Write 09_triggers.json with layered re-run triggers for this analysis. This file is a configuration document for the operator to act on -- WorkRail cannot register live cron jobs.",
|
|
451
|
+
"constraints": [
|
|
452
|
+
"Note explicitly in the file: WorkRail cannot register live cron jobs. This is a configuration document for the operator.",
|
|
453
|
+
"Set staleness_date to 90 days from today.",
|
|
454
|
+
"Include both time-based and event-based triggers."
|
|
455
|
+
],
|
|
456
|
+
"procedure": [
|
|
457
|
+
"Write 09_triggers.json with the following structure: time_based_triggers: full re-run quarterly, lightweight refresh (subagents 2b/2c/2d only) monthly. event_based_triggers: competitor funding round, leadership change (CEO/CPO/head of product), acquisition (either direction), major version release or marketing relaunch, pricing-page diff detected, 3+ new G2 reviews in 30 days with new theme, 2+ lost deals to this competitor in a 30-day window, team is about to make a decision this analysis was meant to inform. staleness_date: [today + 90 days]. analysis_id: [competitorName]-[decisionTarget]-[today's date].",
|
|
458
|
+
"Add a note at the top of the file: 'WorkRail cannot register live cron jobs. This file is a configuration document for the operator to configure monitoring alerts and calendar reminders based on the triggers listed here.'"
|
|
459
|
+
],
|
|
460
|
+
"outputRequired": {
|
|
461
|
+
"notesMarkdown": "Confirmation that 09_triggers.json is written with all required trigger types and staleness date. Summary of the analysis run: competitor, decision target, primary verdict recommendation, and key open questions for the next run."
|
|
462
|
+
},
|
|
463
|
+
"verify": [
|
|
464
|
+
"09_triggers.json is written.",
|
|
465
|
+
"staleness_date is set to 90 days from today.",
|
|
466
|
+
"Both time-based and event-based triggers are present.",
|
|
467
|
+
"The operator note about WorkRail not registering live cron jobs is included."
|
|
468
|
+
]
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
],
|
|
472
|
+
"validatedAgainstSpecVersion": 3
|
|
473
|
+
}
|