@antoneeo/agentic-sdlc-skill 1.21.1 → 1.22.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/CHANGELOG.md +30 -0
- package/gemini-extension.json +1 -1
- package/package.json +1 -1
- package/skills/agentic-sdlc-skill/SKILL.md +5 -2
- package/skills/agentic-sdlc-skill/elicitation.md +5 -2
- package/skills/agentic-sdlc-skill/review.md +14 -0
- package/skills/agentic-sdlc-skill/scripts/sdlc_check.py +2 -2
- package/skills/agentic-sdlc-skill/scripts/sdlc_core.py +6 -2
- package/skills/agentic-sdlc-skill/templates.md +31 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,36 @@
|
|
|
2
2
|
|
|
3
3
|
Tutte le modifiche significative a questa skill saranno documentate in questo file.
|
|
4
4
|
|
|
5
|
+
## [1.22.0 / kb 1.4.2 / mkt 0.4.2] - 2026-08-05
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
- **Interaction Contract (F-032, code lens).** A conditional `## Interaction Contract`
|
|
9
|
+
section in the ANALYSIS, between the use cases and the Capability Ledger: per use
|
|
10
|
+
case, actor action on surface → system response → outcome, with view states,
|
|
11
|
+
existing interaction idioms reused by default and non-binding feasibility notes.
|
|
12
|
+
Fires when the change creates or modifies a surface an actor *acts on or perceives*
|
|
13
|
+
(trigger owned by the `templates.md` section comment; SKILL.md and review.md cite
|
|
14
|
+
it). Binds observable behavior only — after design approval a contracted path
|
|
15
|
+
changes only as a user-approved scope change. Hybrid sequence: D-UC → D-IC → P-TM →
|
|
16
|
+
E-ISP — the E-ISP inherits the interaction, it never generates it. Enforced by a
|
|
17
|
+
lens-keyed clause in the shared `review.md` (inert in kb/mkt, whose templates
|
|
18
|
+
define no such section) and a wiring invariant test in all three batteries.
|
|
19
|
+
Ceremony cost disclosed and owner-accepted (rulings r16; ADR 2026-08-04).
|
|
20
|
+
|
|
21
|
+
### Fixed
|
|
22
|
+
- **Registry recognition hard-coded to one entry point (all three lenses).** The
|
|
23
|
+
workstream-registry header is written with `entry_script()` but was recognized as
|
|
24
|
+
"already ours" only by the literal `sdlc_check.py`: a registry generated by
|
|
25
|
+
`mkt_check.py` was treated as legacy and re-checked for conversion blockers on
|
|
26
|
+
every run. Recognition now matches the generated marker for any family entry point.
|
|
27
|
+
- **mkt battery isolation.** `test_merge_safety` built `ai_docs` fixtures while
|
|
28
|
+
inheriting whichever docs root the last imported module set — unittest discovery
|
|
29
|
+
imports every module (including the mkt overlay, which flips the default to
|
|
30
|
+
`mkt_docs`) before any test runs, so the marketing battery failed 13+1 under full
|
|
31
|
+
discovery and passed module-by-module. The battery now pins its docs root in
|
|
32
|
+
`setUpModule`, as `test_skill_invariants` already did. Full discovery green in all
|
|
33
|
+
three distributions.
|
|
34
|
+
|
|
5
35
|
## [1.21.1 / kb 1.4.1 / mkt 0.4.1] - 2026-08-03
|
|
6
36
|
|
|
7
37
|
### Added
|
package/gemini-extension.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@antoneeo/agentic-sdlc-skill",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.22.0",
|
|
4
4
|
"description": "Documentation-First SDLC protocol for Claude Code, Gemini CLI, Google Antigravity and Codex with risk triage, Vision governance, installed support files and optional devPNT integration.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"claude-code",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: agentic-sdlc
|
|
3
|
-
version: 1.
|
|
3
|
+
version: 1.22.0
|
|
4
4
|
description: Documentation-First SDLC protocol with risk-proportional triage, Vision as a guide, a complete Standalone mode and optional symbiosis with devPNT. Use for features, significant bugs, refactors, audits and documented maintenance.
|
|
5
5
|
author: Antonio Pinto (https://github.com/Antoneeo)
|
|
6
6
|
copyright: (c) 2026 Antonio Pinto
|
|
@@ -218,6 +218,8 @@ Hybrid:
|
|
|
218
218
|
|
|
219
219
|
For any L3, run the spec elicitation round in `elicitation.md` BEFORE drafting the analysis (skip path inside — one-line note when the spec is already complete).
|
|
220
220
|
|
|
221
|
+
**Interaction Contract before the Impact (conditional).** When the change creates or modifies an actor-facing surface — the trigger's owning definition lives in the `templates.md` section comment; cite it, never restate it — the ANALYSIS carries a `## Interaction Contract`: the observable behavior the actors get, per use case (actor action on surface → system response → outcome), built by first reading the surfaces and interaction idioms already in place and reusing them by default (a new idiom is a declared decision, never an unmarked invention). It binds observable behavior only — components and files stay the Impact's vocabulary. Drafting interleaves with the architect pass below (the contract's feasibility notes are early capability probes), but finalization is ordered: contract and Ledger are both complete before the Impact is drafted. After design approval, a contracted path changes only as a user-approved scope change — the solution proposes, never silently enacts. Trigger not fired → one line in the section stating why. Why it exists: without it the interaction is invented at implementation time, UX is emergent instead of designed, and the review's "actor UX fit" check has no object.
|
|
222
|
+
|
|
221
223
|
**Architect before you list files.** Once the spec is known and BEFORE drafting the Impact, run the architect pass in `architect.md`: state what the feature requires the system to be able to DO (capabilities — verbs over domain nouns, no files), rule each one against the platform — **EXISTS** (name the component and where it lives) / **INADEQUATE** (name the gap) / **MISSING** (say what you searched) — and design what is missing as a component with **its own contract, in its own vocabulary**, of which this feature is one consumer. The output goes where that mode keeps designs — Standalone: the ANALYSIS `## Capability Ledger`; Hybrid: the `E-ISP`, above its Impacted Components map (`architect.md`; never a second copy in `ai_docs/`) — and it feeds the Impact. Note the coverage asymmetry: the validator backstop reads Standalone ANALYSIS files only, so in Hybrid the sole check that the pass ran is `review.md`'s ledger clause — which is why that clause fires on a MISSING ledger and not only on the rows of one that is present. Why it is its own step: a feature is not a unit of construction, and an agent that skips it builds the missing capability inside the feature's code path, where no component owns it and the next feature rebuilds it differently. The pass is a question, not a form — when every capability plainly exists, one line answers it.
|
|
222
224
|
|
|
223
225
|
**Blast-radius enumeration is an authoring duty, not a review finding.** Before writing the Impact (the list of what changes), for every symbol whose signature you change, thread a new field through, or that has more than one caller: mechanically enumerate EVERY consumer with the best symbol-graph tool your toolchain offers — an LSP/IDE call hierarchy or a find-usages / call-graph capability — with `grep` only as a last-resort fallback, and list the full set in the Impact. Anchor to symbol identity, not line numbers (they rot). This is deterministic and cheap: doing it up-front collapses the review into one pass, instead of the reviewer returning "you missed a consumer" one round at a time. Leaving completeness to the closure review is the myopia failure this whole workflow exists to prevent.
|
|
@@ -225,7 +227,7 @@ For any L3, run the spec elicitation round in `elicitation.md` BEFORE drafting t
|
|
|
225
227
|
Standalone L3:
|
|
226
228
|
- Before creating a new `ANALYSIS_[feature].md`, search `ai_docs/solutions/` with glob/grep for an existing analysis on the same topic: if there is one, update it instead of duplicating it.
|
|
227
229
|
- Create or update `ai_docs/solutions/ANALYSIS_[feature].md`.
|
|
228
|
-
- Minimum sections: Objective, Feature Vision (or Vision Alignment), Use Cases / User Needs, Capability Ledger, Impact, Security and Threat Model, Action Plan, Test Strategy, Diary/Current State. (`review.md` makes an uncovered use-case a finding, so an ANALYSIS without that section fails its own closure review.)
|
|
230
|
+
- Minimum sections: Objective, Feature Vision (or Vision Alignment), Use Cases / User Needs, Interaction Contract (conditional — the paragraph above), Capability Ledger, Impact, Security and Threat Model, Action Plan, Test Strategy, Diary/Current State. (`review.md` makes an uncovered use-case a finding, so an ANALYSIS without that section fails its own closure review.)
|
|
229
231
|
- Build the Impact/solution **on** the Vision, the use-cases/user-needs and the Security & Threat Model — read and trace to them first, and state the trace (which actor / use-case / threat / benefit each part serves) so the closure review (`review.md`) can verify conformance. Do not draft the Impact in isolation.
|
|
230
232
|
- For a feature known to span multiple milestones, also create `ai_docs/vision/features/VISION_[feature].md`; the retroactive case (extract it when the SECOND `ANALYSIS_*` on a theme appears) is in Write Triggers.
|
|
231
233
|
|
|
@@ -234,6 +236,7 @@ Standalone L3:
|
|
|
234
236
|
Hybrid L3:
|
|
235
237
|
- Restore the Master Plan, Action Plan and linked documents.
|
|
236
238
|
- Use devPNT for plans and governed artifacts.
|
|
239
|
+
- The Interaction Contract lives in the `E-ISP`, above its Impacted Components map (like the Capability Ledger — never a second copy in `ai_docs/`); a dedicated governed artifact for it is devPNT-side work, not this skill's. Its place in the governed sequence is between `D-UC` and `P-TM`: the use cases say what the person needs, the contract says through which surface, the threat model then assesses those surfaces — the `E-ISP` inherits the interaction, it never generates it.
|
|
237
240
|
- Use `ai_docs/solutions/SHADOW_[doc_key]_vX.Y.md` only as a readable shadow when needed; on divergence devPNT wins.
|
|
238
241
|
|
|
239
242
|
### 4. Development and Testing
|
|
@@ -134,8 +134,11 @@ exists (this narrows the reply and speeds up the round). Cover:
|
|
|
134
134
|
answer to "never lose the thread" — ask again until it is a benefit
|
|
135
135
|
(`vision.md`: the Vision is the distilled benefit; solutions and preferences
|
|
136
136
|
are what gets filtered out).
|
|
137
|
-
2. **Actors** — who interacts with this: their role, primary goal,
|
|
138
|
-
"good UX" means to them
|
|
137
|
+
2. **Actors** — who interacts with this: their role, primary goal, what
|
|
138
|
+
"good UX" means to them, and the surfaces they use today for this job
|
|
139
|
+
(the screens, commands or endpoints they operate — the Interaction
|
|
140
|
+
Contract's as-is starts here; skip the surface half when no actor-facing
|
|
141
|
+
surface is in scope). These become the Vision's `## Actors`; each
|
|
139
142
|
use-case below attaches to one (actor = who they are, use-case = what
|
|
140
143
|
they do). Skip only when an approved Vision already names them.
|
|
141
144
|
3. **Scope boundaries** — what is explicitly included in this unit of work.
|
|
@@ -168,6 +168,20 @@ When you are the reviewer:
|
|
|
168
168
|
mark ANALYZED, with no searches named**, is the finding that matters most on a
|
|
169
169
|
project the methodology arrived in recently — an unread map reported as an empty
|
|
170
170
|
one is how a duplicate of the existing codebase gets designed.
|
|
171
|
+
- **Interaction Contract (same reviews; fires only in the lens whose template
|
|
172
|
+
defines the section — the code lens today).** When the change creates or
|
|
173
|
+
modifies an actor-facing surface (the trigger's owning definition is the code
|
|
174
|
+
lens's `templates.md` section comment — cite it, never restate it), **an
|
|
175
|
+
artifact carrying NO `## Interaction Contract` is itself a finding** — "the
|
|
176
|
+
artifact does not have one" is what a skipped contract looks like, not a reason
|
|
177
|
+
to skip the check. When the contract is there, four findings live here: a
|
|
178
|
+
use-case with no named interaction path realizing it; a design or diff element
|
|
179
|
+
that alters a contracted observable behavior with no explicit renegotiation
|
|
180
|
+
note (after design approval that is a scope change owed to the user, not a
|
|
181
|
+
design detail); a contracted path the `## Test Strategy` does not cover; and a
|
|
182
|
+
new interaction idiom introduced where the contract's own as-is names an
|
|
183
|
+
existing one, with no declared reason. A lens whose template defines no such
|
|
184
|
+
section (knowledge, marketing) never fires this clause.
|
|
171
185
|
|
|
172
186
|
## Anti-patterns
|
|
173
187
|
|
|
@@ -56,8 +56,8 @@ sdlc_core.set_profile(
|
|
|
56
56
|
"triage", "write_triggers", "workstream_registry", "vision_gate",
|
|
57
57
|
"design_review_gate", "guide_router", "worktree_hygiene",
|
|
58
58
|
# code overlay
|
|
59
|
-
"architect_pass", "
|
|
60
|
-
"legacy_narrative_handoff", "question_discipline",
|
|
59
|
+
"architect_pass", "interaction_contract", "comprehension_guides", "tdd",
|
|
60
|
+
"subagent_dispatch", "legacy_narrative_handoff", "question_discipline",
|
|
61
61
|
),
|
|
62
62
|
design_gate_between=("### 3. Request Analysis", "### 4. Development and Testing"),
|
|
63
63
|
)
|
|
@@ -245,6 +245,7 @@ REQUIRED_CAPABILITIES = frozenset({
|
|
|
245
245
|
# Listed here so "this distribution does not claim it" is a visible decision.
|
|
246
246
|
OPTIONAL_CAPABILITIES = frozenset({
|
|
247
247
|
"architect_pass", # does the component already exist? (code overlay)
|
|
248
|
+
"interaction_contract", # actor-facing surface spec between use cases and solution (code overlay)
|
|
248
249
|
"taxonomy_pass", # do the categories/topics already exist? (knowledge overlay)
|
|
249
250
|
"comprehension_guides", # source_kind: code maps of complex components
|
|
250
251
|
"tdd", # test-first discipline
|
|
@@ -841,8 +842,11 @@ def registry_conversion_blockers(root):
|
|
|
841
842
|
if not hand.is_file():
|
|
842
843
|
return []
|
|
843
844
|
text = read_text(hand)
|
|
844
|
-
|
|
845
|
-
|
|
845
|
+
# "Already ours" = written by ANY family entry point: the header is WRITTEN
|
|
846
|
+
# with entry_script(), so recognition must not hard-code one distribution's
|
|
847
|
+
# script name (a registry generated by mkt_check.py is just as generated).
|
|
848
|
+
if re.search(r"GENERATED by \S+ index - do not edit by hand", text):
|
|
849
|
+
return []
|
|
846
850
|
blockers = []
|
|
847
851
|
known = {str(m.get("workstream")).strip() for _p, m in list_workstreams(root)}
|
|
848
852
|
orphans = [r for r in parse_registry_rows(text) if r not in known]
|
|
@@ -250,6 +250,37 @@ checks: [marketing.funnel] # optional — extra portable checks to run on t
|
|
|
250
250
|
use-case = what they do. Derived from the elicitation round; the Impact below
|
|
251
251
|
must cover each, and the closure review checks coverage + actor UX fit. -->
|
|
252
252
|
|
|
253
|
+
## Interaction Contract
|
|
254
|
+
<!-- [conditional] Fires when the change creates or modifies a surface through
|
|
255
|
+
which an actor **acts on or perceives** the system — GUI view, CLI
|
|
256
|
+
command/flags, API endpoint, user-edited config, notification or
|
|
257
|
+
user-facing message. The verb pair is the test; the list is illustrative.
|
|
258
|
+
IN: an error dialog's wording and states (the actor perceives it and
|
|
259
|
+
decides on it). OUT: an internal log format, a private module API
|
|
260
|
+
(operated by code, not by an actor). Not fired → one line stating why.
|
|
261
|
+
This comment is the OWNING definition of the trigger; SKILL.md and
|
|
262
|
+
review.md cite it, never restate it.
|
|
263
|
+
Content, in this order:
|
|
264
|
+
1. As-is — the touched surfaces as they exist, AND the interaction
|
|
265
|
+
patterns/idioms already in use relevant to these use cases (how the
|
|
266
|
+
product already does selection, confirmation, errors, navigation).
|
|
267
|
+
2. Per use case, the interaction path (table below): actor action on
|
|
268
|
+
surface → system response → outcome. Reuse the as-is idioms by
|
|
269
|
+
default; a NEW idiom where an existing one covers the job is a
|
|
270
|
+
declared decision with its reason — never an unmarked invention.
|
|
271
|
+
3. States for each new/changed view: empty, loading, error, denied.
|
|
272
|
+
4. Feasibility notes, NON-binding: "path X presupposes reuse of Y",
|
|
273
|
+
"alternative Z discarded: disproportionate cost" — hypotheses the
|
|
274
|
+
Impact confirms or refutes (early architect-pass probes).
|
|
275
|
+
The contract binds OBSERVABLE behavior only — no components, no files
|
|
276
|
+
(that is the Impact's vocabulary). After design approval, changing a
|
|
277
|
+
contracted path is a scope change the USER approves: the solution may
|
|
278
|
+
propose it, never enact it silently. Every contracted path is covered
|
|
279
|
+
by ## Test Strategy. -->
|
|
280
|
+
|
|
281
|
+
| Use case | Surface | Actor action | System response | Outcome |
|
|
282
|
+
|---|---|---|---|---|
|
|
283
|
+
|
|
253
284
|
## Capability Ledger
|
|
254
285
|
<!-- the architect pass (`architect.md`), run BEFORE the Impact below. One row per
|
|
255
286
|
capability the feature requires the system to be able to DO — a verb over a
|