@antoneeo/agentic-sdlc-skill 1.17.0 → 1.20.2
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 +431 -299
- package/README.md +122 -93
- package/gemini-extension.json +6 -6
- package/package.json +4 -1
- package/scripts/init.js +224 -154
- package/scripts/lib.js +177 -168
- package/skills/agentic-sdlc-skill/ENFORCEMENT.md +11 -5
- package/skills/agentic-sdlc-skill/SKILL.md +19 -5
- package/skills/agentic-sdlc-skill/architect.md +215 -0
- package/skills/agentic-sdlc-skill/elicitation.md +124 -8
- package/skills/agentic-sdlc-skill/guides.md +8 -0
- package/skills/agentic-sdlc-skill/review.md +92 -7
- package/skills/agentic-sdlc-skill/routing.md +100 -0
- package/skills/agentic-sdlc-skill/scripts/sdlc_check.py +52 -1100
- package/skills/agentic-sdlc-skill/scripts/sdlc_core.py +1996 -0
- package/skills/agentic-sdlc-skill/templates.md +93 -2
|
@@ -14,12 +14,15 @@ Every durable canonical document opens with this frontmatter: it feeds the gener
|
|
|
14
14
|
description: One line — what the document is and when to read it.
|
|
15
15
|
status: CURRENT # CURRENT | SUPERSEDED | DRAFT | DEPRECATED
|
|
16
16
|
supersedes: old_doc.md # only if it replaces another canonical doc
|
|
17
|
+
domain: code # optional — code | knowledge | marketing; omit in a single-domain project
|
|
17
18
|
---
|
|
18
19
|
# Document Title
|
|
19
20
|
```
|
|
20
21
|
|
|
21
22
|
When a doc replaces another: the new one declares `supersedes:`, the old one switches to `status: SUPERSEDED` (it stays as history, do not delete it). `sdlc_check.py validate` warns if `status` is missing or if a superseded doc is still `CURRENT`.
|
|
22
23
|
|
|
24
|
+
**`domain:` — write it only when it says something.** It names the domain whose fidelity discipline the document was written under, and it *records* an answer the work already has; it never decides one. Omit it and the project default applies (`default_domain:` in `ai_docs/README.md`, absent → `code`), so a single-domain project never writes the field at all. Documents under `vision/` sit above the split and take no `domain:`. In a mixed project, a wrong or forgotten field surfaces as a validation error on the missing mandatory risk section — never as a silent pass.
|
|
25
|
+
|
|
23
26
|
## ai_docs/reference/GUIDE_[topic].md
|
|
24
27
|
|
|
25
28
|
A guide is either OPERATIVE (`source_kind: document` — distilled from USER-PROVIDED
|
|
@@ -72,6 +75,9 @@ Section repertoire (pick what the source supports):
|
|
|
72
75
|
Curated must-read index, by hand (it is NOT the generated manifest). Created at init, updated rarely, only for real must-reads.
|
|
73
76
|
|
|
74
77
|
```markdown
|
|
78
|
+
---
|
|
79
|
+
default_domain: code
|
|
80
|
+
---
|
|
75
81
|
# ai_docs — reading guide
|
|
76
82
|
|
|
77
83
|
Must-reads for this project, in order. The full manifest of canonical docs is
|
|
@@ -87,6 +93,8 @@ feature catalog), `reference/` (operative guides), `solutions/` (per-feature
|
|
|
87
93
|
analyses, discovery-by-grep), `audit/` (audit plan and handoff).
|
|
88
94
|
```
|
|
89
95
|
|
|
96
|
+
`default_domain:` is the project's answer for every document that does not declare its own `domain:`. Whichever lens's `init` created the project seeds it; a later init never overwrites it, and an absent line resolves to `code` — so every project created before this field existed keeps behaving exactly as it did. It is written once, at project level, precisely so that the same tree gets **the same verdict from every installed lens**.
|
|
97
|
+
|
|
90
98
|
## ai_docs/vision/project_vision.md
|
|
91
99
|
|
|
92
100
|
A Vision states **the benefit to be obtained while leaving the most degrees of
|
|
@@ -208,6 +216,8 @@ Only for features spanning multiple ANALYSIS documents or multiple milestones: o
|
|
|
208
216
|
|
|
209
217
|
The frontmatter is the source of truth for the feature state (the `features_history.md` index is generated from it).
|
|
210
218
|
|
|
219
|
+
`domain:` and `checks:` are optional and only earn their place in a project where more than one lens is installed (see the canonical-header note above for how an omitted `domain:` resolves). `checks:` names **portable checks** imported from another domain — e.g. `domain: knowledge` with `checks: [marketing.funnel]`. An imported check can only ADD findings, never relax what the owning domain requires, so importing one is always safe; naming a check this installation does not carry produces a visible warning, never a silent pass. `id:` is unique **within a domain**, and its prefix says which: `F-` code, `K-` knowledge, `M-` marketing. Projects that predate the prefixes keep their `F-` ids — uniqueness was already scoped to the one domain they have.
|
|
220
|
+
|
|
211
221
|
```markdown
|
|
212
222
|
---
|
|
213
223
|
id: F-001
|
|
@@ -216,6 +226,8 @@ status: PLANNED
|
|
|
216
226
|
level: L3
|
|
217
227
|
start_date: 2026-06-11
|
|
218
228
|
end_date:
|
|
229
|
+
domain: code # optional — code | knowledge | marketing
|
|
230
|
+
checks: [marketing.funnel] # optional — extra portable checks to run on this document
|
|
219
231
|
---
|
|
220
232
|
# Feature Analysis: [Name]
|
|
221
233
|
|
|
@@ -238,8 +250,27 @@ end_date:
|
|
|
238
250
|
use-case = what they do. Derived from the elicitation round; the Impact below
|
|
239
251
|
must cover each, and the closure review checks coverage + actor UX fit. -->
|
|
240
252
|
|
|
253
|
+
## Capability Ledger
|
|
254
|
+
<!-- the architect pass (`architect.md`), run BEFORE the Impact below. One row per
|
|
255
|
+
capability the feature requires the system to be able to DO — a verb over a
|
|
256
|
+
domain noun, naming no file. Verdict EXISTS (name the component and where) /
|
|
257
|
+
INADEQUATE (same, plus the gap) / MISSING (say what you searched). Every
|
|
258
|
+
INADEQUATE or MISSING row becomes a component with its own contract, stated
|
|
259
|
+
without naming this feature, and lands in the Impact below. Evidence is what
|
|
260
|
+
makes a verdict falsifiable: for EXISTS/INADEQUATE the one guarantee you
|
|
261
|
+
re-read to confirm it; for MISSING the terms, the tool and the areas searched
|
|
262
|
+
(and say "provisional" when the area is still PENDING in the audit plan).
|
|
263
|
+
A question, not a form: when every capability plainly exists, one line under
|
|
264
|
+
this heading answers it — still naming the component and where it lives. -->
|
|
265
|
+
|
|
266
|
+
| Capability | Verdict | Component / gap | Evidence |
|
|
267
|
+
|---|---|---|---|
|
|
268
|
+
| persist an order | EXISTS | `path/to/store.py#OrderStore` | re-read `save()`: durable, returns the id |
|
|
269
|
+
| notify the customer | MISSING | — | grep notify/alert/dispatch + send, over src/ and legacy/; no owner |
|
|
270
|
+
|
|
241
271
|
## Impact
|
|
242
|
-
<!-- existing files touched, APIs/contracts, performance, new dependencies
|
|
272
|
+
<!-- existing files touched, APIs/contracts, performance, new dependencies.
|
|
273
|
+
Derived from the ledger above: every INADEQUATE/MISSING row appears here. -->
|
|
243
274
|
|
|
244
275
|
## Security and Threat Model
|
|
245
276
|
<!-- ALWAYS mandatory, also in Standalone.
|
|
@@ -368,6 +399,39 @@ Date: 2026-06-11 (UTC)
|
|
|
368
399
|
<!-- one or two lines: release pending, environment quirks that affect everyone -->
|
|
369
400
|
```
|
|
370
401
|
|
|
402
|
+
## ai_docs/audit/reviews/REVIEW_LOG.md
|
|
403
|
+
|
|
404
|
+
One row per completed review (`review.md` §When a review is due). Append-only; it
|
|
405
|
+
is the record that the gate ran and what it was worth. **One schema for both
|
|
406
|
+
modes** — a Hybrid project's devPNT gates write to this same file, so Standalone
|
|
407
|
+
adds values to the existing columns rather than a second table.
|
|
408
|
+
|
|
409
|
+
```markdown
|
|
410
|
+
# Independent Review Log
|
|
411
|
+
|
|
412
|
+
| date | doc_key | tier | reviewer | findings_raised | findings_real | verdict | revise_rounds |
|
|
413
|
+
|---|---|---|---|---|---|---|---|
|
|
414
|
+
| 2026-06-11 | ANALYSIS_login_sso.md | design | subagent (opus, fresh ctx) | 4 | 3 | PASS | 2 |
|
|
415
|
+
| 2026-06-12 | diff feature/sso-login | closure | self-pass (declared; no subagent facility) | 2 | 2 | PASS | 1 |
|
|
416
|
+
|
|
417
|
+
## Notes
|
|
418
|
+
<!-- One short paragraph per review that found something worth remembering: what
|
|
419
|
+
the findings actually were, and what changed because of them. The table
|
|
420
|
+
answers "was it reviewed and by what"; this answers "what did it find" —
|
|
421
|
+
which is where `review.md`'s per-finding outcomes live. Omit for a clean
|
|
422
|
+
review; a row with 0 findings needs no note. -->
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
`tier` is the moment plus, in Hybrid, the reviewer weight: `design`, `design (late)`
|
|
426
|
+
and `closure` (Standalone); `deep`, `light`, `code`, `guide`, `vision` (devPNT gates
|
|
427
|
+
and the Vision blind check). The validator reads this column by its header name, so
|
|
428
|
+
extra or reordered columns are fine — but the header must say `tier`. `reviewer`
|
|
429
|
+
records the realization actually used — fresh subagent, one-shot client run, or a
|
|
430
|
+
**declared** self-pass. Writing `self-pass` where independence was unavailable is
|
|
431
|
+
honest; writing nothing, or implying independence you did not have, is the failure
|
|
432
|
+
this column exists to prevent. `findings_real` is how many raised findings survived
|
|
433
|
+
triage: over time it is the only evidence of whether the gate earns its cost.
|
|
434
|
+
|
|
371
435
|
## ai_docs/audit/HANDOFF_[feature].md — volatile resume logistics (ephemeral)
|
|
372
436
|
|
|
373
437
|
**Resume logistics ONLY; the ANALYSIS Diary keeps the durable narrative (DRY).**
|
|
@@ -399,12 +463,39 @@ Canonical docs: they open with the header (`description:`/`status:`) so they ent
|
|
|
399
463
|
|
|
400
464
|
```markdown
|
|
401
465
|
---
|
|
402
|
-
description: Stack, directory structure and architectural patterns of the project.
|
|
466
|
+
description: Stack, directory structure, component map and architectural patterns of the project.
|
|
403
467
|
status: CURRENT
|
|
404
468
|
---
|
|
405
469
|
# Project Architecture
|
|
406
470
|
## Technology Stack
|
|
407
471
|
## Directory Structure
|
|
472
|
+
## Component Map
|
|
473
|
+
<!-- The inventory the architect pass reads BEFORE searching the code
|
|
474
|
+
(`architect.md` §2). One row per component that OWNS a capability:
|
|
475
|
+
Capability = what it lets the system DO (a verb over a domain noun, naming
|
|
476
|
+
no file). Contract = what it guarantees its consumers, in one line, stated
|
|
477
|
+
without naming any single consumer. Where = a path, or `path#symbol` when
|
|
478
|
+
the component is smaller than its file.
|
|
479
|
+
Seeded at bootstrap; a row is added or corrected in the SAME closure that
|
|
480
|
+
builds — or merely discovers — a component, and the area is marked ANALYZED.
|
|
481
|
+
A directory is not a component: rows name what owns a capability, not where
|
|
482
|
+
files sit (that is ## Directory Structure above). An absent or stale map is
|
|
483
|
+
why the next feature rules the same capability MISSING a second time and
|
|
484
|
+
builds it again. -->
|
|
485
|
+
|
|
486
|
+
Coverage: whatever `audit/audit_plan.md` marks ANALYZED — **read it, do not trust a
|
|
487
|
+
list restated here** (a hand-copied list is a cache with no invalidation). Outside
|
|
488
|
+
those areas this map is **unread, not empty**: it can never ground a MISSING
|
|
489
|
+
verdict, and the code is searched instead (`architect.md` §2).
|
|
490
|
+
|
|
491
|
+
| Component | Capability it owns | Contract | Where |
|
|
492
|
+
|---|---|---|---|
|
|
493
|
+
| ... | ... | ... | ... |
|
|
494
|
+
|
|
495
|
+
<!-- Where is `path/to/file.py#Symbol`. Leave the placeholder row untouched until
|
|
496
|
+
the map has a real component: the validator skips an all-`...` row, so a
|
|
497
|
+
freshly seeded project is never nagged about a table nobody has filled in. -->
|
|
498
|
+
|
|
408
499
|
## Architectural Patterns
|
|
409
500
|
```
|
|
410
501
|
|