@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 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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentic-sdlc-skill",
3
- "version": "1.21.1",
3
+ "version": "1.22.0",
4
4
  "description": "Documentation-First SDLC protocol with triage, Vision governance and optional devPNT integration.",
5
5
  "author": "Antonio Pinto (https://github.com/Antoneeo)"
6
6
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@antoneeo/agentic-sdlc-skill",
3
- "version": "1.21.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.21.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, and what
138
- "good UX" means to them. These become the Vision's `## Actors`; each
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", "comprehension_guides", "tdd", "subagent_dispatch",
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
- if "GENERATED by sdlc_check.py index" in text:
845
- return [] # already ours
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