@antoneeo/agentic-sdlc-skill 1.22.0 → 1.23.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 +16 -0
- package/gemini-extension.json +6 -6
- package/package.json +50 -50
- package/skills/agentic-sdlc-skill/SKILL.md +333 -333
- package/skills/agentic-sdlc-skill/elicitation.md +3 -2
- package/skills/agentic-sdlc-skill/review.md +19 -10
- package/skills/agentic-sdlc-skill/templates.md +28 -21
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,22 @@
|
|
|
2
2
|
|
|
3
3
|
Tutte le modifiche significative a questa skill saranno documentate in questo file.
|
|
4
4
|
|
|
5
|
+
## [1.23.0 / kb 1.4.3 / mkt 0.4.3] - 2026-08-05
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
- **Interface Contract (F-032 v2, code lens) — evolved content model + renamed.** The flat
|
|
9
|
+
`actor action → system response → outcome` table shipped in 1.22.0 is replaced by the
|
|
10
|
+
**information & processing flow — the heart — naming the components it traverses as
|
|
11
|
+
responsibility-holders** (responsibility level, never mechanism); feedback is now universal
|
|
12
|
+
(error and intermediate states, and a software actor's return status); the required
|
|
13
|
+
affordances and the architectural constraints touched are explicit elements. Authority split
|
|
14
|
+
corrected: the contract NAMES the components in the flow, never their mechanism or files
|
|
15
|
+
(that stays the Impact's vocabulary). Renamed **Interaction Contract → Interface Contract**
|
|
16
|
+
throughout. The shared `review.md` lens gains walkability / solution-leakage / universal-
|
|
17
|
+
feedback checks (inert in kb/mkt). Independent design + closure reviews PASS (REVIEW_LOG);
|
|
18
|
+
`rulings.md` r16 gloss refreshed to the capability identity; ADR 2026-08-04 updated in place
|
|
19
|
+
(refined v2). Same capability, no re-ruling; ceremony cost re-disclosed and owner-accepted.
|
|
20
|
+
|
|
5
21
|
## [1.22.0 / kb 1.4.2 / mkt 0.4.2] - 2026-08-05
|
|
6
22
|
|
|
7
23
|
### Added
|
package/gemini-extension.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "agentic-sdlc-skill",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "Documentation-First SDLC protocol with triage, Vision governance and optional devPNT integration.",
|
|
5
|
-
"author": "Antonio Pinto (https://github.com/Antoneeo)"
|
|
6
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "agentic-sdlc-skill",
|
|
3
|
+
"version": "1.23.0",
|
|
4
|
+
"description": "Documentation-First SDLC protocol with triage, Vision governance and optional devPNT integration.",
|
|
5
|
+
"author": "Antonio Pinto (https://github.com/Antoneeo)"
|
|
6
|
+
}
|
package/package.json
CHANGED
|
@@ -1,50 +1,50 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@antoneeo/agentic-sdlc-skill",
|
|
3
|
-
"version": "1.
|
|
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
|
-
"keywords": [
|
|
6
|
-
"claude-code",
|
|
7
|
-
"claude-skill",
|
|
8
|
-
"gemini-cli",
|
|
9
|
-
"skill",
|
|
10
|
-
"sdlc",
|
|
11
|
-
"documentation",
|
|
12
|
-
"ai-agent"
|
|
13
|
-
],
|
|
14
|
-
"author": "Antonio Pinto (https://github.com/Antoneeo)",
|
|
15
|
-
"license": "MIT",
|
|
16
|
-
"publishConfig": {
|
|
17
|
-
"access": "public"
|
|
18
|
-
},
|
|
19
|
-
"bin": {
|
|
20
|
-
"agentic-sdlc-init": "scripts/init.js",
|
|
21
|
-
"agentic-sdlc-install-skill": "scripts/postinstall.js"
|
|
22
|
-
},
|
|
23
|
-
"scripts": {
|
|
24
|
-
"postinstall": "node scripts/postinstall.js",
|
|
25
|
-
"preuninstall": "node scripts/preuninstall.js"
|
|
26
|
-
},
|
|
27
|
-
"files": [
|
|
28
|
-
"skills/agentic-sdlc-skill/SKILL.md",
|
|
29
|
-
"skills/agentic-sdlc-skill/templates.md",
|
|
30
|
-
"skills/agentic-sdlc-skill/architect.md",
|
|
31
|
-
"skills/agentic-sdlc-skill/guides.md",
|
|
32
|
-
"skills/agentic-sdlc-skill/vision.md",
|
|
33
|
-
"skills/agentic-sdlc-skill/tdd.md",
|
|
34
|
-
"skills/agentic-sdlc-skill/debugging.md",
|
|
35
|
-
"skills/agentic-sdlc-skill/elicitation.md",
|
|
36
|
-
"skills/agentic-sdlc-skill/review.md",
|
|
37
|
-
"skills/agentic-sdlc-skill/dispatch.md",
|
|
38
|
-
"skills/agentic-sdlc-skill/routing.md",
|
|
39
|
-
"skills/agentic-sdlc-skill/ENFORCEMENT.md",
|
|
40
|
-
"skills/agentic-sdlc-skill/scripts/sdlc_check.py",
|
|
41
|
-
"skills/agentic-sdlc-skill/scripts/sdlc_core.py",
|
|
42
|
-
"gemini-extension.json",
|
|
43
|
-
"README.md",
|
|
44
|
-
"CHANGELOG.md",
|
|
45
|
-
"scripts/lib.js",
|
|
46
|
-
"scripts/init.js",
|
|
47
|
-
"scripts/postinstall.js",
|
|
48
|
-
"scripts/preuninstall.js"
|
|
49
|
-
]
|
|
50
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@antoneeo/agentic-sdlc-skill",
|
|
3
|
+
"version": "1.23.0",
|
|
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
|
+
"keywords": [
|
|
6
|
+
"claude-code",
|
|
7
|
+
"claude-skill",
|
|
8
|
+
"gemini-cli",
|
|
9
|
+
"skill",
|
|
10
|
+
"sdlc",
|
|
11
|
+
"documentation",
|
|
12
|
+
"ai-agent"
|
|
13
|
+
],
|
|
14
|
+
"author": "Antonio Pinto (https://github.com/Antoneeo)",
|
|
15
|
+
"license": "MIT",
|
|
16
|
+
"publishConfig": {
|
|
17
|
+
"access": "public"
|
|
18
|
+
},
|
|
19
|
+
"bin": {
|
|
20
|
+
"agentic-sdlc-init": "scripts/init.js",
|
|
21
|
+
"agentic-sdlc-install-skill": "scripts/postinstall.js"
|
|
22
|
+
},
|
|
23
|
+
"scripts": {
|
|
24
|
+
"postinstall": "node scripts/postinstall.js",
|
|
25
|
+
"preuninstall": "node scripts/preuninstall.js"
|
|
26
|
+
},
|
|
27
|
+
"files": [
|
|
28
|
+
"skills/agentic-sdlc-skill/SKILL.md",
|
|
29
|
+
"skills/agentic-sdlc-skill/templates.md",
|
|
30
|
+
"skills/agentic-sdlc-skill/architect.md",
|
|
31
|
+
"skills/agentic-sdlc-skill/guides.md",
|
|
32
|
+
"skills/agentic-sdlc-skill/vision.md",
|
|
33
|
+
"skills/agentic-sdlc-skill/tdd.md",
|
|
34
|
+
"skills/agentic-sdlc-skill/debugging.md",
|
|
35
|
+
"skills/agentic-sdlc-skill/elicitation.md",
|
|
36
|
+
"skills/agentic-sdlc-skill/review.md",
|
|
37
|
+
"skills/agentic-sdlc-skill/dispatch.md",
|
|
38
|
+
"skills/agentic-sdlc-skill/routing.md",
|
|
39
|
+
"skills/agentic-sdlc-skill/ENFORCEMENT.md",
|
|
40
|
+
"skills/agentic-sdlc-skill/scripts/sdlc_check.py",
|
|
41
|
+
"skills/agentic-sdlc-skill/scripts/sdlc_core.py",
|
|
42
|
+
"gemini-extension.json",
|
|
43
|
+
"README.md",
|
|
44
|
+
"CHANGELOG.md",
|
|
45
|
+
"scripts/lib.js",
|
|
46
|
+
"scripts/init.js",
|
|
47
|
+
"scripts/postinstall.js",
|
|
48
|
+
"scripts/preuninstall.js"
|
|
49
|
+
]
|
|
50
|
+
}
|
|
@@ -1,333 +1,333 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: agentic-sdlc
|
|
3
|
-
version: 1.
|
|
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
|
-
author: Antonio Pinto (https://github.com/Antoneeo)
|
|
6
|
-
copyright: (c) 2026 Antonio Pinto
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# Agentic SDLC
|
|
10
|
-
|
|
11
|
-
**Why this skill exists:** to prevent *myopia* — acting from partial understanding, where a change breaks what it did not account for and hard-won knowledge evaporates between sessions. Triage, the Vision Gate, the documentation lifecycle and comprehension guides are all one defense against that.
|
|
12
|
-
|
|
13
|
-
This skill guides software development with a Documentation-First process proportional to risk. It must work fully even without devPNT. When devPNT is available and configured for the current project, the skill works in symbiosis with its governance: M-VISION, Master Plan, Action Plan and versioned artifacts become the authoritative frame for milestones and implementation.
|
|
14
|
-
|
|
15
|
-
Support files in the skill directory:
|
|
16
|
-
- `templates.md`: templates for Vision, ANALYSIS, Spike, audit plan and handoff.
|
|
17
|
-
- `architect.md`: the architect pass — do the components and services this feature needs already exist? Run at L3 before drafting the Impact.
|
|
18
|
-
- `guides.md`: pipeline for distilling user-provided indications into `ai_docs/reference/GUIDE_[topic].md`.
|
|
19
|
-
- `vision.md`: how to write a Vision a cold reviewer can actually apply — the properties that make a rule hold, the minimum operable sections, and the blind check run before promoting one to APPROVED.
|
|
20
|
-
- `routing.md`: which lens owns this unit of work. Read ONLY when a sibling lens skill is installed alongside this one; a single-lens install never reads it.
|
|
21
|
-
- `scripts/sdlc_check.py` + `scripts/sdlc_core.py`: the mechanical validator for the docs root (`check`, `validate`, `index`, `stale`, `mark`, `gate`, `plan`, `orient`, `migrate`). Two files: the core is the family's shared spine, the entry point names this domain. Copy both, or neither.
|
|
22
|
-
- `ENFORCEMENT.md`: optional setup for CI and hooks.
|
|
23
|
-
|
|
24
|
-
Read these files only when needed. `SKILL.md` is the operating contract; the support files are progressive resources.
|
|
25
|
-
|
|
26
|
-
## Technical Values
|
|
27
|
-
|
|
28
|
-
- **Understand before acting:** do not modify code without understanding root cause, constraints and current shape — including re-reading a component you think you remember, because your model of it rots between sessions; trust the code (and its comprehension guide), not memory.
|
|
29
|
-
- **Preserve architectural coherence:** respect existing layers, responsibilities, naming, patterns and conventions.
|
|
30
|
-
- **Apply DRY and simplicity:** do not duplicate logic or knowledge; abstract only when it reduces real complexity.
|
|
31
|
-
- **Preserve quality:** every change must maintain or improve stability, testability and maintainability.
|
|
32
|
-
- **Verify technically:** close implementation work with tests, lint, smoke checks or an explicit reason.
|
|
33
|
-
- **Keep useful memory:** document relevant decisions and operational state, not filler text.
|
|
34
|
-
- **Protect the Vision:** every decision must stay aligned with expected benefits, the actors it serves (and the UX they expect), non-goals and success signals.
|
|
35
|
-
|
|
36
|
-
If a patch looks easy but you do not understand why the current code is shaped the way it is, investigate first.
|
|
37
|
-
|
|
38
|
-
## Rule Zero: Triage
|
|
39
|
-
|
|
40
|
-
Always classify the request before choosing the process. Declare the chosen level to the user when you start operational work.
|
|
41
|
-
|
|
42
|
-
**Declare the level WITH the router verdict** (one line, for L2, L3 and Spike — L1 declares the level alone): the result of the guide-router lookup described under `## Operative Guides`, i.e. `Level: L2 · router: no match` or `Level: L3 · router: GUIDE_release.md → read`. The lookup is the consult trigger; making its result a declared output is what keeps it from being skipped — a level declared without a verdict makes "did not look" indistinguishable from "looked, nothing matched". Name the guide you matched, or `no match`; name a second one only when it covers a genuinely distinct concern (typically one operative guide plus the comprehension map of the component you are touching). The verdict is never a listing of the catalogue, and never an excuse to read every guide.
|
|
43
|
-
|
|
44
|
-
| Level | Criteria | Required process |
|
|
45
|
-
|---|---|---|
|
|
46
|
-
| **L1 - Trivial** | About 10 lines in 1-2 files; no API, dependency or new-behavior change; typos or fixes restoring already-expected behavior | Implement. Run relevant existing tests. No new documents. |
|
|
47
|
-
| **L2 - Small** | Clear root cause; at most 3 files; no new dependency or public API; low risk | Mini-analysis in the message: objective, impact, security, tests. Tests mandatory. No new document, except updating an existing analysis on the same topic, or the handoff (see Write Triggers). |
|
|
48
|
-
| **L3 - Significant** | More than 3 files, APIs/contracts, new dependency, user-visible behavior, security-sensitive area, architectural change or non-obvious design | Full workflow: Vision Gate, analysis, plan, implementation, tests, closure. |
|
|
49
|
-
| **Spike** | Time-boxed exploration to reduce uncertainty | Code not mergeable into main. Outcome in `ai_docs/solutions/SPIKE_[topic].md`. For production, reclassify as L2 or L3. |
|
|
50
|
-
|
|
51
|
-
Cross-cutting rules:
|
|
52
|
-
- **Domain routing (multi-lens installs only).** After the level is set, and only when a sibling lens skill of this family is installed (`kb-agentic`, `mkt-agentic-sdlc`), run the router in `routing.md` for every L2, L3 and Spike: it decides which lens's method and validation rules govern this unit of work. L1 never reaches it, and a single-lens install never reads the file — detection fails open. In such a project, never refer to a document whose meaning differs by lens ("threat model", "vision", `principles.md`, `handoff.md`) by its bare name: qualify it with its domain, or name its path.
|
|
53
|
-
- Parsing of external input, authN/authZ, cryptography, networking, personal data and filesystem access are security-sensitive: never L1.
|
|
54
|
-
- If a bigger impact emerges during L1/L2 work, stop, reclassify and declare it.
|
|
55
|
-
- When in doubt, pick the higher level.
|
|
56
|
-
- **Before asking the user anything — any phase, any level — the question must pass the legality test: search first and name the search with its result; name the decision or fact blocked without the answer.** Blocking the work is the exception, not the default. `elicitation.md` §The question discipline owns the rule and is the only place it is stated — read it before you ask, and do not work from a summary of it.
|
|
57
|
-
- The full audit does not start for L1/L2 unless explicitly requested.
|
|
58
|
-
|
|
59
|
-
## Write Triggers
|
|
60
|
-
|
|
61
|
-
Triage decides IF documentation is due; this table decides WHICH document each event produces, and when. **One event, one destination:** when the trigger fires and the document does not exist, create it; when it exists, update it — never duplicate it. This table is the authoritative write index — the workflow phases carry the surrounding procedure and point here for the trigger.
|
|
62
|
-
|
|
63
|
-
| Document | Write trigger | Phase |
|
|
64
|
-
|---|---|---|
|
|
65
|
-
| `solutions/ANALYSIS_[feature].md` | Every L3, after elicitation and before any code. On topic match with an existing analysis, update that one instead of a new file. A capability the architect pass splits out as its own unit of change (`architect.md` §4) gets its own ANALYSIS, and the two documents name each other. | 3 |
|
|
66
|
-
| `solutions/SPIKE_[topic].md` | Closing any Spike — including a failed one (a negative outcome is still an outcome). | — |
|
|
67
|
-
| `vision/features/VISION_[feature].md` | Feature known multi-milestone at analysis time, OR the retroactive trigger: you are about to create the SECOND `ANALYSIS_*` on the same theme — extract the shared feature vision first, then let both analyses reference it. | 3 |
|
|
68
|
-
| `audit/handoff.md` (workstream registry) | **Never by hand — generated by `sdlc_check.py index` from the `HANDOFF_*.md` sources**, and `validate` errors when the two disagree. Regenerate at every L3 closure and at session end; the `Date:` header is derived, so no writer touches it. It is an inventory for lookup, not a work board: no assignment, no due dates, no ordering, no holder. | 5 / session end |
|
|
69
|
-
| `audit/HANDOFF_[feature].md` | **One per OPEN workstream, with or without volatile state** — it is the authored home of that workstream's registry row (frontmatter `workstream`/`level`/`branch`/`status`/`since`/`next`/`details`/`updated`), so no file means no row. Also carries the resume logistics; **the ANALYSIS Diary keeps the durable narrative (DRY)**, and this file is DELETED at closure — deleting it *is* removing the row. | 4 / 5 / session end |
|
|
70
|
-
| `audit/project_notes.md` | A note true for the whole project rather than for one workstream (release pending, environment quirk). Appended verbatim to the generated registry; it exists so regenerating cannot destroy notes that belong to no workstream. | 5 / session end |
|
|
71
|
-
| `audit/handoff.md` — converting an existing project (hand-written or pre-1.17 narrative) | **Lazily, at the first write — and then ALL AT ONCE.** Converting one row at a time is the state that loses the others, so `index` refuses to write while anything in the file is unaccounted for and names it. Until the first source file exists nothing generates, nothing errors, and the file is read verbatim exactly as today. | 5 / session end |
|
|
72
|
-
| `audit/audit_plan.md` (Standalone) | Bootstrap, and whenever a mapped area changes state (`sdlc_check.py mark` records the reference — git hash, else UTC timestamp). | 1 |
|
|
73
|
-
| `reference/GUIDE_[topic].md` (`source_kind: document`) | Origin+purpose test (`guides.md`), or a proactive proposal the user accepted. Propose, never a silent write, never from model knowledge. | 4 / 5 |
|
|
74
|
-
| `reference/GUIDE_[topic].md` (`source_kind: code`) | Recognized high-complexity component/feature/layer with no CURRENT guide — including one that breaks repeatedly across sessions → **duty to write autonomously** (no proposal; additive, code-anchored, reversible). Fidelity floor: every claim traces to a code excerpt. Signals + guard-rails: `guides.md` §1. Write it as soon as you recognize the signal; the Phase-5 Comprehension checkpoint is the backstop that asks the question, never the only moment it may fire. | 4 / 5 |
|
|
75
|
-
| `audit/reviews/REVIEW_LOG.md` | Every completed review — when and what to write is `review.md` §When a review is due; schema and column meanings are `templates.md`. | 3 / 5 |
|
|
76
|
-
| ADR — `architecture/` (Standalone) or devPNT DB (Hybrid) | An architectural decision was taken (new pattern, layer or contract change, structural dependency): record it at closure, before DONE. No decision, no ADR. | 5 |
|
|
77
|
-
| `strategic/architecture.md`, `strategic/existing_features.md` | Bootstrap; update at closure when the stack or the feature catalog actually changed. | 1 / 5 |
|
|
78
|
-
| `strategic/architecture.md` — `## Component Map` | A component was BORN, its contract changed, **or the pass DISCOVERED an existing one while searching an unmapped area** — the same closure adds or corrects its row (`architect.md`). Keyed on the component, not on the stack: a new component is not a stack change, and a discovered one is how an area gets marked ANALYZED while the map stays silent about what lives there — after which the next feature may lawfully rule it MISSING and build it twice. | 5 |
|
|
79
|
-
| `vision/project_vision.md`, `roadmap.md`, `principles.md` | Bootstrap, as `Status: DRAFT`; promoted to APPROVED only by explicit user confirmation, and only after the blind check (`vision.md` §6) — which also gates any amendment of an APPROVED Vision. Write it against `vision.md` §1–§4 from the first draft. | 1 / 2 |
|
|
80
|
-
| `INDEX.md`, `reference/INDEX.md`, `strategic/features_history.md` | Never by hand: regenerated by `sdlc_check.py index` at closure when canonical docs or guides changed (prose discipline where the validator is not adopted). | 5 |
|
|
81
|
-
|
|
82
|
-
## Operating Modes
|
|
83
|
-
|
|
84
|
-
### Full Standalone
|
|
85
|
-
|
|
86
|
-
Use this mode when devPNT is unavailable, not configured for the current project, or the user explicitly asks for a filesystem-only workflow.
|
|
87
|
-
|
|
88
|
-
Source of truth:
|
|
89
|
-
- Vision: `ai_docs/vision/project_vision.md`, `roadmap.md`, `principles.md`.
|
|
90
|
-
- Features/analyses: `ai_docs/solutions/ANALYSIS_[feature].md`.
|
|
91
|
-
- Audit/handoff: `ai_docs/audit/`.
|
|
92
|
-
- Feature history: `ai_docs/strategic/features_history.md` — generated by `sdlc_check.py index` (kept by hand as a prose discipline only in environments without Python).
|
|
93
|
-
|
|
94
|
-
Standalone mode is not reduced: it must handle audits, features, significant bugs, tests, handoffs and closure without devPNT.
|
|
95
|
-
|
|
96
|
-
### Hybrid in symbiosis with devPNT
|
|
97
|
-
|
|
98
|
-
Use this mode when the `devpnt_*` tools are available and point at the current project.
|
|
99
|
-
|
|
100
|
-
Authoritative hierarchy:
|
|
101
|
-
1. **devPNT M-VISION**: strategic beacon of the milestone. Before design or code, read it and verify benefits, success signals, scope-in and non-goals.
|
|
102
|
-
2. **devPNT Master Plan**: strategic roadmap and milestones.
|
|
103
|
-
3. **devPNT Action Plan**: current tactical work for the active goal.
|
|
104
|
-
4. **devPNT governed artifacts**: `D-UC`, `P-TM`, `E-ISP`, `E-TDD`, `E-TP`, ADR.
|
|
105
|
-
5. **Local `ai_docs/`**: readable context, Standalone fallback, local handoff or shadow/mirror when useful.
|
|
106
|
-
|
|
107
|
-
Hybrid rules:
|
|
108
|
-
- devPNT is the governed source for plans and artifacts; do not create a second truth in `ai_docs/`.
|
|
109
|
-
- The skill stays autonomous: if devPNT is not there, switch to Standalone without losing capability.
|
|
110
|
-
- If the user request, the local Vision and the M-VISION diverge, stop and make the conflict explicit.
|
|
111
|
-
- Do not create or modify milestones without respecting the M-VISION.
|
|
112
|
-
- Never auto-accept devPNT proposals: present the preview and wait for explicit confirmation.
|
|
113
|
-
- If the local devPNT protocol imposes stricter bootstrap, plans or gates, follow them.
|
|
114
|
-
|
|
115
|
-
## Coexistence with devPNT (the Hybrid seam)
|
|
116
|
-
|
|
117
|
-
This section is the single authoritative answer to "who owns what" when both the
|
|
118
|
-
skill and devPNT are active. The skill owns the **process** (triage, phases, Vision
|
|
119
|
-
Gate, lifecycle); devPNT owns the **machinery** (governed storage, versioned
|
|
120
|
-
proposals, semantic analysis, independent reviewers). devPNT strengthens the
|
|
121
|
-
process; it never replaces it.
|
|
122
|
-
|
|
123
|
-
### Ownership matrix
|
|
124
|
-
|
|
125
|
-
| Artifact | Standalone master | Hybrid master | Mirror rule |
|
|
126
|
-
|---|---|---|---|
|
|
127
|
-
| Product vision | `vision/project_vision.md` | `vision/project_vision.md` (product scope) | devPNT KL vision is regenerated from it, never edited independently |
|
|
128
|
-
| Milestone vision | `vision/roadmap.md` milestones | devPNT M-VISION | `roadmap.md` may reference the M-VISION key; it never restates its content |
|
|
129
|
-
| Feature design | `solutions/ANALYSIS_[feature].md` | devPNT E-ISP/E-TDD (+ D-UC/P-TM) | shadow exported from the ACCEPTED DB version as `SHADOW_[doc_key]_vX.Y.md`; on divergence the DB wins and the shadow is regenerated |
|
|
130
|
-
| Plans | `## Action Plan` inside the ANALYSIS | devPNT Master/Action Plan | none |
|
|
131
|
-
| Feature state | ANALYSIS frontmatter `status` | Action Plan node status | mapping table below; at closure both must move together |
|
|
132
|
-
| ADR | `architecture/` (canonical dir) | devPNT DB (`adr_YYYY-MM-DD_slug`) | optional filesystem shadow `SHADOW_adr_*` exported at closure for grep-ability |
|
|
133
|
-
| Audit / freshness | `audit/audit_plan.md` + `stale`/`mark` | devPNT KL coverage + summary status | run `check --hybrid` (skips audit-plan staleness) |
|
|
134
|
-
| Design review (pre-implementation) | `review.md` moment 1, on the ANALYSIS | devPNT §4.5 gate on `E-ISP`/`E-TDD` | same slot, richer backend — run ONE of them, never both |
|
|
135
|
-
| *(mode is per unit of change, not per project)* | a Hybrid-capable project may work one feature Standalone: the slot follows the ARTIFACT the design lives in, and the mode is declared in that artifact. `validate --hybrid` suppresses the Standalone design-review backstop, since devPNT owns the slot there | | |
|
|
136
|
-
| Review log | `audit/reviews/REVIEW_LOG.md` | devPNT `REVIEW_LOG.md` (same path) | always filesystem |
|
|
137
|
-
| Operative guides | `ai_docs/reference/` | `ai_docs/reference/` — **filesystem-first even in Hybrid** | devPNT bootstrap may point at their index; it never copies their content |
|
|
138
|
-
| Handoff | `audit/handoff.md` | `audit/handoff.md` | always filesystem |
|
|
139
|
-
|
|
140
|
-
### Triage equivalence (one threshold, two vocabularies)
|
|
141
|
-
|
|
142
|
-
devPNT's "significance threshold" and the skill's triage are the SAME test. Do not
|
|
143
|
-
run two classifications:
|
|
144
|
-
|
|
145
|
-
| Skill triage | devPNT equivalent | Governed artifacts |
|
|
146
|
-
|---|---|---|
|
|
147
|
-
| L1 Trivial | trivial exempt | none |
|
|
148
|
-
| L2 Small | localized obvious edit | none — but see escalation |
|
|
149
|
-
| L3 Significant | governed unit of change | D-UC/P-TM/E-ISP/E-TDD per the devPNT trigger policy |
|
|
150
|
-
| Spike | exempt (non-mergeable) | `SPIKE_[topic].md` only |
|
|
151
|
-
|
|
152
|
-
Escalation triggers (any one of these makes it L3, in BOTH vocabularies): touches
|
|
153
|
-
more than one module, changes a public API/contract/message format, changes a data
|
|
154
|
-
model or state machine, has a security surface, risks duplicating existing logic,
|
|
155
|
-
or the design choice is non-obvious. An L2 that trips one of these is not an L2.
|
|
156
|
-
|
|
157
|
-
### Feature state mapping
|
|
158
|
-
|
|
159
|
-
| ANALYSIS frontmatter | devPNT plan node |
|
|
160
|
-
|---|---|
|
|
161
|
-
| PLANNED | READY (or BLOCKED / ON_HOLD while waiting) |
|
|
162
|
-
| IN_PROGRESS | PROGRESS |
|
|
163
|
-
| COMPLETED | DONE |
|
|
164
|
-
| CANCELLED | CANCELLED |
|
|
165
|
-
|
|
166
|
-
Closure discipline: never mark the node DONE while the shadow/ANALYSIS still says
|
|
167
|
-
IN_PROGRESS, or vice versa. They move in the same closure step.
|
|
168
|
-
|
|
169
|
-
### Shadow discipline (Hybrid)
|
|
170
|
-
|
|
171
|
-
- Shadow filename: `SHADOW_[doc_key]_vX.Y.md`, first line
|
|
172
|
-
`<!-- SHADOW generated from devPNT (doc_key vX.Y) - do not edit by hand -->`.
|
|
173
|
-
Never save a shadow under an `ANALYSIS_*` name: that name means "authoritative
|
|
174
|
-
Standalone document" and the validator treats it as such.
|
|
175
|
-
- **Export the approved E-TDD shadow BEFORE implementation** (not only at closure).
|
|
176
|
-
It gives context-free subagents their design input, unlocks `gate --hybrid`, and
|
|
177
|
-
guarantees the filesystem fallback if devPNT becomes unavailable mid-feature.
|
|
178
|
-
- At closure, refresh all shadows from the accepted DB versions.
|
|
179
|
-
|
|
180
|
-
### Validator in Hybrid
|
|
181
|
-
|
|
182
|
-
Pass `--hybrid` explicitly (never auto-detected — an explicit flag beats a guessed
|
|
183
|
-
mode): `check --hybrid` and `stale --hybrid` skip audit-plan staleness (mapping is
|
|
184
|
-
delegated to devPNT/KL) — guide-drift checking still runs (`ai_docs/reference/`
|
|
185
|
-
is filesystem-first even in Hybrid, see the ownership matrix above); `gate --hybrid`
|
|
186
|
-
also unlocks on the presence of an E-TDD shadow in `solutions/` (the Hybrid design
|
|
187
|
-
gate) instead of requiring an IN_PROGRESS ANALYSIS.
|
|
188
|
-
|
|
189
|
-
## L3 Workflow
|
|
190
|
-
|
|
191
|
-
### 1. Audit and Alignment
|
|
192
|
-
|
|
193
|
-
- Read `ai_docs/audit/handoff.md` if it exists — the **workstream registry**: one row per open workstream, so you see at a glance what is in PROGRESS, on which branch, since when, before touching anything. It is generated from the `HANDOFF_*.md` files, so it is read here and never edited here. If a row's Date/Branch are inconsistent with reality, treat that row as history. When resuming a specific workstream, read its `audit/HANDOFF_[feature].md` (its row plus the resume logistics) AND its ANALYSIS Diary (the durable narrative) — the registry row points at both. A hand-written or pre-1.17 narrative handoff still works and is converted when you next write it, not now (Write Triggers).
|
|
194
|
-
- Read `ai_docs/README.md` (curated must-reads), `ai_docs/INDEX.md` (generated manifest of all canonical docs) and `ai_docs/reference/INDEX.md` (the guide router) to know what exists before exploring the code. The router is a mandatory read, not an optional one: it is the only orientation step that tells you a guide already governs the work you are about to do. On a project with no guides yet it exists as an empty stub (`sdlc_check.py index` writes it precisely so the mandatory read has something to read) — the honest verdict there is `router: no match`, and if the file is genuinely absent, say `router: absent (no router file)` and regenerate it rather than inventing a match. `solutions/` and `audit/` are not indexed per file: search them with glob/grep.
|
|
195
|
-
- Recommended default: a SessionStart hook (`ENFORCEMENT.md` §4) emits this orientation automatically at session start (README + INDEX + guide router + handoff + triage reminder), so the router reaches the context even in a session that never opens Phase 1 explicitly. Wire it wherever Python is available; when it is not wired, do these reads manually as above — the process never depends on it, and it fails open (a missing/empty `ai_docs/` never blocks the session).
|
|
196
|
-
- If `ai_docs/` is missing or incomplete, create the structure and the **bootstrap set** by analyzing the project in batches: `README.md`, the three `vision/` docs (`Status: DRAFT`), `strategic/architecture.md`, `strategic/existing_features.md` and — Standalone — `audit/audit_plan.md`; then regenerate `INDEX.md`. Nothing else is mandatory at bootstrap (per-document triggers: Write Triggers).
|
|
197
|
-
- **Arriving in a project that was never curated** (the usual case — you arrive with a task, not with a bootstrap): write `audit/audit_plan.md` FIRST. It is the scope ledger the rest is built on — one row per area, all PENDING, `SKIPPED` for what genuinely does not merit reading (vendored, generated). Then the other bootstrap documents describe what you have actually analyzed, and the `## Component Map` in `strategic/architecture.md` starts at whatever the first task made you understand. **No full-codebase sweep is required before the first feature**: the map grows feature by feature, each one marking the areas it covered (`sdlc_check.py mark`). What is NOT deferred is comprehension of what the change touches or depends on — that is understood now, at full standard, mapped or not. The licence is about writing the inventory, never about designing on a guess (`architect.md` §2: unmapped is *unread*, not *empty*, and can never ground a MISSING verdict).
|
|
198
|
-
- In Standalone use `ai_docs/audit/audit_plan.md` for mapping and state.
|
|
199
|
-
- In Hybrid prefer the devPNT/KL mapping when available; do not duplicate plan governance.
|
|
200
|
-
- For detailed templates use `templates.md`.
|
|
201
|
-
|
|
202
|
-
### 2. Vision Gate
|
|
203
|
-
|
|
204
|
-
Standalone:
|
|
205
|
-
- Read `project_vision.md`, `roadmap.md`, `principles.md`.
|
|
206
|
-
- If a document declares `Status: DRAFT`, treat it as a hypothesis: flag conflicts, but do not block an explicit user request.
|
|
207
|
-
- If it declares `Status: APPROVED` and the request conflicts, stop and ask for a choice: update the Vision or modify/reject the request.
|
|
208
|
-
- Never promote a Vision to `APPROVED` without the user's confirmation.
|
|
209
|
-
- **Writing or amending a Vision is its own discipline — follow `vision.md`.** Draft against its §1–§4 (the properties that make a rule survive a motivated reader, and the minimum sections a gate needs), then run the **blind check** (§6) before promotion to APPROVED and before any amendment of an approved Vision. A Vision that has never been read cold by someone with no other context has not been tested at the only thing it exists to do.
|
|
210
|
-
|
|
211
|
-
Hybrid:
|
|
212
|
-
- Read the milestone's M-VISION, or ask for/create the step required by the devPNT protocol.
|
|
213
|
-
- Verify that the request serves a benefit or success signal of the M-VISION.
|
|
214
|
-
- If the request adds unauthorized scope, treat it as a Vision divergence.
|
|
215
|
-
- The M-VISION is a Vision: `vision.md` applies to it too. The gate lens of the blind check (§6) is the proportional subset for a milestone-scope document.
|
|
216
|
-
|
|
217
|
-
### 3. Request Analysis
|
|
218
|
-
|
|
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
|
-
|
|
221
|
-
**
|
|
222
|
-
|
|
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.
|
|
224
|
-
|
|
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.
|
|
226
|
-
|
|
227
|
-
Standalone L3:
|
|
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.
|
|
229
|
-
- Create or update `ai_docs/solutions/ANALYSIS_[feature].md`.
|
|
230
|
-
- Minimum sections: Objective, Feature Vision (or Vision Alignment), Use Cases / User Needs,
|
|
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.
|
|
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.
|
|
233
|
-
|
|
234
|
-
**Design review gate — the design is reviewed BEFORE any code (L3).** Close Phase 3 by handing the finished ANALYSIS to an *independent* reviewer: the procedure, the independence ladder, the round cap and the log row are `review.md` §When a review is due, moment 1 — follow it there, it is not restated here. Why the moment exists: the closure review can prove the code matches the design, never that the design was right, and the author is structurally blind to what their own design omitted. In Hybrid this slot belongs to devPNT's §4.5 gate on the `E-ISP`/`E-TDD` — run one, never both.
|
|
235
|
-
|
|
236
|
-
Hybrid L3:
|
|
237
|
-
- Restore the Master Plan, Action Plan and linked documents.
|
|
238
|
-
- Use devPNT for plans and governed artifacts.
|
|
239
|
-
- The
|
|
240
|
-
- Use `ai_docs/solutions/SHADOW_[doc_key]_vX.Y.md` only as a readable shadow when needed; on divergence devPNT wins.
|
|
241
|
-
|
|
242
|
-
### 4. Development and Testing
|
|
243
|
-
|
|
244
|
-
- Implement only after the documentation gate required by the level. **Flip the ANALYSIS frontmatter `PLANNED` → `IN_PROGRESS` when implementation starts** — that flip is what `gate` and the handoff registry key on, and nothing else performs it.
|
|
245
|
-
- Isolate the work: run an L3 change on its own branch. In Hybrid, prefer a git worktree from the start — a running devPNT server locks `.devpnt/*.db` and blocks in-place branch switches/merges in the primary worktree.
|
|
246
|
-
- Modify surgically, consistently with the plan.
|
|
247
|
-
- Implementation work follows the TDD discipline in `tdd.md` (RED/GREEN/REFACTOR — the L2/L3 default; record the reason when it does not apply).
|
|
248
|
-
- Before implementing (L2/L3; L1 exempt), **consult the guide router** for a guide covering the task — operative, or a comprehension map of the component you are about to touch — and read it first (the consult trigger, `guides.md` §0, summarized under `## Operative Guides`). A targeted description match, not a blanket read. Its result is the router verdict already declared with the triage level (Rule Zero); re-run the lookup here only if the work has moved to a topic the first lookup did not cover, and say so if the verdict changes.
|
|
249
|
-
- If the environment does not allow automated tests, declare the alternative verification and the reason.
|
|
250
|
-
- For bugs (L2/L3), follow the systematic debugging method in `debugging.md`.
|
|
251
|
-
- Circuit breaker: after 3 consecutive runs without progress on the tests, stop, switch to the systematic method in `debugging.md`, and ask for instructions if still stuck. `debugging.md` also covers **chronic fragility** — a component that breaks repeatedly across sessions is a comprehension + complexity signal (write the `source_kind: code` guide AND escalate a refactor), not a fourth patch.
|
|
252
|
-
- Update the ANALYSIS Diary or the Action Plan when you complete milestones, hit blockers, change decisions, or a session ends with work unfinished.
|
|
253
|
-
- **Opt-in subagent execution**: for an L3 with an approved design, the orchestrator MAY execute the work via subagents per `dispatch.md`, gated by `sdlc_check.py plan validate` ("no valid plan, no dispatch"); default stays same-session. Hybrid: the executable `PLAN_[feature].md` is `derived-from` the accepted E-TDD, never independently authored.
|
|
254
|
-
|
|
255
|
-
### 5. Closure
|
|
256
|
-
|
|
257
|
-
- Run the relevant tests/lint/smoke checks.
|
|
258
|
-
- For the review itself follow `review.md` (requesting and receiving findings) — the single definition, intended for reuse by the Hybrid review gates (devPNT-side wiring out of this unit's scope).
|
|
259
|
-
- Verify alignment with the local Vision or the devPNT M-VISION.
|
|
260
|
-
- If the work was governed by user-provided indications and is reusable, **PROPOSE distilling a guide** (proactive trigger, `guides.md` §1) — a proposal for the user, never a silent write, never from model knowledge.
|
|
261
|
-
- **Comprehension checkpoint**: ask explicitly — *did this session force me to build a model of a high-complexity component that no CURRENT guide covers?* If yes, WRITE the `source_kind: code` guide now (a duty, not a proposal — `guides.md` §1) and say so in the closure. The knowledge you paid to build is at its most complete right here; one closure later it is gone, and the next session re-derives it or breaks the component from partial understanding.
|
|
262
|
-
- Update only the documents actually impacted.
|
|
263
|
-
- **Update the workstream registry (`audit/handoff.md`)** — mandatory at every L3 closure: DELETE the closed workstream's `audit/HANDOFF_[feature].md` (history lives in git and in the Diary) and re-run `sdlc_check.py index`. Deleting the file *is* removing the row, and no other workstream's file is touched — that is the parallel-safety the registry exists for. Never edit the generated file: `validate` errors when it disagrees with its sources. The session-end rule and the L2 case: Write Triggers.
|
|
264
|
-
- **Aligned indexes (Poka-Yoke)**: if you created, moved or removed canonical documents (`vision/`, `reference/`, `architecture/`, `functional/`, `strategic/`):
|
|
265
|
-
- regenerate the manifest with `sdlc_check.py index` (writes `ai_docs/INDEX.md`) — never write it by hand;
|
|
266
|
-
- if the document is a must-read, add/update its line in the curated `README.md`;
|
|
267
|
-
- if the document replaces another, mark the old one `status: SUPERSEDED` and declare `supersedes:` in the new one;
|
|
268
|
-
- if you created a new canonical subdirectory, give it a purpose in `README.md`.
|
|
269
|
-
A canonical doc that is unindexed or lacks `status` = dirty closure (`sdlc_check.py check` fails/warns). Do not declare DONE until it is clean. Details: section "ai_docs documents".
|
|
270
|
-
- guides created or changed: `sdlc_check.py index` regenerates BOTH manifests (`ai_docs/INDEX.md` and the guide router `ai_docs/reference/INDEX.md`) in one run.
|
|
271
|
-
- If an architectural decision was taken (new pattern, layer or contract change, structural dependency), record an ADR before DONE — Standalone in `architecture/`, Hybrid propose the ADR/KL update in the devPNT DB. No decision, no ADR (Write Triggers).
|
|
272
|
-
- In Standalone, if the project adopts `sdlc_check.py`, run `python <skill_dir>/scripts/sdlc_check.py check --root <project_root>` or the equivalent local copy.
|
|
273
|
-
- Updated documents must travel in the same commit/PR as the code they describe.
|
|
274
|
-
- **Branch/worktree hygiene**: an L3 ran on its own branch (Phase 4) — close it with an explicit merge decision (merge, keep open, or discard) and clean up the branch/worktree; never leave orphan branches. In Hybrid, the running devPNT server locks `.devpnt/*.db`, so the merge is done from a separate git worktree or via a ref-only push, never an in-place branch switch in the primary worktree.
|
|
275
|
-
|
|
276
|
-
## ai_docs documents: two indexes + lifecycle
|
|
277
|
-
|
|
278
|
-
Documents in `ai_docs/` play two roles served by two distinct indexes — do not confuse them:
|
|
279
|
-
|
|
280
|
-
- **`ai_docs/README.md` (curated, by hand):** the reading priority. Few lines, only canonical must-reads, changes rarely. Human judgement on "what to read first".
|
|
281
|
-
- **`ai_docs/INDEX.md` (generated, `sdlc_check.py index`):** the complete manifest of every canonical doc (`vision/`, `reference/`, `architecture/`, `functional/`, `strategic/`) with description and status. Never by hand: it is regenerated, so it does not drift.
|
|
282
|
-
- **`strategic/features_history.md` (generated):** the ANALYSIS history, from their frontmatter.
|
|
283
|
-
- `audit/` and `solutions/` are discovery-by-grep: they do not enter the manifest.
|
|
284
|
-
|
|
285
|
-
**Canonical document header (lifecycle).** Every doc in those directories should open with a minimal frontmatter, so the manifest generates itself and an agent knows immediately whether to trust it:
|
|
286
|
-
|
|
287
|
-
```markdown
|
|
288
|
-
---
|
|
289
|
-
description: One line — what it is and when to read it.
|
|
290
|
-
status: CURRENT # CURRENT | SUPERSEDED | DRAFT | DEPRECATED
|
|
291
|
-
supersedes: old_doc.md # only if it replaces another doc
|
|
292
|
-
---
|
|
293
|
-
```
|
|
294
|
-
|
|
295
|
-
As a fallback (no frontmatter) the manifest derives the title from the first `# H1` and the description from the first prose line or blockquote; but without `status` a doc carries no freshness signal. A missing `status`, an invalid value, or a superseded doc still marked `CURRENT` = warning in `validate`. A `SUPERSEDED` doc stays on the filesystem as history, but its state declares it dead: no more greps leading back to obsolete guidance.
|
|
296
|
-
|
|
297
|
-
Without Python/hooks (minimal environments) the indexes and headers remain a prose discipline: update `README.md` and mark the `status` by hand; the validator is only the backstop where it is adopted.
|
|
298
|
-
|
|
299
|
-
Legacy note: the validator also accepts the deprecated Italian frontmatter keys (`stato`, `livello`, `data_inizio`, `data_fine`) and Italian section headings in existing projects. New documents must use the English forms.
|
|
300
|
-
|
|
301
|
-
## Operative Guides
|
|
302
|
-
|
|
303
|
-
Guides are **consulted, created, proposed, and (for code) authored for comprehension** — four moments; the mechanics live once in `guides.md`. Two source kinds: `document` (user indications, operative) and `code` (a comprehension map of a complex component):
|
|
304
|
-
- **Consult (before acting):** before operative L2/L3 work (L1 exempt), check the guide router for a guide covering the task and read the match first — a targeted description match, never a blanket read. **Declare the verdict** on the same line as the triage level (Rule Zero): the lookup is only reliable when its result is visible. → `guides.md` §0.
|
|
305
|
-
- **Create (from user indications):** the origin+purpose test below (`source_kind: document`).
|
|
306
|
-
- **Propose proactively (after success):** after reusable, user-indication-governed work, PROPOSE distilling a guide — a proposal, never a silent write, never from model knowledge. → `guides.md` §1.
|
|
307
|
-
- **Comprehend (code, autonomous):** when a component/feature/layer is high-complexity and no CURRENT guide covers it, it is your DUTY to WRITE a `source_kind: code` comprehension guide autonomously — no proposal (additive, code-anchored, reversible); every claim traces to a code excerpt. Signals + guard-rails: `guides.md` §1.
|
|
308
|
-
|
|
309
|
-
Trigger test: the user hands over indications to follow (origin = user, not model
|
|
310
|
-
knowledge) meant to govern how the agent operates (purpose = operative), not just
|
|
311
|
-
inform an answer. Both hold → distill into `ai_docs/reference/GUIDE_[topic].md`.
|
|
312
|
-
|
|
313
|
-
A guide TRAINS the agent, two levels: the guide is the **synthesis** a trained
|
|
314
|
-
agent carries (compact — read whole before acting); the verbatim snapshot in
|
|
315
|
-
`.sources/` is the **book**, reached on demand via the section markers. Fidelity
|
|
316
|
-
constraint: only what the source supports; gaps marked `[not covered by source]`,
|
|
317
|
-
never filled from general knowledge; selection and compression expected, addition
|
|
318
|
-
forbidden. Full pipeline, DRY rule, snapshotting and maintenance: `guides.md`.
|
|
319
|
-
|
|
320
|
-
`ai_docs/reference/INDEX.md` is generated (the guide router) — never edit by hand,
|
|
321
|
-
regenerate with `sdlc_check.py index`.
|
|
322
|
-
|
|
323
|
-
**Agent-global KB.** A second, cross-project guide root lives at the fixed path `~/.agentic-sdlc/` (same `ai_docs/` structure, same validator/router/freshness engine via `sdlc_check.py --root ~/.agentic-sdlc`). Project guides win on topic collision; a project guide that overrides a KB guide MUST declare `overrides: GUIDE_<topic>.md` — the validator warns on undeclared collisions (error under `--strict`) and fail-closes on an `overrides:` value that escapes the KB. Discovery is this paragraph: agents and subagents reach KB guides by path, exactly like project guides.
|
|
324
|
-
|
|
325
|
-
## Mechanical Enforcement
|
|
326
|
-
|
|
327
|
-
The prompt is not enforcement. When the project needs repeatable guarantees:
|
|
328
|
-
- read `ENFORCEMENT.md`;
|
|
329
|
-
- use `scripts/sdlc_check.py validate --strict` in CI;
|
|
330
|
-
- use `scripts/sdlc_check.py gate` only for security-critical directories, not for the whole repository;
|
|
331
|
-
- (skill development) the self-eval battery `python -m unittest discover -s scripts -p "test_*.py"` guards the skill's own doctrine invariants and is the deterministic release gate — see `ENFORCEMENT.md` §5.
|
|
332
|
-
|
|
333
|
-
The validator is a support, not a universal prerequisite: the skill must stay usable in environments without Python or hooks, declaring what it cannot verify automatically.
|
|
1
|
+
---
|
|
2
|
+
name: agentic-sdlc
|
|
3
|
+
version: 1.23.0
|
|
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
|
+
author: Antonio Pinto (https://github.com/Antoneeo)
|
|
6
|
+
copyright: (c) 2026 Antonio Pinto
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Agentic SDLC
|
|
10
|
+
|
|
11
|
+
**Why this skill exists:** to prevent *myopia* — acting from partial understanding, where a change breaks what it did not account for and hard-won knowledge evaporates between sessions. Triage, the Vision Gate, the documentation lifecycle and comprehension guides are all one defense against that.
|
|
12
|
+
|
|
13
|
+
This skill guides software development with a Documentation-First process proportional to risk. It must work fully even without devPNT. When devPNT is available and configured for the current project, the skill works in symbiosis with its governance: M-VISION, Master Plan, Action Plan and versioned artifacts become the authoritative frame for milestones and implementation.
|
|
14
|
+
|
|
15
|
+
Support files in the skill directory:
|
|
16
|
+
- `templates.md`: templates for Vision, ANALYSIS, Spike, audit plan and handoff.
|
|
17
|
+
- `architect.md`: the architect pass — do the components and services this feature needs already exist? Run at L3 before drafting the Impact.
|
|
18
|
+
- `guides.md`: pipeline for distilling user-provided indications into `ai_docs/reference/GUIDE_[topic].md`.
|
|
19
|
+
- `vision.md`: how to write a Vision a cold reviewer can actually apply — the properties that make a rule hold, the minimum operable sections, and the blind check run before promoting one to APPROVED.
|
|
20
|
+
- `routing.md`: which lens owns this unit of work. Read ONLY when a sibling lens skill is installed alongside this one; a single-lens install never reads it.
|
|
21
|
+
- `scripts/sdlc_check.py` + `scripts/sdlc_core.py`: the mechanical validator for the docs root (`check`, `validate`, `index`, `stale`, `mark`, `gate`, `plan`, `orient`, `migrate`). Two files: the core is the family's shared spine, the entry point names this domain. Copy both, or neither.
|
|
22
|
+
- `ENFORCEMENT.md`: optional setup for CI and hooks.
|
|
23
|
+
|
|
24
|
+
Read these files only when needed. `SKILL.md` is the operating contract; the support files are progressive resources.
|
|
25
|
+
|
|
26
|
+
## Technical Values
|
|
27
|
+
|
|
28
|
+
- **Understand before acting:** do not modify code without understanding root cause, constraints and current shape — including re-reading a component you think you remember, because your model of it rots between sessions; trust the code (and its comprehension guide), not memory.
|
|
29
|
+
- **Preserve architectural coherence:** respect existing layers, responsibilities, naming, patterns and conventions.
|
|
30
|
+
- **Apply DRY and simplicity:** do not duplicate logic or knowledge; abstract only when it reduces real complexity.
|
|
31
|
+
- **Preserve quality:** every change must maintain or improve stability, testability and maintainability.
|
|
32
|
+
- **Verify technically:** close implementation work with tests, lint, smoke checks or an explicit reason.
|
|
33
|
+
- **Keep useful memory:** document relevant decisions and operational state, not filler text.
|
|
34
|
+
- **Protect the Vision:** every decision must stay aligned with expected benefits, the actors it serves (and the UX they expect), non-goals and success signals.
|
|
35
|
+
|
|
36
|
+
If a patch looks easy but you do not understand why the current code is shaped the way it is, investigate first.
|
|
37
|
+
|
|
38
|
+
## Rule Zero: Triage
|
|
39
|
+
|
|
40
|
+
Always classify the request before choosing the process. Declare the chosen level to the user when you start operational work.
|
|
41
|
+
|
|
42
|
+
**Declare the level WITH the router verdict** (one line, for L2, L3 and Spike — L1 declares the level alone): the result of the guide-router lookup described under `## Operative Guides`, i.e. `Level: L2 · router: no match` or `Level: L3 · router: GUIDE_release.md → read`. The lookup is the consult trigger; making its result a declared output is what keeps it from being skipped — a level declared without a verdict makes "did not look" indistinguishable from "looked, nothing matched". Name the guide you matched, or `no match`; name a second one only when it covers a genuinely distinct concern (typically one operative guide plus the comprehension map of the component you are touching). The verdict is never a listing of the catalogue, and never an excuse to read every guide.
|
|
43
|
+
|
|
44
|
+
| Level | Criteria | Required process |
|
|
45
|
+
|---|---|---|
|
|
46
|
+
| **L1 - Trivial** | About 10 lines in 1-2 files; no API, dependency or new-behavior change; typos or fixes restoring already-expected behavior | Implement. Run relevant existing tests. No new documents. |
|
|
47
|
+
| **L2 - Small** | Clear root cause; at most 3 files; no new dependency or public API; low risk | Mini-analysis in the message: objective, impact, security, tests. Tests mandatory. No new document, except updating an existing analysis on the same topic, or the handoff (see Write Triggers). |
|
|
48
|
+
| **L3 - Significant** | More than 3 files, APIs/contracts, new dependency, user-visible behavior, security-sensitive area, architectural change or non-obvious design | Full workflow: Vision Gate, analysis, plan, implementation, tests, closure. |
|
|
49
|
+
| **Spike** | Time-boxed exploration to reduce uncertainty | Code not mergeable into main. Outcome in `ai_docs/solutions/SPIKE_[topic].md`. For production, reclassify as L2 or L3. |
|
|
50
|
+
|
|
51
|
+
Cross-cutting rules:
|
|
52
|
+
- **Domain routing (multi-lens installs only).** After the level is set, and only when a sibling lens skill of this family is installed (`kb-agentic`, `mkt-agentic-sdlc`), run the router in `routing.md` for every L2, L3 and Spike: it decides which lens's method and validation rules govern this unit of work. L1 never reaches it, and a single-lens install never reads the file — detection fails open. In such a project, never refer to a document whose meaning differs by lens ("threat model", "vision", `principles.md`, `handoff.md`) by its bare name: qualify it with its domain, or name its path.
|
|
53
|
+
- Parsing of external input, authN/authZ, cryptography, networking, personal data and filesystem access are security-sensitive: never L1.
|
|
54
|
+
- If a bigger impact emerges during L1/L2 work, stop, reclassify and declare it.
|
|
55
|
+
- When in doubt, pick the higher level.
|
|
56
|
+
- **Before asking the user anything — any phase, any level — the question must pass the legality test: search first and name the search with its result; name the decision or fact blocked without the answer.** Blocking the work is the exception, not the default. `elicitation.md` §The question discipline owns the rule and is the only place it is stated — read it before you ask, and do not work from a summary of it.
|
|
57
|
+
- The full audit does not start for L1/L2 unless explicitly requested.
|
|
58
|
+
|
|
59
|
+
## Write Triggers
|
|
60
|
+
|
|
61
|
+
Triage decides IF documentation is due; this table decides WHICH document each event produces, and when. **One event, one destination:** when the trigger fires and the document does not exist, create it; when it exists, update it — never duplicate it. This table is the authoritative write index — the workflow phases carry the surrounding procedure and point here for the trigger.
|
|
62
|
+
|
|
63
|
+
| Document | Write trigger | Phase |
|
|
64
|
+
|---|---|---|
|
|
65
|
+
| `solutions/ANALYSIS_[feature].md` | Every L3, after elicitation and before any code. On topic match with an existing analysis, update that one instead of a new file. A capability the architect pass splits out as its own unit of change (`architect.md` §4) gets its own ANALYSIS, and the two documents name each other. | 3 |
|
|
66
|
+
| `solutions/SPIKE_[topic].md` | Closing any Spike — including a failed one (a negative outcome is still an outcome). | — |
|
|
67
|
+
| `vision/features/VISION_[feature].md` | Feature known multi-milestone at analysis time, OR the retroactive trigger: you are about to create the SECOND `ANALYSIS_*` on the same theme — extract the shared feature vision first, then let both analyses reference it. | 3 |
|
|
68
|
+
| `audit/handoff.md` (workstream registry) | **Never by hand — generated by `sdlc_check.py index` from the `HANDOFF_*.md` sources**, and `validate` errors when the two disagree. Regenerate at every L3 closure and at session end; the `Date:` header is derived, so no writer touches it. It is an inventory for lookup, not a work board: no assignment, no due dates, no ordering, no holder. | 5 / session end |
|
|
69
|
+
| `audit/HANDOFF_[feature].md` | **One per OPEN workstream, with or without volatile state** — it is the authored home of that workstream's registry row (frontmatter `workstream`/`level`/`branch`/`status`/`since`/`next`/`details`/`updated`), so no file means no row. Also carries the resume logistics; **the ANALYSIS Diary keeps the durable narrative (DRY)**, and this file is DELETED at closure — deleting it *is* removing the row. | 4 / 5 / session end |
|
|
70
|
+
| `audit/project_notes.md` | A note true for the whole project rather than for one workstream (release pending, environment quirk). Appended verbatim to the generated registry; it exists so regenerating cannot destroy notes that belong to no workstream. | 5 / session end |
|
|
71
|
+
| `audit/handoff.md` — converting an existing project (hand-written or pre-1.17 narrative) | **Lazily, at the first write — and then ALL AT ONCE.** Converting one row at a time is the state that loses the others, so `index` refuses to write while anything in the file is unaccounted for and names it. Until the first source file exists nothing generates, nothing errors, and the file is read verbatim exactly as today. | 5 / session end |
|
|
72
|
+
| `audit/audit_plan.md` (Standalone) | Bootstrap, and whenever a mapped area changes state (`sdlc_check.py mark` records the reference — git hash, else UTC timestamp). | 1 |
|
|
73
|
+
| `reference/GUIDE_[topic].md` (`source_kind: document`) | Origin+purpose test (`guides.md`), or a proactive proposal the user accepted. Propose, never a silent write, never from model knowledge. | 4 / 5 |
|
|
74
|
+
| `reference/GUIDE_[topic].md` (`source_kind: code`) | Recognized high-complexity component/feature/layer with no CURRENT guide — including one that breaks repeatedly across sessions → **duty to write autonomously** (no proposal; additive, code-anchored, reversible). Fidelity floor: every claim traces to a code excerpt. Signals + guard-rails: `guides.md` §1. Write it as soon as you recognize the signal; the Phase-5 Comprehension checkpoint is the backstop that asks the question, never the only moment it may fire. | 4 / 5 |
|
|
75
|
+
| `audit/reviews/REVIEW_LOG.md` | Every completed review — when and what to write is `review.md` §When a review is due; schema and column meanings are `templates.md`. | 3 / 5 |
|
|
76
|
+
| ADR — `architecture/` (Standalone) or devPNT DB (Hybrid) | An architectural decision was taken (new pattern, layer or contract change, structural dependency): record it at closure, before DONE. No decision, no ADR. | 5 |
|
|
77
|
+
| `strategic/architecture.md`, `strategic/existing_features.md` | Bootstrap; update at closure when the stack or the feature catalog actually changed. | 1 / 5 |
|
|
78
|
+
| `strategic/architecture.md` — `## Component Map` | A component was BORN, its contract changed, **or the pass DISCOVERED an existing one while searching an unmapped area** — the same closure adds or corrects its row (`architect.md`). Keyed on the component, not on the stack: a new component is not a stack change, and a discovered one is how an area gets marked ANALYZED while the map stays silent about what lives there — after which the next feature may lawfully rule it MISSING and build it twice. | 5 |
|
|
79
|
+
| `vision/project_vision.md`, `roadmap.md`, `principles.md` | Bootstrap, as `Status: DRAFT`; promoted to APPROVED only by explicit user confirmation, and only after the blind check (`vision.md` §6) — which also gates any amendment of an APPROVED Vision. Write it against `vision.md` §1–§4 from the first draft. | 1 / 2 |
|
|
80
|
+
| `INDEX.md`, `reference/INDEX.md`, `strategic/features_history.md` | Never by hand: regenerated by `sdlc_check.py index` at closure when canonical docs or guides changed (prose discipline where the validator is not adopted). | 5 |
|
|
81
|
+
|
|
82
|
+
## Operating Modes
|
|
83
|
+
|
|
84
|
+
### Full Standalone
|
|
85
|
+
|
|
86
|
+
Use this mode when devPNT is unavailable, not configured for the current project, or the user explicitly asks for a filesystem-only workflow.
|
|
87
|
+
|
|
88
|
+
Source of truth:
|
|
89
|
+
- Vision: `ai_docs/vision/project_vision.md`, `roadmap.md`, `principles.md`.
|
|
90
|
+
- Features/analyses: `ai_docs/solutions/ANALYSIS_[feature].md`.
|
|
91
|
+
- Audit/handoff: `ai_docs/audit/`.
|
|
92
|
+
- Feature history: `ai_docs/strategic/features_history.md` — generated by `sdlc_check.py index` (kept by hand as a prose discipline only in environments without Python).
|
|
93
|
+
|
|
94
|
+
Standalone mode is not reduced: it must handle audits, features, significant bugs, tests, handoffs and closure without devPNT.
|
|
95
|
+
|
|
96
|
+
### Hybrid in symbiosis with devPNT
|
|
97
|
+
|
|
98
|
+
Use this mode when the `devpnt_*` tools are available and point at the current project.
|
|
99
|
+
|
|
100
|
+
Authoritative hierarchy:
|
|
101
|
+
1. **devPNT M-VISION**: strategic beacon of the milestone. Before design or code, read it and verify benefits, success signals, scope-in and non-goals.
|
|
102
|
+
2. **devPNT Master Plan**: strategic roadmap and milestones.
|
|
103
|
+
3. **devPNT Action Plan**: current tactical work for the active goal.
|
|
104
|
+
4. **devPNT governed artifacts**: `D-UC`, `P-TM`, `E-ISP`, `E-TDD`, `E-TP`, ADR.
|
|
105
|
+
5. **Local `ai_docs/`**: readable context, Standalone fallback, local handoff or shadow/mirror when useful.
|
|
106
|
+
|
|
107
|
+
Hybrid rules:
|
|
108
|
+
- devPNT is the governed source for plans and artifacts; do not create a second truth in `ai_docs/`.
|
|
109
|
+
- The skill stays autonomous: if devPNT is not there, switch to Standalone without losing capability.
|
|
110
|
+
- If the user request, the local Vision and the M-VISION diverge, stop and make the conflict explicit.
|
|
111
|
+
- Do not create or modify milestones without respecting the M-VISION.
|
|
112
|
+
- Never auto-accept devPNT proposals: present the preview and wait for explicit confirmation.
|
|
113
|
+
- If the local devPNT protocol imposes stricter bootstrap, plans or gates, follow them.
|
|
114
|
+
|
|
115
|
+
## Coexistence with devPNT (the Hybrid seam)
|
|
116
|
+
|
|
117
|
+
This section is the single authoritative answer to "who owns what" when both the
|
|
118
|
+
skill and devPNT are active. The skill owns the **process** (triage, phases, Vision
|
|
119
|
+
Gate, lifecycle); devPNT owns the **machinery** (governed storage, versioned
|
|
120
|
+
proposals, semantic analysis, independent reviewers). devPNT strengthens the
|
|
121
|
+
process; it never replaces it.
|
|
122
|
+
|
|
123
|
+
### Ownership matrix
|
|
124
|
+
|
|
125
|
+
| Artifact | Standalone master | Hybrid master | Mirror rule |
|
|
126
|
+
|---|---|---|---|
|
|
127
|
+
| Product vision | `vision/project_vision.md` | `vision/project_vision.md` (product scope) | devPNT KL vision is regenerated from it, never edited independently |
|
|
128
|
+
| Milestone vision | `vision/roadmap.md` milestones | devPNT M-VISION | `roadmap.md` may reference the M-VISION key; it never restates its content |
|
|
129
|
+
| Feature design | `solutions/ANALYSIS_[feature].md` | devPNT E-ISP/E-TDD (+ D-UC/P-TM) | shadow exported from the ACCEPTED DB version as `SHADOW_[doc_key]_vX.Y.md`; on divergence the DB wins and the shadow is regenerated |
|
|
130
|
+
| Plans | `## Action Plan` inside the ANALYSIS | devPNT Master/Action Plan | none |
|
|
131
|
+
| Feature state | ANALYSIS frontmatter `status` | Action Plan node status | mapping table below; at closure both must move together |
|
|
132
|
+
| ADR | `architecture/` (canonical dir) | devPNT DB (`adr_YYYY-MM-DD_slug`) | optional filesystem shadow `SHADOW_adr_*` exported at closure for grep-ability |
|
|
133
|
+
| Audit / freshness | `audit/audit_plan.md` + `stale`/`mark` | devPNT KL coverage + summary status | run `check --hybrid` (skips audit-plan staleness) |
|
|
134
|
+
| Design review (pre-implementation) | `review.md` moment 1, on the ANALYSIS | devPNT §4.5 gate on `E-ISP`/`E-TDD` | same slot, richer backend — run ONE of them, never both |
|
|
135
|
+
| *(mode is per unit of change, not per project)* | a Hybrid-capable project may work one feature Standalone: the slot follows the ARTIFACT the design lives in, and the mode is declared in that artifact. `validate --hybrid` suppresses the Standalone design-review backstop, since devPNT owns the slot there | | |
|
|
136
|
+
| Review log | `audit/reviews/REVIEW_LOG.md` | devPNT `REVIEW_LOG.md` (same path) | always filesystem |
|
|
137
|
+
| Operative guides | `ai_docs/reference/` | `ai_docs/reference/` — **filesystem-first even in Hybrid** | devPNT bootstrap may point at their index; it never copies their content |
|
|
138
|
+
| Handoff | `audit/handoff.md` | `audit/handoff.md` | always filesystem |
|
|
139
|
+
|
|
140
|
+
### Triage equivalence (one threshold, two vocabularies)
|
|
141
|
+
|
|
142
|
+
devPNT's "significance threshold" and the skill's triage are the SAME test. Do not
|
|
143
|
+
run two classifications:
|
|
144
|
+
|
|
145
|
+
| Skill triage | devPNT equivalent | Governed artifacts |
|
|
146
|
+
|---|---|---|
|
|
147
|
+
| L1 Trivial | trivial exempt | none |
|
|
148
|
+
| L2 Small | localized obvious edit | none — but see escalation |
|
|
149
|
+
| L3 Significant | governed unit of change | D-UC/P-TM/E-ISP/E-TDD per the devPNT trigger policy |
|
|
150
|
+
| Spike | exempt (non-mergeable) | `SPIKE_[topic].md` only |
|
|
151
|
+
|
|
152
|
+
Escalation triggers (any one of these makes it L3, in BOTH vocabularies): touches
|
|
153
|
+
more than one module, changes a public API/contract/message format, changes a data
|
|
154
|
+
model or state machine, has a security surface, risks duplicating existing logic,
|
|
155
|
+
or the design choice is non-obvious. An L2 that trips one of these is not an L2.
|
|
156
|
+
|
|
157
|
+
### Feature state mapping
|
|
158
|
+
|
|
159
|
+
| ANALYSIS frontmatter | devPNT plan node |
|
|
160
|
+
|---|---|
|
|
161
|
+
| PLANNED | READY (or BLOCKED / ON_HOLD while waiting) |
|
|
162
|
+
| IN_PROGRESS | PROGRESS |
|
|
163
|
+
| COMPLETED | DONE |
|
|
164
|
+
| CANCELLED | CANCELLED |
|
|
165
|
+
|
|
166
|
+
Closure discipline: never mark the node DONE while the shadow/ANALYSIS still says
|
|
167
|
+
IN_PROGRESS, or vice versa. They move in the same closure step.
|
|
168
|
+
|
|
169
|
+
### Shadow discipline (Hybrid)
|
|
170
|
+
|
|
171
|
+
- Shadow filename: `SHADOW_[doc_key]_vX.Y.md`, first line
|
|
172
|
+
`<!-- SHADOW generated from devPNT (doc_key vX.Y) - do not edit by hand -->`.
|
|
173
|
+
Never save a shadow under an `ANALYSIS_*` name: that name means "authoritative
|
|
174
|
+
Standalone document" and the validator treats it as such.
|
|
175
|
+
- **Export the approved E-TDD shadow BEFORE implementation** (not only at closure).
|
|
176
|
+
It gives context-free subagents their design input, unlocks `gate --hybrid`, and
|
|
177
|
+
guarantees the filesystem fallback if devPNT becomes unavailable mid-feature.
|
|
178
|
+
- At closure, refresh all shadows from the accepted DB versions.
|
|
179
|
+
|
|
180
|
+
### Validator in Hybrid
|
|
181
|
+
|
|
182
|
+
Pass `--hybrid` explicitly (never auto-detected — an explicit flag beats a guessed
|
|
183
|
+
mode): `check --hybrid` and `stale --hybrid` skip audit-plan staleness (mapping is
|
|
184
|
+
delegated to devPNT/KL) — guide-drift checking still runs (`ai_docs/reference/`
|
|
185
|
+
is filesystem-first even in Hybrid, see the ownership matrix above); `gate --hybrid`
|
|
186
|
+
also unlocks on the presence of an E-TDD shadow in `solutions/` (the Hybrid design
|
|
187
|
+
gate) instead of requiring an IN_PROGRESS ANALYSIS.
|
|
188
|
+
|
|
189
|
+
## L3 Workflow
|
|
190
|
+
|
|
191
|
+
### 1. Audit and Alignment
|
|
192
|
+
|
|
193
|
+
- Read `ai_docs/audit/handoff.md` if it exists — the **workstream registry**: one row per open workstream, so you see at a glance what is in PROGRESS, on which branch, since when, before touching anything. It is generated from the `HANDOFF_*.md` files, so it is read here and never edited here. If a row's Date/Branch are inconsistent with reality, treat that row as history. When resuming a specific workstream, read its `audit/HANDOFF_[feature].md` (its row plus the resume logistics) AND its ANALYSIS Diary (the durable narrative) — the registry row points at both. A hand-written or pre-1.17 narrative handoff still works and is converted when you next write it, not now (Write Triggers).
|
|
194
|
+
- Read `ai_docs/README.md` (curated must-reads), `ai_docs/INDEX.md` (generated manifest of all canonical docs) and `ai_docs/reference/INDEX.md` (the guide router) to know what exists before exploring the code. The router is a mandatory read, not an optional one: it is the only orientation step that tells you a guide already governs the work you are about to do. On a project with no guides yet it exists as an empty stub (`sdlc_check.py index` writes it precisely so the mandatory read has something to read) — the honest verdict there is `router: no match`, and if the file is genuinely absent, say `router: absent (no router file)` and regenerate it rather than inventing a match. `solutions/` and `audit/` are not indexed per file: search them with glob/grep.
|
|
195
|
+
- Recommended default: a SessionStart hook (`ENFORCEMENT.md` §4) emits this orientation automatically at session start (README + INDEX + guide router + handoff + triage reminder), so the router reaches the context even in a session that never opens Phase 1 explicitly. Wire it wherever Python is available; when it is not wired, do these reads manually as above — the process never depends on it, and it fails open (a missing/empty `ai_docs/` never blocks the session).
|
|
196
|
+
- If `ai_docs/` is missing or incomplete, create the structure and the **bootstrap set** by analyzing the project in batches: `README.md`, the three `vision/` docs (`Status: DRAFT`), `strategic/architecture.md`, `strategic/existing_features.md` and — Standalone — `audit/audit_plan.md`; then regenerate `INDEX.md`. Nothing else is mandatory at bootstrap (per-document triggers: Write Triggers).
|
|
197
|
+
- **Arriving in a project that was never curated** (the usual case — you arrive with a task, not with a bootstrap): write `audit/audit_plan.md` FIRST. It is the scope ledger the rest is built on — one row per area, all PENDING, `SKIPPED` for what genuinely does not merit reading (vendored, generated). Then the other bootstrap documents describe what you have actually analyzed, and the `## Component Map` in `strategic/architecture.md` starts at whatever the first task made you understand. **No full-codebase sweep is required before the first feature**: the map grows feature by feature, each one marking the areas it covered (`sdlc_check.py mark`). What is NOT deferred is comprehension of what the change touches or depends on — that is understood now, at full standard, mapped or not. The licence is about writing the inventory, never about designing on a guess (`architect.md` §2: unmapped is *unread*, not *empty*, and can never ground a MISSING verdict).
|
|
198
|
+
- In Standalone use `ai_docs/audit/audit_plan.md` for mapping and state.
|
|
199
|
+
- In Hybrid prefer the devPNT/KL mapping when available; do not duplicate plan governance.
|
|
200
|
+
- For detailed templates use `templates.md`.
|
|
201
|
+
|
|
202
|
+
### 2. Vision Gate
|
|
203
|
+
|
|
204
|
+
Standalone:
|
|
205
|
+
- Read `project_vision.md`, `roadmap.md`, `principles.md`.
|
|
206
|
+
- If a document declares `Status: DRAFT`, treat it as a hypothesis: flag conflicts, but do not block an explicit user request.
|
|
207
|
+
- If it declares `Status: APPROVED` and the request conflicts, stop and ask for a choice: update the Vision or modify/reject the request.
|
|
208
|
+
- Never promote a Vision to `APPROVED` without the user's confirmation.
|
|
209
|
+
- **Writing or amending a Vision is its own discipline — follow `vision.md`.** Draft against its §1–§4 (the properties that make a rule survive a motivated reader, and the minimum sections a gate needs), then run the **blind check** (§6) before promotion to APPROVED and before any amendment of an approved Vision. A Vision that has never been read cold by someone with no other context has not been tested at the only thing it exists to do.
|
|
210
|
+
|
|
211
|
+
Hybrid:
|
|
212
|
+
- Read the milestone's M-VISION, or ask for/create the step required by the devPNT protocol.
|
|
213
|
+
- Verify that the request serves a benefit or success signal of the M-VISION.
|
|
214
|
+
- If the request adds unauthorized scope, treat it as a Vision divergence.
|
|
215
|
+
- The M-VISION is a Vision: `vision.md` applies to it too. The gate lens of the blind check (§6) is the proportional subset for a milestone-scope document.
|
|
216
|
+
|
|
217
|
+
### 3. Request Analysis
|
|
218
|
+
|
|
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
|
+
|
|
221
|
+
**Interface 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 `## Interface Contract`: the observable behavior the actors get, per use case — the responsibility-level flow each action triggers, naming the components it traverses, and the universal feedback that returns — 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 **and the responsibility-level flow** — it names the components in the flow, never their mechanism; **mechanism 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
|
+
|
|
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.
|
|
224
|
+
|
|
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.
|
|
226
|
+
|
|
227
|
+
Standalone L3:
|
|
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.
|
|
229
|
+
- Create or update `ai_docs/solutions/ANALYSIS_[feature].md`.
|
|
230
|
+
- Minimum sections: Objective, Feature Vision (or Vision Alignment), Use Cases / User Needs, Interface 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.)
|
|
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.
|
|
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.
|
|
233
|
+
|
|
234
|
+
**Design review gate — the design is reviewed BEFORE any code (L3).** Close Phase 3 by handing the finished ANALYSIS to an *independent* reviewer: the procedure, the independence ladder, the round cap and the log row are `review.md` §When a review is due, moment 1 — follow it there, it is not restated here. Why the moment exists: the closure review can prove the code matches the design, never that the design was right, and the author is structurally blind to what their own design omitted. In Hybrid this slot belongs to devPNT's §4.5 gate on the `E-ISP`/`E-TDD` — run one, never both.
|
|
235
|
+
|
|
236
|
+
Hybrid L3:
|
|
237
|
+
- Restore the Master Plan, Action Plan and linked documents.
|
|
238
|
+
- Use devPNT for plans and governed artifacts.
|
|
239
|
+
- The Interface 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.
|
|
240
|
+
- Use `ai_docs/solutions/SHADOW_[doc_key]_vX.Y.md` only as a readable shadow when needed; on divergence devPNT wins.
|
|
241
|
+
|
|
242
|
+
### 4. Development and Testing
|
|
243
|
+
|
|
244
|
+
- Implement only after the documentation gate required by the level. **Flip the ANALYSIS frontmatter `PLANNED` → `IN_PROGRESS` when implementation starts** — that flip is what `gate` and the handoff registry key on, and nothing else performs it.
|
|
245
|
+
- Isolate the work: run an L3 change on its own branch. In Hybrid, prefer a git worktree from the start — a running devPNT server locks `.devpnt/*.db` and blocks in-place branch switches/merges in the primary worktree.
|
|
246
|
+
- Modify surgically, consistently with the plan.
|
|
247
|
+
- Implementation work follows the TDD discipline in `tdd.md` (RED/GREEN/REFACTOR — the L2/L3 default; record the reason when it does not apply).
|
|
248
|
+
- Before implementing (L2/L3; L1 exempt), **consult the guide router** for a guide covering the task — operative, or a comprehension map of the component you are about to touch — and read it first (the consult trigger, `guides.md` §0, summarized under `## Operative Guides`). A targeted description match, not a blanket read. Its result is the router verdict already declared with the triage level (Rule Zero); re-run the lookup here only if the work has moved to a topic the first lookup did not cover, and say so if the verdict changes.
|
|
249
|
+
- If the environment does not allow automated tests, declare the alternative verification and the reason.
|
|
250
|
+
- For bugs (L2/L3), follow the systematic debugging method in `debugging.md`.
|
|
251
|
+
- Circuit breaker: after 3 consecutive runs without progress on the tests, stop, switch to the systematic method in `debugging.md`, and ask for instructions if still stuck. `debugging.md` also covers **chronic fragility** — a component that breaks repeatedly across sessions is a comprehension + complexity signal (write the `source_kind: code` guide AND escalate a refactor), not a fourth patch.
|
|
252
|
+
- Update the ANALYSIS Diary or the Action Plan when you complete milestones, hit blockers, change decisions, or a session ends with work unfinished.
|
|
253
|
+
- **Opt-in subagent execution**: for an L3 with an approved design, the orchestrator MAY execute the work via subagents per `dispatch.md`, gated by `sdlc_check.py plan validate` ("no valid plan, no dispatch"); default stays same-session. Hybrid: the executable `PLAN_[feature].md` is `derived-from` the accepted E-TDD, never independently authored.
|
|
254
|
+
|
|
255
|
+
### 5. Closure
|
|
256
|
+
|
|
257
|
+
- Run the relevant tests/lint/smoke checks.
|
|
258
|
+
- For the review itself follow `review.md` (requesting and receiving findings) — the single definition, intended for reuse by the Hybrid review gates (devPNT-side wiring out of this unit's scope).
|
|
259
|
+
- Verify alignment with the local Vision or the devPNT M-VISION.
|
|
260
|
+
- If the work was governed by user-provided indications and is reusable, **PROPOSE distilling a guide** (proactive trigger, `guides.md` §1) — a proposal for the user, never a silent write, never from model knowledge.
|
|
261
|
+
- **Comprehension checkpoint**: ask explicitly — *did this session force me to build a model of a high-complexity component that no CURRENT guide covers?* If yes, WRITE the `source_kind: code` guide now (a duty, not a proposal — `guides.md` §1) and say so in the closure. The knowledge you paid to build is at its most complete right here; one closure later it is gone, and the next session re-derives it or breaks the component from partial understanding.
|
|
262
|
+
- Update only the documents actually impacted.
|
|
263
|
+
- **Update the workstream registry (`audit/handoff.md`)** — mandatory at every L3 closure: DELETE the closed workstream's `audit/HANDOFF_[feature].md` (history lives in git and in the Diary) and re-run `sdlc_check.py index`. Deleting the file *is* removing the row, and no other workstream's file is touched — that is the parallel-safety the registry exists for. Never edit the generated file: `validate` errors when it disagrees with its sources. The session-end rule and the L2 case: Write Triggers.
|
|
264
|
+
- **Aligned indexes (Poka-Yoke)**: if you created, moved or removed canonical documents (`vision/`, `reference/`, `architecture/`, `functional/`, `strategic/`):
|
|
265
|
+
- regenerate the manifest with `sdlc_check.py index` (writes `ai_docs/INDEX.md`) — never write it by hand;
|
|
266
|
+
- if the document is a must-read, add/update its line in the curated `README.md`;
|
|
267
|
+
- if the document replaces another, mark the old one `status: SUPERSEDED` and declare `supersedes:` in the new one;
|
|
268
|
+
- if you created a new canonical subdirectory, give it a purpose in `README.md`.
|
|
269
|
+
A canonical doc that is unindexed or lacks `status` = dirty closure (`sdlc_check.py check` fails/warns). Do not declare DONE until it is clean. Details: section "ai_docs documents".
|
|
270
|
+
- guides created or changed: `sdlc_check.py index` regenerates BOTH manifests (`ai_docs/INDEX.md` and the guide router `ai_docs/reference/INDEX.md`) in one run.
|
|
271
|
+
- If an architectural decision was taken (new pattern, layer or contract change, structural dependency), record an ADR before DONE — Standalone in `architecture/`, Hybrid propose the ADR/KL update in the devPNT DB. No decision, no ADR (Write Triggers).
|
|
272
|
+
- In Standalone, if the project adopts `sdlc_check.py`, run `python <skill_dir>/scripts/sdlc_check.py check --root <project_root>` or the equivalent local copy.
|
|
273
|
+
- Updated documents must travel in the same commit/PR as the code they describe.
|
|
274
|
+
- **Branch/worktree hygiene**: an L3 ran on its own branch (Phase 4) — close it with an explicit merge decision (merge, keep open, or discard) and clean up the branch/worktree; never leave orphan branches. In Hybrid, the running devPNT server locks `.devpnt/*.db`, so the merge is done from a separate git worktree or via a ref-only push, never an in-place branch switch in the primary worktree.
|
|
275
|
+
|
|
276
|
+
## ai_docs documents: two indexes + lifecycle
|
|
277
|
+
|
|
278
|
+
Documents in `ai_docs/` play two roles served by two distinct indexes — do not confuse them:
|
|
279
|
+
|
|
280
|
+
- **`ai_docs/README.md` (curated, by hand):** the reading priority. Few lines, only canonical must-reads, changes rarely. Human judgement on "what to read first".
|
|
281
|
+
- **`ai_docs/INDEX.md` (generated, `sdlc_check.py index`):** the complete manifest of every canonical doc (`vision/`, `reference/`, `architecture/`, `functional/`, `strategic/`) with description and status. Never by hand: it is regenerated, so it does not drift.
|
|
282
|
+
- **`strategic/features_history.md` (generated):** the ANALYSIS history, from their frontmatter.
|
|
283
|
+
- `audit/` and `solutions/` are discovery-by-grep: they do not enter the manifest.
|
|
284
|
+
|
|
285
|
+
**Canonical document header (lifecycle).** Every doc in those directories should open with a minimal frontmatter, so the manifest generates itself and an agent knows immediately whether to trust it:
|
|
286
|
+
|
|
287
|
+
```markdown
|
|
288
|
+
---
|
|
289
|
+
description: One line — what it is and when to read it.
|
|
290
|
+
status: CURRENT # CURRENT | SUPERSEDED | DRAFT | DEPRECATED
|
|
291
|
+
supersedes: old_doc.md # only if it replaces another doc
|
|
292
|
+
---
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
As a fallback (no frontmatter) the manifest derives the title from the first `# H1` and the description from the first prose line or blockquote; but without `status` a doc carries no freshness signal. A missing `status`, an invalid value, or a superseded doc still marked `CURRENT` = warning in `validate`. A `SUPERSEDED` doc stays on the filesystem as history, but its state declares it dead: no more greps leading back to obsolete guidance.
|
|
296
|
+
|
|
297
|
+
Without Python/hooks (minimal environments) the indexes and headers remain a prose discipline: update `README.md` and mark the `status` by hand; the validator is only the backstop where it is adopted.
|
|
298
|
+
|
|
299
|
+
Legacy note: the validator also accepts the deprecated Italian frontmatter keys (`stato`, `livello`, `data_inizio`, `data_fine`) and Italian section headings in existing projects. New documents must use the English forms.
|
|
300
|
+
|
|
301
|
+
## Operative Guides
|
|
302
|
+
|
|
303
|
+
Guides are **consulted, created, proposed, and (for code) authored for comprehension** — four moments; the mechanics live once in `guides.md`. Two source kinds: `document` (user indications, operative) and `code` (a comprehension map of a complex component):
|
|
304
|
+
- **Consult (before acting):** before operative L2/L3 work (L1 exempt), check the guide router for a guide covering the task and read the match first — a targeted description match, never a blanket read. **Declare the verdict** on the same line as the triage level (Rule Zero): the lookup is only reliable when its result is visible. → `guides.md` §0.
|
|
305
|
+
- **Create (from user indications):** the origin+purpose test below (`source_kind: document`).
|
|
306
|
+
- **Propose proactively (after success):** after reusable, user-indication-governed work, PROPOSE distilling a guide — a proposal, never a silent write, never from model knowledge. → `guides.md` §1.
|
|
307
|
+
- **Comprehend (code, autonomous):** when a component/feature/layer is high-complexity and no CURRENT guide covers it, it is your DUTY to WRITE a `source_kind: code` comprehension guide autonomously — no proposal (additive, code-anchored, reversible); every claim traces to a code excerpt. Signals + guard-rails: `guides.md` §1.
|
|
308
|
+
|
|
309
|
+
Trigger test: the user hands over indications to follow (origin = user, not model
|
|
310
|
+
knowledge) meant to govern how the agent operates (purpose = operative), not just
|
|
311
|
+
inform an answer. Both hold → distill into `ai_docs/reference/GUIDE_[topic].md`.
|
|
312
|
+
|
|
313
|
+
A guide TRAINS the agent, two levels: the guide is the **synthesis** a trained
|
|
314
|
+
agent carries (compact — read whole before acting); the verbatim snapshot in
|
|
315
|
+
`.sources/` is the **book**, reached on demand via the section markers. Fidelity
|
|
316
|
+
constraint: only what the source supports; gaps marked `[not covered by source]`,
|
|
317
|
+
never filled from general knowledge; selection and compression expected, addition
|
|
318
|
+
forbidden. Full pipeline, DRY rule, snapshotting and maintenance: `guides.md`.
|
|
319
|
+
|
|
320
|
+
`ai_docs/reference/INDEX.md` is generated (the guide router) — never edit by hand,
|
|
321
|
+
regenerate with `sdlc_check.py index`.
|
|
322
|
+
|
|
323
|
+
**Agent-global KB.** A second, cross-project guide root lives at the fixed path `~/.agentic-sdlc/` (same `ai_docs/` structure, same validator/router/freshness engine via `sdlc_check.py --root ~/.agentic-sdlc`). Project guides win on topic collision; a project guide that overrides a KB guide MUST declare `overrides: GUIDE_<topic>.md` — the validator warns on undeclared collisions (error under `--strict`) and fail-closes on an `overrides:` value that escapes the KB. Discovery is this paragraph: agents and subagents reach KB guides by path, exactly like project guides.
|
|
324
|
+
|
|
325
|
+
## Mechanical Enforcement
|
|
326
|
+
|
|
327
|
+
The prompt is not enforcement. When the project needs repeatable guarantees:
|
|
328
|
+
- read `ENFORCEMENT.md`;
|
|
329
|
+
- use `scripts/sdlc_check.py validate --strict` in CI;
|
|
330
|
+
- use `scripts/sdlc_check.py gate` only for security-critical directories, not for the whole repository;
|
|
331
|
+
- (skill development) the self-eval battery `python -m unittest discover -s scripts -p "test_*.py"` guards the skill's own doctrine invariants and is the deterministic release gate — see `ENFORCEMENT.md` §5.
|
|
332
|
+
|
|
333
|
+
The validator is a support, not a universal prerequisite: the skill must stay usable in environments without Python or hooks, declaring what it cannot verify automatically.
|
|
@@ -136,9 +136,10 @@ exists (this narrows the reply and speeds up the round). Cover:
|
|
|
136
136
|
are what gets filtered out).
|
|
137
137
|
2. **Actors** — who interacts with this: their role, primary goal, what
|
|
138
138
|
"good UX" means to them, and the surfaces they use today for this job
|
|
139
|
-
(the screens, commands or endpoints they operate — the
|
|
139
|
+
(the screens, commands or endpoints they operate — the Interface
|
|
140
140
|
Contract's as-is starts here; skip the surface half when no actor-facing
|
|
141
|
-
surface is in scope)
|
|
141
|
+
surface is in scope) and, at responsibility level, what happens when they
|
|
142
|
+
act (which components respond) — the Interface Contract's flow starts here. These become the Vision's `## Actors`; each
|
|
142
143
|
use-case below attaches to one (actor = who they are, use-case = what
|
|
143
144
|
they do). Skip only when an approved Vision already names them.
|
|
144
145
|
3. **Scope boundaries** — what is explicitly included in this unit of work.
|
|
@@ -168,20 +168,29 @@ 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
|
-
- **
|
|
171
|
+
- **Interface Contract (same reviews; fires only in the lens whose template
|
|
172
172
|
defines the section — the code lens today).** When the change creates or
|
|
173
173
|
modifies an actor-facing surface (the trigger's owning definition is the code
|
|
174
174
|
lens's `templates.md` section comment — cite it, never restate it), **an
|
|
175
|
-
artifact carrying NO `##
|
|
175
|
+
artifact carrying NO `## Interface Contract` is itself a finding** — "the
|
|
176
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,
|
|
178
|
-
use-case with no named interaction
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
177
|
+
to skip the check. When the contract is there, these findings live here: a
|
|
178
|
+
use-case with no named interaction flow realizing it; **a flow that is not
|
|
179
|
+
walkable at the responsibility level** — it jumps from the actor's action to
|
|
180
|
+
the outcome without naming the components it traverses; **a *how* inside the
|
|
181
|
+
contract** — a mechanism, algorithm, data structure, widget or file-level
|
|
182
|
+
design — which is Solution-leakage (the flow NAMES components as
|
|
183
|
+
responsibility-holders, it never designs them); **required feedback that omits
|
|
184
|
+
an error or intermediate state, or a software actor's return status** (feedback
|
|
185
|
+
is universal, not human-only); a design or diff element that alters a
|
|
186
|
+
contracted surface, flow or feedback with no explicit renegotiation note (after
|
|
187
|
+
design approval that is a scope change owed to the user, not a design detail);
|
|
188
|
+
a contracted flow the `## Test Strategy` does not cover; and a new interaction
|
|
189
|
+
idiom introduced where the contract's own as-is names an existing one, with no
|
|
190
|
+
declared reason. (The architectural constraints the surface must live with are
|
|
191
|
+
NOT checked here — architecture-awareness is the Capability Ledger / Impact
|
|
192
|
+
review's job; a clause for it would duplicate that.) A lens whose template
|
|
193
|
+
defines no such section (knowledge, marketing) never fires this clause.
|
|
185
194
|
|
|
186
195
|
## Anti-patterns
|
|
187
196
|
|
|
@@ -250,7 +250,7 @@ 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
|
-
##
|
|
253
|
+
## Interface Contract
|
|
254
254
|
<!-- [conditional] Fires when the change creates or modifies a surface through
|
|
255
255
|
which an actor **acts on or perceives** the system — GUI view, CLI
|
|
256
256
|
command/flags, API endpoint, user-edited config, notification or
|
|
@@ -260,26 +260,33 @@ checks: [marketing.funnel] # optional — extra portable checks to run on t
|
|
|
260
260
|
(operated by code, not by an actor). Not fired → one line stating why.
|
|
261
261
|
This comment is the OWNING definition of the trigger; SKILL.md and
|
|
262
262
|
review.md cite it, never restate it.
|
|
263
|
-
Content,
|
|
264
|
-
1.
|
|
265
|
-
|
|
266
|
-
product already does selection, confirmation, errors,
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
263
|
+
Content, per use case whose surface the change touches (a question, not a form):
|
|
264
|
+
1. Actors + surfaces — who acts (human OR software, contracted the same way)
|
|
265
|
+
through which surface, AND the interaction idioms already in use for this
|
|
266
|
+
job (how the product already does selection, confirmation, errors,
|
|
267
|
+
navigation).
|
|
268
|
+
2. The information & processing flow — THE HEART. Walk it: the actor acts
|
|
269
|
+
here → the flow it triggers, NAMING the components it traverses as
|
|
270
|
+
responsibility-holders ("the auth component validates and responds") →
|
|
271
|
+
what returns. Responsibility level only — never the mechanism inside a
|
|
272
|
+
component. This walk is the proof of walkability: it surfaces realization
|
|
273
|
+
problems before a line of code exists.
|
|
274
|
+
3. Required affordances — what the actor needs in order to act.
|
|
275
|
+
4. Required feedback — UNIVERSAL: what must come back, including error and
|
|
276
|
+
intermediate states, and the return status a software actor receives
|
|
277
|
+
(feedback is not human-only). Left implicit, the interface breaks.
|
|
278
|
+
5. Architectural constraints touched — the existing components/flows the
|
|
279
|
+
surface must coexist with, named as constraints (read, not redesigned).
|
|
280
|
+
6. Surfaced feasibility flags / risks — problems the walk revealed; these
|
|
281
|
+
feed the threat model (## Security) and the Impact.
|
|
282
|
+
Reuse the as-is idioms by default; a NEW idiom where an existing one covers
|
|
283
|
+
the job is a declared decision with its reason — never an unmarked invention.
|
|
284
|
+
Authority split: the contract binds observable behavior AND the
|
|
285
|
+
responsibility-level flow — it NAMES the components in the flow, never their
|
|
286
|
+
mechanism or file-level design (that is the Impact's vocabulary). After
|
|
287
|
+
design approval, changing a contracted surface, flow or feedback is a scope
|
|
288
|
+
change the USER approves: the solution may propose it, never enact it
|
|
289
|
+
silently. Every contracted flow is covered by ## Test Strategy. -->
|
|
283
290
|
|
|
284
291
|
## Capability Ledger
|
|
285
292
|
<!-- the architect pass (`architect.md`), run BEFORE the Impact below. One row per
|