@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.
- package/CHANGELOG.md +467 -332
- package/README.md +122 -95
- package/gemini-extension.json +1 -1
- package/package.json +50 -48
- package/scripts/init.js +217 -156
- package/scripts/lib.js +60 -1
- package/skills/agentic-sdlc-skill/ENFORCEMENT.md +10 -6
- package/skills/agentic-sdlc-skill/SKILL.md +4 -1
- package/skills/agentic-sdlc-skill/elicitation.md +123 -14
- package/skills/agentic-sdlc-skill/review.md +25 -3
- package/skills/agentic-sdlc-skill/routing.md +100 -0
- package/skills/agentic-sdlc-skill/scripts/sdlc_check.py +52 -1470
- package/skills/agentic-sdlc-skill/scripts/sdlc_core.py +1996 -0
- package/skills/agentic-sdlc-skill/templates.md +12 -0
|
@@ -1,22 +1,130 @@
|
|
|
1
1
|
# Spec Elicitation
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
|
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 (
|
|
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
|
|
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.
|