@antoneeo/mkt-agentic-sdlc-skill 0.2.1 → 0.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.
@@ -1,73 +1,168 @@
1
- # CMO Review Discipline
2
-
3
- Applies at the Strategy gate (phase 6), the final packaging gate (phase 9),
4
- and any independent review slot in a connected governance layer (devPNT
5
- review gates). This is the single definition of how to request, receive, and
6
- perform a marketing review; other places point here instead of restating it.
7
-
8
- The reviewer is a skeptical CMO with a fresh context: different session or
9
- subagent, read-only, given the artifacts — never "review my session".
10
- Fallback when no independent context is available: run the battery yourself
11
- as an explicit, separate adversarial pass, and say so (independence is
12
- reduced).
13
-
14
- ## Requesting
15
-
16
- Hand the reviewer:
17
- - **Scope**: which artifact, which gate, in one or two lines.
18
- - **The artifact itself** — full text, not a paraphrase.
19
- - **The constraints it derives from**: the approved MKT-VISION, the
20
- OBJECTIVES (for strategy/tactics reviews), the ICP_PERSONAS and THREAT_MAP,
21
- and the **evidence ledger** — the reviewer checks the artifact **against**
22
- them, not only for internal consistency.
23
- - Which finding classes to cover when the default is not obvious.
24
-
25
- ## Receiving
26
-
27
- **Answer findings one by one — fix, or justify with evidence.** Silent drops
28
- turn review into theater. Disagree explicitly with reasoning; never resolve a
29
- disagreement by rewording the finding. Cap 3 rounds; then surface open
30
- findings to the user rather than looping. If any edit is made after a PASS,
31
- re-review: reviewed text must equal shipped text.
32
-
33
- ## Reviewing — the red-flag battery
34
-
35
- Severity: `BLOCK` (artifact does not pass the gate) / `WARN` (ships only with
36
- explicit user acknowledgment). Every finding cites its location.
37
-
38
- | # | Check | Severity |
39
- |---|---|---|
40
- | R1 | **Swap test**: replace our name with the top competitor in the positioning STATEMENT ACTUALLY PUBLISHED (not a stronger paraphrase — test the exact sentence that ships); if it still holds for any competitor, positioning does not exclude | BLOCK |
41
- | R2 | **Untraced number**: any figure without `[EV-nn]` | BLOCK |
42
- | R3 | **Laundered assumption**: ASSUMPTION used as certainty in prose ("the market is worth X" vs "we assume X-Y") | BLOCK |
43
- | R4 | **Orphan tactic**: tactic serving no objective; **orphan objective**: objective with no KPI or no serving tactic | BLOCK |
44
- | R5 | **Broken funnel math**: chain does not recompute, or projected outcome does not meet the objective target and no gap is declared | BLOCK |
45
- | R6 | **Missing kill/scale criteria** on any funded channel | BLOCK |
46
- | R7 | **Stale benchmark**: >24 months old, not flagged | WARN |
47
- | R8 | **Top-down-only TAM**: no bottom-up cross-check | WARN |
48
- | R9 | **Invented persona**: persona trait with no VoC trace and no ASSUMPTION label | WARN |
49
- | R10 | **Channel vs ICP mismatch**: channel scores poorly on the selection matrix with no written rationale | WARN |
50
- | R11 | **Generic messaging**: pillar without proof points; value prop interchangeable with any competitor's | WARN |
51
- | R11b | **Low-cost trap / price-led positioning**: the positioning leads with cheapness ("prezzo onesto", "senza pagarlo caro", price comparison as the hook) instead of leading with value and framing price as a consequence — invites the customer to leave for the next cheaper option | WARN (BLOCK if the whole prop reduces to price) |
52
- | R12 | **Vision divergence**: artifact pursues a goal absent from the approved MKT-VISION, or violates a non-goal | BLOCK |
53
- | R13 | **Capacity fiction**: plan requires execution capacity Wave 3 says does not exist | BLOCK |
54
- | R14 | **SMART violation**: objective without number, date, or owner | WARN |
55
- | R15 | **Strawman swap-test**: the swap-test verdict tests a differentiated formulation while a WEAKER, generic sentence is what actually ships as the positioning line | BLOCK |
56
-
57
- ## Conformance statement (strategy & final-plan reviews)
58
-
59
- A PASS is **not valid on "found nothing"**. The verdict must map each
60
- constraint to evidence: every approved objective → the strategy element
61
- serving it → the tactics funding it → the KPI measuring it (cite sections);
62
- every MKT-VISION benefit and non-goal → where the artifact honors it; every
63
- material ledger ASSUMPTION → where the plan declares it. A gap in the chain
64
- is a finding, not a footnote. Quick E1/E2 reviews stay findings-only.
65
-
66
- ## Anti-patterns
67
-
68
- - **Praise padding** — a review reports problems and fixes.
69
- - **Batch-dismissal** of a findings list with one blanket reply.
70
- - **Severity inflation/deflation** — a style preference is not a BLOCK; a
71
- broken funnel is not a nit.
72
- - **Scope-creep findings** — issues outside the artifact under review are
73
- filed separately, not mixed in.
1
+ # Review Discipline
2
+
3
+ The single definition of how to request, receive, and perform a review. Other
4
+ places that need review behavior point here instead of restating it (DRY) —
5
+ including devPNT's §4.5/§4.6 gates and any future review step.
6
+
7
+ ## When a review is due
8
+
9
+ Two moments, and they review different things:
10
+
11
+ | # | Moment | Object | Level |
12
+ |---|---|---|---|
13
+ | **1. Design review** | End of Phase 3 — **before any implementation** | the ANALYSIS (Standalone) / the `E-ISP`+`E-TDD` (Hybrid) | L3 |
14
+ | **1b. Late arrival** | Work that became L3 *after* code existed — an L1/L2 reclassified mid-flight, or a design increment on a feature already implemented — runs moment 1 **now**, before any further implementation, logged `design (late)` | same | L3 |
15
+ | **2. Closure review** | Phase 5, before DONE | the actual diff, against that approved design | L2 / L3 — the L2 row is optional |
16
+
17
+ **Why the design review is its own moment, and not a nicety.** The closure review
18
+ can only tell you the code matches the design; it cannot tell you the design was
19
+ wrong. An omission in the design — an impacted file nobody listed, a threat with no
20
+ answering requirement, a capability ruled EXISTS on an assumption — is *cheapest*
21
+ to fix before code exists and most expensive after. And the author cannot catch it:
22
+ a self-review runs in the context that produced the omission and is structurally
23
+ blind to it, which is why independence, not effort, is what this gate buys.
24
+
25
+ **Independence, best realization the client supports** — declare which one you used:
26
+
27
+ 1. **A fresh subagent** (Claude Code's Task tool, or the equivalent facility) with
28
+ its own context, given the artifacts below and nothing from this conversation.
29
+ 2. **A one-shot run of the client itself** (`gemini -p "…"`, `codex exec "…"`) with
30
+ a SELF-CONTAINED prompt — the reviewer session has no other context, which is
31
+ exactly what makes it independent.
32
+ 3. **A declared self-pass** — a separate, explicitly adversarial pass by you,
33
+ against the same checklist. **Rung 3 is illegitimate wherever rung 1 or 2
34
+ exists**: on a client with a subagent facility or a one-shot CLI, descending to
35
+ it is choosing zero independence, which is the one thing this gate buys. When
36
+ you do use it, the log row must carry *why* — `self-pass (declared; no subagent
37
+ facility on this client)` — not merely that you did. A rung named without its
38
+ reason is indistinguishable from a rung chosen for convenience.
39
+
40
+ Rung 3 stays in the ladder deliberately: it is what keeps the methodology
41
+ completable with no network, no account and no subagent facility. It is a floor,
42
+ never a default.
43
+
44
+ Use a different model from the author's where the client allows it.
45
+
46
+ **Rounds are capped at 3.** FAIL → revise → re-review. If findings still stand
47
+ after the third, stop and surface them to the user with the artifact — a gate that
48
+ can block forever gets removed. **Log one row per completed review, PASS or FAIL**
49
+ — a FAIL surfaced to the user is the highest-value outcome the gate produces, and
50
+ logging only passes would erase exactly that evidence. The row goes in
51
+ `ai_docs/audit/reviews/REVIEW_LOG.md` (create it if absent — `templates.md`):
52
+ `| date | doc_key | tier | reviewer | findings_raised | findings_real | verdict | revise_rounds |`,
53
+ with `tier` = `design` or `closure` in Standalone. One schema for both modes: a
54
+ Hybrid project's devPNT gates write to the same file.
55
+ The log is how the gate's value is measured over time; skipping it makes the gate
56
+ unfalsifiable, the same defect as an unnamed EXISTS or a faked router verdict.
57
+
58
+ **The reviewer is read-only and advisory.** It never edits, never commits, never
59
+ marks anything DONE, and a PASS is not an approval to merge — the human owns that.
60
+
61
+ ## Requesting
62
+
63
+ When you hand work to a reviewer (human or agent), give them:
64
+
65
+ - **Scope**: what changed and why, in one or two lines.
66
+ - **The authoritative design artifact**: the ANALYSIS, E-TDD, or equivalent
67
+ the change was built against — not a paraphrase of it.
68
+ - **The actual diff**: the real changed files, not a description of them. (For a
69
+ **design** review there is no diff yet — that is the point; hand the artifact
70
+ plus the constraints below, and say the object under review is the design.)
71
+ - **For an impact/solution-analysis review, the constraints it derives from**:
72
+ the **Vision**, including its `## Actors` (Hybrid: the `M-VISION`; Standalone:
73
+ `project_vision.md`/`roadmap.md` + the ANALYSIS Vision-Alignment), the
74
+ **use-cases / user-needs** (Hybrid: `D-UC`;
75
+ Standalone: the ANALYSIS `## Use Cases / User Needs`), and the **threat model**
76
+ (Hybrid: `P-TM`; Standalone: the ANALYSIS `## Security and Threat Model`). Hand these
77
+ *in addition to* the design artifact — the reviewer checks the artifact **against**
78
+ them, not only for internal consistency.
79
+ - **For a design review, the threat model too** (same sources as above). Why this
80
+ one and not the whole set: file coverage crosses the impact-analysis→design hop on
81
+ a mechanical gate (every impacted file needs a design block), so a dropped file is
82
+ caught; **threats have no such gate** — a threat answered in the impact analysis
83
+ can silently fail to become a security requirement in the design, and the later
84
+ code review only verifies the requirements that are there, never the ones that
85
+ should have been. The design reviewer checks that every threat surface the change
86
+ touches has a matching security requirement.
87
+
88
+ Never ask a reviewer to "review my session" or "review what I just did"
89
+ without the artifacts above — that forces them to reconstruct scope from
90
+ conversation instead of reviewing the change itself. Say which finding
91
+ classes you want covered (correctness, security, conformance to the design,
92
+ test coverage) if the default scope is not obvious.
93
+
94
+ ## Receiving
95
+
96
+ **MUST answer findings one by one — fix, or justify with evidence; why:
97
+ silent drops turn review into theater** — a review whose findings are not
98
+ tracked to a resolution gives the appearance of quality control without its
99
+ substance.
100
+
101
+ If you disagree with a finding, say so explicitly with your reasoning; never
102
+ resolve a disagreement by rewording the finding until it goes away. When the
103
+ project keeps a `REVIEW_LOG` (or equivalent), log the outcome of each
104
+ finding there.
105
+
106
+ ## Reviewing
107
+
108
+ When you are the reviewer:
109
+
110
+ - Verify claims against the real source, not against the diff's own
111
+ description of itself.
112
+ - Cite evidence as `file:line` for every finding — a finding without a
113
+ location is not actionable.
114
+ - Keep severity honest: do not inflate a style preference to a blocker, and
115
+ do not soften a real correctness or security issue to a nit.
116
+ - No praise padding. A review reports problems and their fixes, not a
117
+ summary of what looks fine.
118
+ - **Conformance statement (impact/solution-analysis & design reviews only — not a
119
+ plain code-diff review).** When the artifact under review carries Vision / use-case
120
+ / threat-model constraints, your output MUST map each constraint to its evidence: for
121
+ every use-case/user-need (and the Actor it serves — a use-case with no defined Actor,
122
+ or an Actor UX expectation the solution does not meet, is a finding), every threat, and
123
+ every applicable Vision benefit/Non-Goal, state WHERE the artifact satisfies it (section
124
+ or `file:line`) or raise it as a finding. A PASS/approve is **not valid on "found nothing"** — the conformance
125
+ statement is the proof the check ran; an unfalsifiable "I checked" is the review
126
+ theater this discipline exists to prevent (the reviewer-side twin of §Receiving's
127
+ silent-drop rule). Plain code reviews stay findings-only.
128
+ - **Restated facts (cite, never copy).** Every governance slot has ONE owning document
129
+ per project. A fact restated in the artifact under review when another document owns
130
+ it is a **finding**: the fix is a citation naming the owner, not a better copy. This
131
+ binds the conformance statement too — where a constraint is satisfied by another
132
+ document, name that document as the evidence instead of repeating what it says. Two
133
+ copies of one fact diverge at the first edit, and the reader then has no way to tell
134
+ which one is current. The rule bites hardest across domains, where the same slot
135
+ ("threat model", "vision", "handoff") carries a different meaning under each lens and
136
+ a copy looks like an independent second source.
137
+ - **Capability Ledger (same reviews).** **An L3 impact/solution analysis or design
138
+ that carries NO Capability Ledger is itself a finding** — the lens's capability
139
+ pass (`architect.md` in the code lens, `taxonomy.md` in the knowledge lens) left
140
+ no record, and "the artifact does not have one" is what a skipped pass looks like,
141
+ not a reason to skip the check. (This half is load-bearing in Hybrid, where the
142
+ validator backstop reads Standalone ANALYSIS files only and this clause is the
143
+ sole check that the pass ran.) When the ledger is there, map each
144
+ ledger row to where the design or diff realizes it. Three findings live here and
145
+ nowhere else (the capability-pass file named above): a capability ruled MISSING but implemented inside
146
+ the feature's code path, with no component owning it; a component whose contract
147
+ names the feature (a second consumer would force it open); and a capability ruled
148
+ MISSING, not built, and absorbed by quietly reshaping the feature — that is a
149
+ scope change owed to the user, not a design detail. An EXISTS row with no named
150
+ path or symbol is itself a finding. A capability built in this change and absent
151
+ from the `## Component Map` (`strategic/architecture.md`, where the lens keeps one) is a finding too — and
152
+ so is **a component the pass merely DISCOVERED and did not write**, especially
153
+ when the change marks that area ANALYZED: the area now looks read, the map is
154
+ still silent, and the next feature may lawfully rule the capability MISSING and
155
+ build it twice. And a **MISSING row in an area `audit/audit_plan.md` does not
156
+ mark ANALYZED, with no searches named**, is the finding that matters most on a
157
+ project the methodology arrived in recently — an unread map reported as an empty
158
+ one is how a duplicate of the existing codebase gets designed.
159
+
160
+ ## Anti-patterns
161
+
162
+ - **Batch-dismissal**: closing out a whole findings list with one blanket
163
+ reply instead of addressing each finding individually.
164
+ - **Rewording instead of addressing**: editing the finding's text to look
165
+ resolved without changing the code or providing evidence it is a
166
+ non-issue.
167
+ - **Scope-creep findings**: raising issues unrelated to the change under
168
+ review instead of filing them separately.
@@ -0,0 +1,100 @@
1
+ # Domain Routing — which lens owns this unit of work
2
+
3
+ The family ships as sibling skills built from one shared core: each lens carries its
4
+ own **fidelity discipline** (what the work must be faithful to) and its own validation
5
+ rules, over **one** `ai_docs/` tree. This file answers one question: *which lens's
6
+ method governs THIS unit of work?* It does not decide where the resulting file is
7
+ stored (step 5), and it never runs before the triage level is known — L1 never
8
+ reaches it.
9
+
10
+ ## 0. Installed-lens detection — run first, fail open
11
+
12
+ Look in the skills directory this skill was loaded from for sibling lenses of the
13
+ family, identified by the `name:` in their `SKILL.md`:
14
+
15
+ | Lens | Skill name | Faithful to |
16
+ |---|---|---|
17
+ | code | `agentic-sdlc` | this repository's code |
18
+ | knowledge | `kb-agentic` | documents the user supplied |
19
+ | marketing | `mkt-agentic-sdlc` | market evidence |
20
+
21
+ - **No sibling installed, or the directory cannot be read** → the router does NOT run.
22
+ Work under the loaded lens; read no further. This is the normal single-lens case and
23
+ it costs nothing.
24
+ - **At least one sibling installed** → run the router below, after the level test, on
25
+ every L2, L3 and Spike.
26
+
27
+ Fail-open is deliberate: a detection that cannot answer must never block the work. A
28
+ single-lens project that silently gains a router verdict it cannot act on is worse
29
+ than no verdict at all.
30
+
31
+ ## 1. The router
32
+
33
+ Run the steps in order. Stop at the first one that decides.
34
+
35
+ 1. **Fidelity / purpose.** What must the work be faithful to?
36
+ - *This repository's code* → provisional **code**; continue to step 2.
37
+ - *Documents the user supplied* → **knowledge**. Decided.
38
+ - *Market evidence* → **marketing**. Decided.
39
+ - *A deliverable whose purpose is market-facing persuasion* (copy, positioning,
40
+ campaign material) → **marketing regardless of source**. Decided. Without this
41
+ branch the marketing lens is reachable only when the *source* is market evidence,
42
+ never when the *purpose* is marketing — and the launch post written from the
43
+ release notes routes to code.
44
+
45
+ 2. **Deliverable class** — only on the provisional `code` branch. The predicate is on
46
+ the deliverable, not on its audience:
47
+ - *Part of this repository's own document set, shipping and maintained with the
48
+ code* (`ai_docs/`, README, CHANGELOG, comprehension guides, migration notes) →
49
+ **code**; continue to step 3.
50
+ - *A standalone knowledge deliverable whose fidelity extends beyond this repo's
51
+ code* (user documentation for an external audience, a distilled corpus) →
52
+ **knowledge**. Decided; step 3 is not reached.
53
+
54
+ 3. **Build-consumed override** — only on the provisional `code` branch, never
55
+ overriding a *marketing* or *supplied-documents* verdict. *Is the deliverable a
56
+ file the project's build or test toolchain consumes?* Executable or imported
57
+ source: yes. Committed Markdown: no. A yes confirms **code**.
58
+
59
+ 4. **Split rule.** A request whose work must be faithful to two sources is **two units
60
+ of work**, split before routing: the distillation (knowledge) and the design that
61
+ cites it (code) each route alone. The router returns one lens per unit; it never
62
+ returns two lenses for one unit.
63
+
64
+ 5. **Owning tree.** A straddling artifact keeps its lens for *method* and takes this
65
+ repository's tree and validator for *storage*. Lens and location are separate
66
+ answers — a marketing-lens document written in a code repository still lives in
67
+ that repository's `ai_docs/` and passes that project's validator.
68
+
69
+ 6. **Cross-check.** If the verdict contradicts an installed skill's `description`, the
70
+ descriptions are wrong: fix them. Never silently override the test with a
71
+ description.
72
+
73
+ ## 2. Worked verdicts
74
+
75
+ | Request | 1 | 2 | 3 | Lens |
76
+ |---|---|---|---|---|
77
+ | "write the API reference docs" (hand-written, ships with the repo) | code | repo's own doc set → code | not build-consumed → no flip | **code** |
78
+ | "write user documentation for our customers' admins" | code | standalone knowledge deliverable → knowledge | n/a (left the code branch at 2) | **knowledge** |
79
+ | "write the API reference docs" (generated — the work edits docstrings in source) | code | repo's own doc set → code | **build-consumed: yes → confirms code** | **code** |
80
+ | "write a comprehension guide for the auth module" | code | repo's own doc set → code | not build-consumed → no flip | **code** |
81
+ | "turn these vendor specs into a technical design" | split (step 4): spec = supplied docs; design = this repo | — | — | **knowledge** for the distillation; **code** for the design, citing it |
82
+ | "write the pricing page copy from our market research" | **purpose: market-facing → marketing** | never reached | never reached | **marketing**; stored in this repo's tree (step 5) |
83
+ | "write the launch blog post from the release notes" | purpose: market-facing → marketing | never reached | never reached | **marketing** |
84
+
85
+ ## 3. Acting on the verdict
86
+
87
+ The verdict binds the **method and the validation rules**, not the storage:
88
+
89
+ - **Verdict = the loaded lens** → continue; nothing changes.
90
+ - **Verdict = a sibling lens** → say so, and work that unit under the sibling's method
91
+ and its rule set (its templates, its mandatory risk section — code
92
+ `## Security and Threat Model`, knowledge `## Sources and Verification`, marketing
93
+ `## Threat Map / Plan Risks`). The artifact is written with an explicit
94
+ `domain:` field so the answer survives the session, and it stays in this project's
95
+ `ai_docs/` tree (step 5).
96
+ - **The unit was split** (step 4) → route and declare each half separately.
97
+
98
+ Documents under `vision/` — the project vision, principles, the roadmap — sit **above**
99
+ the domain split: they belong to no lens and are validated by the core's structural
100
+ rules only. The router is not consulted for them.