@antoneeo/agentic-sdlc-skill 1.19.0 → 1.20.3

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,22 +1,130 @@
1
1
  # Spec Elicitation
2
2
 
3
- Applies when an L3 request enters phase 3 (Request Analysis), BEFORE
4
- drafting the ANALYSIS document (Standalone) or the D-UC/E-ISP (Hybrid).
3
+ `## The question discipline` below governs EVERY question to the user — any
4
+ phase, any level, inside or outside the round. The rest of the file is the spec
5
+ elicitation round: it applies when an L3 request enters phase 3 (Request
6
+ Analysis), BEFORE drafting the ANALYSIS document (Standalone) or the D-UC/E-ISP
7
+ (Hybrid).
5
8
 
6
- Skip path: if the spec is already complete — an approved Vision or explicit
7
- user requirements already answer goal, scope, and constraints skip the
8
- round and add a one-line note in the analysis stating why it was skipped.
9
- Do not run the round as a formality when the answers are already on record.
9
+ Skip path: if the spec is already complete — an approved Vision or explicit user
10
+ requirements already answer goal, scope, and constraints, or the remainder is
11
+ derivable from the repo, `ai_docs/` and the conversation skip the round and add
12
+ a one-line note in the analysis stating why it was skipped and naming the
13
+ sources. Do not run the round as a formality when the answers are already on
14
+ record.
10
15
 
11
- Unattended path: when the user is not reachable (a scheduled or autonomous run,
12
- and a bootstrap Vision is `DRAFT` by mandate, so the skip path above cannot
13
- apply on a project's first L3), do not stall and do not invent consensus. Write
14
- the six answers as **declared assumptions** in `## Objective`, mark the ANALYSIS
15
- `BLOCKED on the user`, and stop before implementation. An assumption on the
16
- record is reviewable; a guess folded silently into a design is not.
16
+ Unattended path: when the user is not reachable (a scheduled or autonomous run)
17
+ and the skip path does not answer all six, do not stall and do not invent
18
+ consensus. Write the missing answers as **declared assumptions** in
19
+ `## Objective`, mark the ANALYSIS `BLOCKED on the user`, and stop before
20
+ implementation. An assumption on the record is reviewable; a guess folded
21
+ silently into a design is not.
22
+
23
+ ## The question discipline
24
+
25
+ A question to the user spends their attention and stalls the work; the round
26
+ below is the only place the process *plans* that cost. Everywhere, a question is
27
+ legal only when BOTH hold:
28
+
29
+ 1. **Searched first, and the search is named — with its result.** The answer is
30
+ not on record and not derivable from the repo, `ai_docs/`, the Vision or the
31
+ conversation — and the question states the terms, tools and areas you searched
32
+ **and what they returned**. Same standard as a router verdict or an
33
+ architect-pass MISSING, and it carries their floors, not only their vocabulary
34
+ (`architect.md`, `guides.md`): a search whose scope does not cover the question
35
+ is not a search; a hit you did not open does not narrow anything; and **never
36
+ fake the search** — "I looked and found nothing" that names no terms and no
37
+ areas is a search not run. A question the repo can answer is a search
38
+ outsourced to the user.
39
+ 2. **It names what is blocked.** The question states the specific decision or
40
+ fact that cannot be resolved without the reply — what you will do differently
41
+ depending on the answer. If nothing downstream changes with the answer, there
42
+ is no question.
43
+
44
+ Never legal:
45
+
46
+ - **Generic confirmation** — "shall I proceed?", "is this OK?". The process
47
+ authorizes proceeding; if a real risk motivates the ask, name the risk and the
48
+ fork — that is a blocking question and carries the form below.
49
+ - **Preference-fishing** — asking the user to pick among options that are
50
+ equivalent **in their effect on the benefit** and already decided by the
51
+ project's conventions. Cheapness to undo is NOT the test: nearly everything is
52
+ reversible under version control, and "it is reversible" as a licence to stop
53
+ asking is the silence-side evasion this clause must not fund.
54
+ - **Re-asking the record** — goal, scope or constraints that an APPROVED Vision,
55
+ an earlier reply, or the request itself already states.
56
+
57
+ What questions are FOR — what the user uniquely owns: the benefit, priorities
58
+ between conflicting goods, non-goals, acceptance, and the approvals doctrine
59
+ reserves to them (Vision promotion and amendment, scope changes, proposal
60
+ acceptance, merge decisions). Facts about intent come from the user; facts about
61
+ the system come from search. (The marketing sibling states the same rule as "ask
62
+ only what the user uniquely owns"; this is its code-domain form.)
63
+
64
+ **Precedence, because both halves can fire at once:** this paragraph wins over
65
+ the "never legal" list above it. A choice the user uniquely owns is never
66
+ preference-fishing, however cheap it is to undo; the list reaches choices that
67
+ are *not* theirs.
68
+
69
+ **Default non-blocking.** An unknown on which no fork of the work depends: write
70
+ it as a **declared assumption** in the artifact it touches — the same mechanism
71
+ the unattended path uses — proceed, and present the open points **batched**, with
72
+ the round for spec questions or with the deliverable otherwise, answered by
73
+ exception.
74
+
75
+ This is the path most work takes, so it carries the SAME evidence duty as a
76
+ question, not a lighter one — otherwise "assume it" becomes the way to skip the
77
+ standard. Each declared assumption states **what it is taken from** ("I take X
78
+ from Y" — the same shape the round uses) and **the alternative it excludes**, and
79
+ **every declared assumption reaches the batch**: an assumption nobody is shown is
80
+ not an open point, it is a silent decision. That pairing is what the kb family's
81
+ escalation rule actually does — keep BOTH sides with their sources and surface
82
+ them, never silently pick one — and this branch, not the blocking one, is where
83
+ it structurally belongs. An assumption recorded with its source and its rejected
84
+ alternative is reviewable; one recorded alone is a decision wearing an
85
+ assumption's clothes, and a session stalled on a question that could have been
86
+ an assumption is the waste this section exists to prevent.
87
+
88
+ **Blocking is reserved** for three cases: proceeding under ANY assumption would
89
+ waste the work (the forks diverge at once, and the wrong branch is rework of the
90
+ whole unit); the doctrine reserves the decision to the user (the approvals
91
+ above); or the doctrine itself mandates the stop — and a mandated stop is legal
92
+ by mandate, never re-argued here.
93
+
94
+ **Exactly two mandating files prescribe their own hand-over, and there the form
95
+ below does not apply** (two forms over one moment is the duplicate `review.md`
96
+ §Reviewing forbids): `debugging.md`'s circuit breaker — the minimal reproduction,
97
+ what was ruled out, the current best hypothesis; and `review.md`'s round cap —
98
+ the artifact plus the open findings. That list is closed. **Every other mandated
99
+ stop carries the form**, including one that names only its options and not its
100
+ evidence (`SKILL.md`'s Vision-Gate conflict names the two choices — the evidence
101
+ is still owed, and for a Vision conflict the quoted line IS the substance) and
102
+ one that prescribes nothing (`guides.md`'s guide proposal and its ingestion
103
+ bound). "The file mentions the moment" is not a prescription; only a stated
104
+ hand-over is.
105
+
106
+ A blocking question carries a mandatory form — surface both sides with their
107
+ evidence, never silently pick one:
108
+
109
+ - the fork: the concrete options and what each implies for the work;
110
+ - the evidence: what you searched, read or tried, and what it leaves undecided;
111
+ - why no assumption survives — what work is discarded if you assume and are
112
+ wrong. This is what makes case (a) falsifiable: without it, "this is a fork"
113
+ is an agent's assertion about its own convenience, and case (a) becomes the
114
+ licence for exactly the question this section forbids. Cases (b) and (c) answer
115
+ it by citing the approval or the mandate instead;
116
+ - why it is the user's call — what makes the remainder intent, priority or
117
+ approval rather than a derivable fact;
118
+ - what stays blocked until answered.
17
119
 
18
120
  ## The round
19
121
 
122
+ **Derive before asking.** Answer each of the six from the record first — the
123
+ Vision, `ai_docs/`, the conversation, the code. Ask only the residue, and carry
124
+ the derived answers into the round as declared assumptions corrected by
125
+ exception ("I take X from Y; the questions below are what no source answers"),
126
+ not re-confirmed one by one.
127
+
20
128
  Ask ONE structured set of questions, not a drip of follow-ups. Keep each
21
129
  question short and numbered; offer concrete options where a real choice
22
130
  exists (this narrows the reply and speeds up the round). Cover:
@@ -53,8 +161,9 @@ run a second round to double-check answers that were already clear.
53
161
 
54
162
  - **Interrogation**: an endless list of questions, or drip-feeding one
55
163
  question at a time across many turns instead of one structured round.
56
- - **Asking what the approved vision already answers**: re-asking goal or
57
- non-goals that a `Status: APPROVED` Vision or M-VISION already states.
58
164
  - **Collecting answers without folding them in**: getting replies in chat
59
165
  and proceeding to design without writing them into the analysis document —
60
166
  the next reader has no record of why the scope is what it is.
167
+
168
+ (The illegal question forms — generic confirmation, preference-fishing,
169
+ re-asking the record — are defined once, in `## The question discipline`.)
@@ -85,6 +85,14 @@ When you hand work to a reviewer (human or agent), give them:
85
85
  should have been. The design reviewer checks that every threat surface the change
86
86
  touches has a matching security requirement.
87
87
 
88
+ **The verdict travels back as the reviewer's own final output** — the text it
89
+ returns when it finishes, nothing else. A reviewer that tries to message the
90
+ requester mid-run depends on a delivery channel it cannot verify (a subagent
91
+ addressed by agent TYPE rather than by session gets no such channel, and the
92
+ attempt fails silently); a requester that waits for such a message stalls
93
+ holding a verdict that already exists. State the return form when you request
94
+ the review, and read the verdict where it actually arrives.
95
+
88
96
  Never ask a reviewer to "review my session" or "review what I just did"
89
97
  without the artifacts above — that forces them to reconstruct scope from
90
98
  conversation instead of reviewing the change itself. Say which finding
@@ -109,6 +117,10 @@ When you are the reviewer:
109
117
 
110
118
  - Verify claims against the real source, not against the diff's own
111
119
  description of itself.
120
+ - **Your verdict is your final output.** Deliver findings and verdict as the text
121
+ you return when you finish — never only through a message to the requester, a
122
+ channel you cannot verify and which fails silently when it is not there
123
+ (see `## Requesting`).
112
124
  - Cite evidence as `file:line` for every finding — a finding without a
113
125
  location is not actionable.
114
126
  - Keep severity honest: do not inflate a style preference to a blocker, and
@@ -125,20 +137,30 @@ When you are the reviewer:
125
137
  statement is the proof the check ran; an unfalsifiable "I checked" is the review
126
138
  theater this discipline exists to prevent (the reviewer-side twin of §Receiving's
127
139
  silent-drop rule). Plain code reviews stay findings-only.
140
+ - **Restated facts (cite, never copy).** Every governance slot has ONE owning document
141
+ per project. A fact restated in the artifact under review when another document owns
142
+ it is a **finding**: the fix is a citation naming the owner, not a better copy. This
143
+ binds the conformance statement too — where a constraint is satisfied by another
144
+ document, name that document as the evidence instead of repeating what it says. Two
145
+ copies of one fact diverge at the first edit, and the reader then has no way to tell
146
+ which one is current. The rule bites hardest across domains, where the same slot
147
+ ("threat model", "vision", "handoff") carries a different meaning under each lens and
148
+ a copy looks like an independent second source.
128
149
  - **Capability Ledger (same reviews).** **An L3 impact/solution analysis or design
129
- that carries NO Capability Ledger is itself a finding** — the architect pass left
150
+ that carries NO Capability Ledger is itself a finding** — the lens's capability
151
+ pass (`architect.md` in the code lens, `taxonomy.md` in the knowledge lens) left
130
152
  no record, and "the artifact does not have one" is what a skipped pass looks like,
131
153
  not a reason to skip the check. (This half is load-bearing in Hybrid, where the
132
154
  validator backstop reads Standalone ANALYSIS files only and this clause is the
133
155
  sole check that the pass ran.) When the ledger is there, map each
134
156
  ledger row to where the design or diff realizes it. Three findings live here and
135
- nowhere else (`architect.md`): a capability ruled MISSING but implemented inside
157
+ nowhere else (the capability-pass file named above): a capability ruled MISSING but implemented inside
136
158
  the feature's code path, with no component owning it; a component whose contract
137
159
  names the feature (a second consumer would force it open); and a capability ruled
138
160
  MISSING, not built, and absorbed by quietly reshaping the feature — that is a
139
161
  scope change owed to the user, not a design detail. An EXISTS row with no named
140
162
  path or symbol is itself a finding. A capability built in this change and absent
141
- from the `## Component Map` (`strategic/architecture.md`) is a finding too — and
163
+ from the `## Component Map` (`strategic/architecture.md`, where the lens keeps one) is a finding too — and
142
164
  so is **a component the pass merely DISCOVERED and did not write**, especially
143
165
  when the change marks that area ANALYZED: the area now looks read, the map is
144
166
  still silent, and the next feature may lawfully rule the capability MISSING and
@@ -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.