@mdferdousalam/agentic-sdlc 0.0.0-stage → 3.0.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/.claude-plugin/marketplace.json +11 -0
- package/.claude-plugin/plugin.json +31 -0
- package/CHANGELOG.md +330 -0
- package/GETTING-STARTED.md +174 -0
- package/LICENSE +21 -0
- package/README.md +268 -2
- package/SECURITY.md +25 -0
- package/agents/sdlc-architecture-reviewer.md +71 -0
- package/agents/sdlc-branch-opener.md +83 -0
- package/agents/sdlc-code-reviewer.md +62 -0
- package/agents/sdlc-impact-analyst.md +70 -0
- package/agents/sdlc-implementer.md +60 -0
- package/agents/sdlc-lander.md +40 -0
- package/agents/sdlc-readiness-gate.md +128 -0
- package/agents/sdlc-release-manager.md +76 -0
- package/agents/sdlc-remediator.md +89 -0
- package/agents/sdlc-reporter.md +42 -0
- package/agents/sdlc-security-reviewer.md +62 -0
- package/agents/sdlc-spec-reviewer.md +56 -0
- package/agents/sdlc-spec-writer.md +62 -0
- package/agents/sdlc-test-author.md +32 -0
- package/agents/sdlc-triager.md +48 -0
- package/agents/sdlc-verifier.md +69 -0
- package/bin/__pycache__/sdlccpython-315.pyc +0 -0
- package/bin/sdlc +2747 -0
- package/bin/sdlc-install-opencode +10 -0
- package/commands/doctor.md +9 -0
- package/commands/feature.md +17 -0
- package/commands/gate.md +33 -0
- package/commands/impact.md +13 -0
- package/commands/implement.md +11 -0
- package/commands/init.md +15 -0
- package/commands/land.md +10 -0
- package/commands/metrics.md +12 -0
- package/commands/readiness.md +8 -0
- package/commands/release.md +16 -0
- package/commands/remediate.md +13 -0
- package/commands/report.md +11 -0
- package/commands/review.md +12 -0
- package/commands/status.md +9 -0
- package/commands/trace.md +9 -0
- package/commands/triage.md +14 -0
- package/commands/verify.md +10 -0
- package/docs/compliance.md +70 -0
- package/docs/configuration.md +106 -0
- package/docs/control-spec.md +269 -0
- package/docs/install.md +75 -0
- package/docs/maturity.md +129 -0
- package/docs/opencode.md +45 -0
- package/docs/openspec.md +58 -0
- package/docs/pipeline.md +160 -0
- package/docs/platforms.md +99 -0
- package/docs/rules.md +122 -0
- package/evals/baseline-attributes-failure/graders/criteria.md +18 -0
- package/evals/baseline-attributes-failure/prompt.md +23 -0
- package/evals/budget-stops-rather-than-asks/graders/criteria.md +19 -0
- package/evals/budget-stops-rather-than-asks/prompt.md +14 -0
- package/evals/critical-low-confidence-escalates/graders/criteria.md +22 -0
- package/evals/critical-low-confidence-escalates/prompt.md +17 -0
- package/evals/gate-refuses-unexecuted/graders/criteria.md +16 -0
- package/evals/gate-refuses-unexecuted/prompt.md +15 -0
- package/evals/refusal-is-not-negotiated/graders/criteria.md +17 -0
- package/evals/refusal-is-not-negotiated/prompt.md +7 -0
- package/evals/release-needs-rollback-and-approval/graders/criteria.md +15 -0
- package/evals/release-needs-rollback-and-approval/prompt.md +6 -0
- package/evals/remediator-refuses-weakened-test/graders/criteria.md +20 -0
- package/evals/remediator-refuses-weakened-test/prompt.md +33 -0
- package/evals/spec-review-catches-unfalsifiable/graders/criteria.md +17 -0
- package/evals/spec-review-catches-unfalsifiable/prompt.md +17 -0
- package/examples/worked-example.md +131 -0
- package/hooks/hooks.json +16 -0
- package/npm/cli.js +35 -0
- package/opencode/plugin/agentic-sdlc.ts +52 -0
- package/package.json +59 -4
- package/profiles/README.md +52 -0
- package/profiles/compiler.md +33 -0
- package/profiles/concerns/architecture.md +50 -0
- package/profiles/concerns/concurrency.md +59 -0
- package/profiles/concerns/data.md +62 -0
- package/profiles/concerns/memory.md +52 -0
- package/profiles/concerns/performance.md +54 -0
- package/profiles/concerns/platform.md +62 -0
- package/profiles/library.md +31 -0
- package/profiles/service.md +32 -0
- package/profiles/webapp.md +40 -0
- package/schema/finding.schema.json +267 -0
- package/schema/sdlc.config.schema.json +324 -0
- package/skills/agentic-sdlc-pipeline/SKILL.md +66 -0
- package/skills/openspec-with-sdlc/SKILL.md +56 -0
- package/skills/writing-specifications/SKILL.md +51 -0
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
# The Agent Engineering Control Specification
|
|
2
|
+
|
|
3
|
+
Version 1. Every agent in this pipeline is held to this document, and no agent may invent a
|
|
4
|
+
standard that contradicts it. [`docs/rules.md`](rules.md) is the prose every stage reads; this
|
|
5
|
+
is the machine-facing half — the vocabularies, the repair policy, and the rule table that says
|
|
6
|
+
how each class of problem is detected, what evidence it needs, and who is allowed to fix it.
|
|
7
|
+
|
|
8
|
+
It exists because a security reviewer, an architecture reviewer and a repair agent that each
|
|
9
|
+
decide for themselves what "high severity" means will disagree in ways nobody can audit.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 1. The four vocabularies
|
|
14
|
+
|
|
15
|
+
They are separate on purpose. Collapsing any two of them is how an unverified fix gets shipped
|
|
16
|
+
as a verified one.
|
|
17
|
+
|
|
18
|
+
### 1.1 Outcome of a criterion — the five words
|
|
19
|
+
|
|
20
|
+
**`passed` · `failed` · `skipped` · `refused` · `unexecuted`**
|
|
21
|
+
|
|
22
|
+
Defined in [`docs/rules.md`](rules.md) §3 and unchanged by this document. They describe whether
|
|
23
|
+
an acceptance criterion holds. A test that did not run is `unexecuted`, never `passed`.
|
|
24
|
+
|
|
25
|
+
### 1.2 Outcome of a finding — the six words
|
|
26
|
+
|
|
27
|
+
A finding is a claim about the code, so it closes differently from a criterion.
|
|
28
|
+
|
|
29
|
+
| Word | Means |
|
|
30
|
+
| --- | --- |
|
|
31
|
+
| `open` | Raised, not yet addressed. |
|
|
32
|
+
| `fixed` | The behaviour changed and a test proves it. |
|
|
33
|
+
| `refused` | The finding is wrong, with the reason and the evidence. |
|
|
34
|
+
| `deferred` | Real, out of this unit of work's scope, filed where it will be seen. |
|
|
35
|
+
| `unexecuted` | The fix could not be verified. **This is not closed.** |
|
|
36
|
+
| `escalated` | Awaiting a human decision. |
|
|
37
|
+
|
|
38
|
+
`fixed`, `refused`, `deferred` and `unexecuted` are the words `sdlc-remediator` already uses;
|
|
39
|
+
`open` and `escalated` extend them for findings that have not reached the remediator yet.
|
|
40
|
+
|
|
41
|
+
### 1.3 Severity — how bad it is if real
|
|
42
|
+
|
|
43
|
+
| Severity | Examples |
|
|
44
|
+
| --- | --- |
|
|
45
|
+
| `critical` | Authentication bypass, data corruption, exploitable injection. |
|
|
46
|
+
| `high` | Memory-safety defect, race condition, broken authorization, destructive migration. |
|
|
47
|
+
| `medium` | Performance regression, missing edge case, incorrect retry policy. |
|
|
48
|
+
| `low` | Formatting, lint, a safe mechanical refactor. |
|
|
49
|
+
| `advisory` | An architectural trade-off, a speculative optimisation, a disputed pattern. |
|
|
50
|
+
|
|
51
|
+
`advisory` is not a weak `low`. It means **report evidence and alternatives; do not force a code
|
|
52
|
+
change.** An agent that turns an advisory into a commit has exceeded its authority.
|
|
53
|
+
|
|
54
|
+
### 1.4 Confidence — how sure we are it is real
|
|
55
|
+
|
|
56
|
+
| Confidence | Earned by |
|
|
57
|
+
| --- | --- |
|
|
58
|
+
| `high` | A deterministic tool said so, or there is a reproduction. |
|
|
59
|
+
| `medium` | A strong reading of the code, without execution. |
|
|
60
|
+
| `low` | A pattern match or a suspicion. |
|
|
61
|
+
|
|
62
|
+
**Severity and confidence are independent, and this is the point of the whole document.** A
|
|
63
|
+
low-confidence fix for a critical vulnerability is not safe merely because the agent believes it
|
|
64
|
+
has solved the problem. Never raise confidence to justify a repair you want to make.
|
|
65
|
+
|
|
66
|
+
### 1.5 Detection method
|
|
67
|
+
|
|
68
|
+
`deterministic` (compiler, analyser, scanner) · `test` · `runtime` (profiler, sanitiser,
|
|
69
|
+
production telemetry) · `llm`.
|
|
70
|
+
|
|
71
|
+
Recorded on every finding, because a reader weighs the four differently. The standing rule —
|
|
72
|
+
[`docs/rules.md`](rules.md) and the brief both say it — is **tools before opinions**: prefer a
|
|
73
|
+
compiler diagnostic, a static analyser, a scanner or a reproducible test to an unsupported
|
|
74
|
+
claim. An `llm` finding is not worthless; it is a finding whose confidence has not yet been
|
|
75
|
+
earned by anything but reading.
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## 2. The repair policy
|
|
80
|
+
|
|
81
|
+
What an agent may do about a finding is a function of **severity and confidence together**,
|
|
82
|
+
never severity alone.
|
|
83
|
+
|
|
84
|
+
| | `high` confidence | `medium` confidence | `low` confidence |
|
|
85
|
+
| --- | --- | --- | --- |
|
|
86
|
+
| **`critical`** | Fix on an isolated branch, full verification, **human approval to merge** | Escalate with evidence | Escalate; do not touch the code |
|
|
87
|
+
| **`high`** | Fix, full verification, human approval where the project asks for one | Fix only with a reproduction first; otherwise escalate | Escalate |
|
|
88
|
+
| **`medium`** | Fix and regression-test | Fix if the repair is constrained; otherwise report | Report |
|
|
89
|
+
| **`low`** | Fix automatically when deterministic rules and tests establish safety | Fix | Report |
|
|
90
|
+
| **`advisory`** | Report evidence and alternatives. Never an automatic code change, at any confidence. | — | — |
|
|
91
|
+
|
|
92
|
+
`proposedRepair.autofixEligible` on a finding is this table's answer, written down. An agent that
|
|
93
|
+
sets it to `true` outside this table is making a policy decision it does not own.
|
|
94
|
+
|
|
95
|
+
### 2.1 Constraints on every repair
|
|
96
|
+
|
|
97
|
+
These hold whatever the cell above says:
|
|
98
|
+
|
|
99
|
+
1. **Minimal.** Do not rewrite a module to fix a localised defect.
|
|
100
|
+
2. **Reproduce first.** A finding you cannot reproduce may be wrong. Say so rather than changing
|
|
101
|
+
code to satisfy a reviewer you do not believe.
|
|
102
|
+
3. **A failing test first**, where the finding is behavioural. A fix with no failing test behind
|
|
103
|
+
it is a guess that happens to compile.
|
|
104
|
+
4. **Re-verify the patch itself.** Evidence from before the change does not validate the change.
|
|
105
|
+
5. **One finding per commit**, so each can be reverted or reviewed alone.
|
|
106
|
+
6. **Never weaken the gate.** No deleted test, no weakened assertion, no suppressed warning, no
|
|
107
|
+
lowered threshold, no newly excluded path — unless the suppression *is* the correct
|
|
108
|
+
resolution and the commit message says why. This is the one failure the pipeline exists to
|
|
109
|
+
prevent, and `TEST-SUITE-WEAKENED` below detects it mechanically rather than trusting the
|
|
110
|
+
prohibition.
|
|
111
|
+
7. **Bounded retries.** After three real attempts at the same finding, stop and report. The
|
|
112
|
+
specification or the approach is usually the problem, not the code.
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## 3. The taxonomy, and what this pipeline actually checks
|
|
117
|
+
|
|
118
|
+
Findings are addressed by domain. Being honest about coverage is part of the specification: an
|
|
119
|
+
auditor needs to know what was *not* looked for.
|
|
120
|
+
|
|
121
|
+
| Domain | Subject | Checked by | Coverage |
|
|
122
|
+
| --- | --- | --- | --- |
|
|
123
|
+
| **A** | Requirements and system design | `sdlc-spec-writer`, `sdlc-spec-reviewer`, `sdlc-verifier` | full |
|
|
124
|
+
| **B** | Architecture and system structure | `sdlc-architecture-reviewer`, `concerns/architecture` | review-level |
|
|
125
|
+
| **C** | Code correctness and implementation | `verifyCmd`, `sdlc-code-reviewer` | compile/type full, logic review-level |
|
|
126
|
+
| **D** | Security and trust boundaries | `sdlc-security-reviewer`, `secretScan` | full |
|
|
127
|
+
| **E** | Performance and computational efficiency | `concerns/performance` | review-level; no runtime measurement |
|
|
128
|
+
| **F** | Memory, resources and lifecycle | `concerns/memory` | review-level; no allocation tracing |
|
|
129
|
+
| **G** | Concurrency and parallelism | `concerns/concurrency` | review-level; no race detector |
|
|
130
|
+
| **H** | Testing and verification | `sdlc-verifier`, `sdlc-test-author`, `TEST-*` rules | full |
|
|
131
|
+
| **I** | Code quality and maintainability | `sdlc-code-reviewer`, `quality.cmd` | depends on your analyser |
|
|
132
|
+
| **J** | Design patterns and principles | `concerns/architecture` | review-level |
|
|
133
|
+
| **K** | Database and data integrity | `concerns/data`, `profiles/webapp` | review-level |
|
|
134
|
+
| **L** | APIs and integration contracts | `sdlc-code-reviewer`, `profiles/library` | review-level |
|
|
135
|
+
| **M** | Reliability and fault tolerance | `profiles/service` | review-level |
|
|
136
|
+
| **N** | Scalability and capacity | `concerns/performance` | review-level |
|
|
137
|
+
| **O** | Build, dependencies, supply chain | `sdlc-security-reviewer`, your dependency audit | partial — no SBOM, no licence check |
|
|
138
|
+
| **P** | Infrastructure, deployment, configuration | `sdlc-release-manager` | deploy and rollback only |
|
|
139
|
+
| **Q** | Observability and diagnostics | `profiles/service` | review-level |
|
|
140
|
+
| **R** | Frontend, UX, accessibility | `profiles/webapp` | review-level |
|
|
141
|
+
| **S** | Platform-specific correctness | `concerns/platform` | review-level |
|
|
142
|
+
| **T** | Documentation, governance, compliance | `sdlc-reporter`, receipts, `sdlc trace` | full |
|
|
143
|
+
| **U** | AI, LLM and agent-specific risks | the hook, per-agent tool limits, `docs/rules.md` §7 | full |
|
|
144
|
+
|
|
145
|
+
### Cross-cutting domains
|
|
146
|
+
|
|
147
|
+
| Domain | Subject | Control |
|
|
148
|
+
| --- | --- | --- |
|
|
149
|
+
| **X1** | Change impact analysis | `sdlc-impact-analyst` |
|
|
150
|
+
| **X2** | Compatibility and versioning | `profiles/library`, `IMPACT-PUBLIC-SHAPE` |
|
|
151
|
+
| **X3** | Developer/agent concurrency | dirty-tree refusal, upstream-drift check, worktree isolation |
|
|
152
|
+
| **X4** | Automated repair correctness | §2.1 above, `TEST-SUITE-WEAKENED` |
|
|
153
|
+
| **X5** | Cost and resource economics | `budget` in `sdlc.config.json` |
|
|
154
|
+
| **X6** | Product and operational correctness | `profiles/webapp`, `concerns/data` |
|
|
155
|
+
| **X7** | Agent economics and execution safety | `budget`, bounded retries, `sdlc feedback` |
|
|
156
|
+
| **X8** | Environment and toolchain integrity | environment fingerprint on every receipt |
|
|
157
|
+
| **X9** | Human-agent collaboration and git hygiene | path-scoped commits, PR body contract, finding dedup |
|
|
158
|
+
| **X10** | State resilience and checkpointing | `sdlc checkpoint`, receipt revalidation |
|
|
159
|
+
| **X11** | Test reliability and semantic regression | baseline comparison, `TEST-*` rules |
|
|
160
|
+
| **X12** | Change governance and review quality | receipts, `.sdlc/audit.log`, `sdlc trace` |
|
|
161
|
+
|
|
162
|
+
**Review-level** means an agent reads the diff against written standards. It is real review and
|
|
163
|
+
it finds real defects, but it is not a measurement. A memory leak usually needs allocation
|
|
164
|
+
evidence; a performance claim needs a representative workload; a race usually needs a detector.
|
|
165
|
+
Where the stack has such a tool, put it in `quality.cmd` and the finding becomes `deterministic`.
|
|
166
|
+
This plugin ships no analysers and must not pretend otherwise.
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## 4. The rule table
|
|
171
|
+
|
|
172
|
+
Rules the pipeline enforces today. Each has a stable `ruleId` that a finding cites, so a rule can
|
|
173
|
+
be traced across versions. A renamed rule is a new rule.
|
|
174
|
+
|
|
175
|
+
| Rule ID | Domain | Detection | Default severity | Autofix | Evidence required |
|
|
176
|
+
| --- | --- | --- | --- | --- | --- |
|
|
177
|
+
| `SPEC-UNFALSIFIABLE` | A.6 | llm | high | no | the requirement, and why it cannot fail |
|
|
178
|
+
| `SPEC-SCOPE-UNSTATED` | A.7 | llm | medium | no | the missing "out of scope" section |
|
|
179
|
+
| `SPEC-DUPLICATE` | A.7 | llm | medium | no | the adjacent spec that owns it |
|
|
180
|
+
| `SPEC-INVALID` | A.6 | deterministic | high | no | `openspec validate --strict` output |
|
|
181
|
+
| `BUILD-FAILS` | C.19 | deterministic | critical | no | `verifyCmd` output |
|
|
182
|
+
| `TYPE-ERROR` | C.20 | deterministic | high | yes (low risk only) | the type-checker diagnostic |
|
|
183
|
+
| `CODE-SCOPE-CREEP` | A.7 | llm | medium | no | the hunk no requirement asked for |
|
|
184
|
+
| `CODE-ERROR-SWALLOWED` | C.25 | llm | high | no | `file:line` of the swallowed path |
|
|
185
|
+
| `SEC-AUTHORITY` | D.30 | llm | critical | no | the bypassable check, at `file:line` |
|
|
186
|
+
| `SEC-INJECTION-SQL` | D.31 | llm | critical | no | the interpolation site |
|
|
187
|
+
| `SEC-INJECTION-SHELL` | D.31 | llm | critical | no | the interpolation site |
|
|
188
|
+
| `SEC-UNTRUSTED-INPUT` | D.38 | llm | high | no | the parser and its hostile-input test, or its absence |
|
|
189
|
+
| `SEC-SECRET-PRESENT` | D.36 | deterministic | critical | no | `secretScan` output |
|
|
190
|
+
| `SEC-DEPENDENCY-NEW` | O.151 | llm | medium | no | the lockfile diff and the justification |
|
|
191
|
+
| `SEC-DATA-EXPOSURE` | D.41 | llm | high | no | what now reaches a log or a response |
|
|
192
|
+
| `SEC-DOS-UNBOUNDED` | D.42 | llm | high | no | the unbounded allocation, query or loop |
|
|
193
|
+
| `TEST-CRITERION-UNEXECUTED` | H.76 | test | high | no | the criterion with no test outcome |
|
|
194
|
+
| `TEST-ASSERTION-ABSENT` | H.77 | llm | high | no | the test that asserts only that code ran |
|
|
195
|
+
| `TEST-SUITE-WEAKENED` | X4 | deterministic | critical | **never** | the diff hunk deleting or weakening the check |
|
|
196
|
+
| `TEST-BASELINE-REGRESSION` | H.79 | deterministic | high | no | baseline comparison showing a newly failing test |
|
|
197
|
+
| `QUALITY-BUDGET` | I.97 | deterministic | medium | no | `quality.cmd` output |
|
|
198
|
+
| `IMPACT-PUBLIC-SHAPE` | X2 | llm | high | no | the changed interface and its consumers |
|
|
199
|
+
| `IMPACT-DEPENDENT-BROKEN` | X1 | llm | high | no | the dependent that no longer compiles or holds |
|
|
200
|
+
| `ARCH-LAYER-DIRECTION` | B.12 | llm | high | no | the import that crosses the wrong way |
|
|
201
|
+
| `ARCH-CYCLE` | B.11 | llm | medium | no | the cycle, as a path |
|
|
202
|
+
| `ENV-TOOLCHAIN-DRIFT` | X8 | deterministic | medium | no | the expected and actual tool versions |
|
|
203
|
+
| `BUDGET-EXCEEDED` | X7 | deterministic | high | no | the limit and the measurement |
|
|
204
|
+
| `GIT-WORK-DESTROYED` | X3 | deterministic | critical | **never** | the refused command |
|
|
205
|
+
|
|
206
|
+
### Concern rules
|
|
207
|
+
|
|
208
|
+
Raised only where `concerns` in the config enables them. Each concern profile names the
|
|
209
|
+
deterministic tool for the stacks that have one; until that tool is in `quality.cmd`, these are
|
|
210
|
+
`llm` findings at `medium` confidence at best, and must say so.
|
|
211
|
+
|
|
212
|
+
| Rule ID | Domain | Detection | Default severity | Autofix | Evidence required |
|
|
213
|
+
| --- | --- | --- | --- | --- | --- |
|
|
214
|
+
| `ARCH-UNDECLARED` | B.18 | llm | advisory | no | that the project states no structure anywhere |
|
|
215
|
+
| `ARCH-BOUNDARY-REACH` | B.14 | llm | medium | no | the access past the interface |
|
|
216
|
+
| `ARCH-COHESION` | B.13 | llm | advisory | no | the module's second responsibility |
|
|
217
|
+
| `ARCH-INDIRECTION-UNPAID` | J.104 | llm | advisory | no | the abstraction and its single user |
|
|
218
|
+
| `PERF-N-PLUS-ONE` | E.50 | llm | high | no | the query inside the loop |
|
|
219
|
+
| `PERF-UNPAGINATED` | E.51 | llm | high | no | the list endpoint with no bound |
|
|
220
|
+
| `PERF-HOT-PATH-WORK` | E.43 | llm | medium | no | the work repeated per call |
|
|
221
|
+
| `PERF-CACHE-UNSPECIFIED` | E.52 | llm | medium | no | the missing invalidation answer |
|
|
222
|
+
| `PERF-SCALE-LIMIT-UNSTATED` | N.144 | llm | medium | no | the unbounded dimension |
|
|
223
|
+
| `MEM-UNBOUNDED` | F.62 | llm | high | no | the collection with no eviction or bound |
|
|
224
|
+
| `MEM-LEAK` | F.60 | runtime | high | no | allocation evidence over time |
|
|
225
|
+
| `MEM-CLEANUP-MISSING` | F.63 | llm | high | no | the exit path with no release |
|
|
226
|
+
| `MEM-SAFETY` | F.57 | deterministic | critical | no | the sanitiser or checker output |
|
|
227
|
+
| `CONC-DATA-RACE` | G.66 | runtime | high | no | the detector's report |
|
|
228
|
+
| `CONC-DEADLOCK-ORDER` | G.67 | llm | high | no | the two lock orders |
|
|
229
|
+
| `CONC-TOCTOU` | G.68 | llm | high | no | the check and the act, with the window |
|
|
230
|
+
| `CONC-TASK-LEAK` | G.72 | llm | medium | no | the spawned task nobody holds |
|
|
231
|
+
| `CONC-NO-TIMEOUT` | G.73 | llm | medium | no | the call with no bound |
|
|
232
|
+
| `CONC-BACKPRESSURE` | G.74 | llm | medium | no | the unbounded channel or queue |
|
|
233
|
+
| `DATA-CONSTRAINT-MISSING` | K.110 | llm | medium | no | the invariant held only in code |
|
|
234
|
+
| `DATA-TRANSACTION-BOUNDARY` | K.111 | llm | high | no | the side effect inside the transaction |
|
|
235
|
+
| `DATA-MIGRATION-IRREVERSIBLE` | K.114 | llm | high | no | the step with no stated way back |
|
|
236
|
+
| `DATA-IDEMPOTENCY` | K.116 | llm | high | no | the retryable operation with no key |
|
|
237
|
+
| `DATA-PRECISION` | K.117 | llm | medium | no | the float money, or the zoneless time |
|
|
238
|
+
| `PLAT-HOST-ASSUMPTION` | S.189 | llm | medium | no | the hardcoded path, separator or case |
|
|
239
|
+
| `PLAT-NUMERIC` | S.191 | llm | high | no | the overflow or narrowing cast |
|
|
240
|
+
| `PLAT-LOCALE` | S.194 | llm | medium | no | the locale-dependent comparison |
|
|
241
|
+
| `PLAT-SHUTDOWN` | S.195 | llm | medium | no | the in-flight work on termination |
|
|
242
|
+
|
|
243
|
+
### Adding a rule
|
|
244
|
+
|
|
245
|
+
A new rule needs: an ID in an existing namespace, a taxonomy address, a detection method, a
|
|
246
|
+
default severity, an autofix answer that follows §2, and the evidence a finding must carry. Add
|
|
247
|
+
the row here first. A rule that exists only inside an agent's prompt is not a rule — it is that
|
|
248
|
+
agent's opinion, and the next agent will disagree with it.
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
252
|
+
## 5. The finding contract
|
|
253
|
+
|
|
254
|
+
Every finding, from an agent or a tool, validates against
|
|
255
|
+
[`schema/finding.schema.json`](../schema/finding.schema.json) and is written with:
|
|
256
|
+
|
|
257
|
+
```sh
|
|
258
|
+
sdlc finding write --rule SEC-INJECTION-SQL --severity critical --confidence high \
|
|
259
|
+
--file src/db/query.ts --line 42 --summary "user input is concatenated into SQL"
|
|
260
|
+
sdlc finding list --open
|
|
261
|
+
sdlc finding close F-1a2b3c4d --outcome fixed --commit <sha>
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
Findings live in `.sdlc/findings/`. They are local to a working copy, like receipts — see the
|
|
265
|
+
honest limits in [`docs/compliance.md`](compliance.md).
|
|
266
|
+
|
|
267
|
+
**Require structured results, and independently validate every one.** Valid JSON is not proof of
|
|
268
|
+
correct reasoning. The readiness gate checks the evidence behind a finding; it does not accept
|
|
269
|
+
the classification an agent gave itself.
|
package/docs/install.md
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Installing
|
|
2
|
+
|
|
3
|
+
Six ways in. They all land on the same CLI; pick whichever matches how you already install
|
|
4
|
+
things. Everything needs `git` and Python 3.8+ — there are no Python dependencies.
|
|
5
|
+
|
|
6
|
+
| Route | Command | Needs |
|
|
7
|
+
| --- | --- | --- |
|
|
8
|
+
| **Claude Code plugin** | `/plugin marketplace add mdferdousalam/agentic-sdlc` then `/plugin install agentic-sdlc` | Claude Code |
|
|
9
|
+
| **Shell** | `curl -fsSL https://raw.githubusercontent.com/mdferdousalam/agentic-sdlc/main/install.sh \| sh` | curl |
|
|
10
|
+
| **npm** | `npx @mdferdousalam/agentic-sdlc install` | Node 16+ |
|
|
11
|
+
| **PyPI** | `uvx --from agentic-sdlc-cli sdlc install` or `pipx install agentic-sdlc-cli` | Python |
|
|
12
|
+
| **Homebrew** | `brew install mdferdousalam/tap/agentic-sdlc` | macOS/Linux |
|
|
13
|
+
| **Codex plugin** | `codex plugin marketplace add mdferdousalam/agentic-sdlc` then `codex plugin add agentic-sdlc@agentic-sdlc` | Codex CLI |
|
|
14
|
+
| **Gemini extension** | `gemini extensions install https://github.com/mdferdousalam/agentic-sdlc` | Gemini CLI |
|
|
15
|
+
| **Git clone** | `git clone … && agentic-sdlc/bin/sdlc install` | git |
|
|
16
|
+
|
|
17
|
+
Then, in the repository you work in:
|
|
18
|
+
|
|
19
|
+
```sh
|
|
20
|
+
sdlc install # detect your agents, set each one up, add the git hooks
|
|
21
|
+
sdlc doctor # what is configured, what is missing, and the command for each gap
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## A note on the Codex plugin route
|
|
25
|
+
|
|
26
|
+
Installing the Codex plugin brings its `PreToolUse` hook with it, but **Codex will not run a
|
|
27
|
+
plugin's hook until you trust it**. On your next interactive session Codex shows the hook for
|
|
28
|
+
review; trust it once and enforcement is live. Verified: untrusted, only `Stop` fires and a
|
|
29
|
+
`git stash` goes through; trusted, the same command is refused.
|
|
30
|
+
|
|
31
|
+
If you would rather not deal with the review prompt, `sdlc install codex` writes the hook into
|
|
32
|
+
your own `~/.codex/hooks.json` instead, which Codex treats as already trusted because it is
|
|
33
|
+
your configuration. That path is verified working, including the receipt-dependent push gate.
|
|
34
|
+
|
|
35
|
+
Never pass `--dangerously-bypass-hook-trust` as a workaround. It disables review for *every*
|
|
36
|
+
hook in the session, not just this one.
|
|
37
|
+
|
|
38
|
+
## A note on `curl | sh`
|
|
39
|
+
|
|
40
|
+
Piping a script from the internet into a shell is a real risk and you should not take anyone's
|
|
41
|
+
word for it. [`install.sh`](../install.sh) is about sixty lines, and it downloads a release
|
|
42
|
+
into `~/.agentic-sdlc`, links `sdlc` into a bin directory already on your `PATH`, and touches
|
|
43
|
+
nothing in your repository. No sudo. Read it first if you prefer:
|
|
44
|
+
|
|
45
|
+
```sh
|
|
46
|
+
curl -fsSL https://raw.githubusercontent.com/mdferdousalam/agentic-sdlc/main/install.sh -o install.sh
|
|
47
|
+
less install.sh && sh install.sh
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Pin a version with `AGENTIC_SDLC_VERSION=v2.2.0`, or relocate it with `AGENTIC_SDLC_HOME`.
|
|
51
|
+
|
|
52
|
+
## Uninstalling
|
|
53
|
+
|
|
54
|
+
```sh
|
|
55
|
+
sdlc uninstall # remove our blocks and the files we own from this repository
|
|
56
|
+
rm -rf ~/.agentic-sdlc # shell install
|
|
57
|
+
npm rm -g @mdferdousalam/agentic-sdlc
|
|
58
|
+
pipx uninstall agentic-sdlc-cli
|
|
59
|
+
brew uninstall agentic-sdlc
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
`sdlc uninstall` removes only our marked blocks and the files we own. Your `AGENTS.md`,
|
|
63
|
+
Copilot instructions and existing git hooks keep everything that was yours.
|
|
64
|
+
|
|
65
|
+
## Maintainer: cutting a release
|
|
66
|
+
|
|
67
|
+
```sh
|
|
68
|
+
packaging/build-pypi.sh --check # builds dist/, installs the wheel in a venv, runs it
|
|
69
|
+
python3 -m twine upload dist/* # PyPI
|
|
70
|
+
npm publish --access public # npm
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Then bump `url`, `version` and `sha256` in `packaging/homebrew/agentic-sdlc.rb`
|
|
74
|
+
(`curl -fsSL <url> | shasum -a 256`) and copy it into the tap. `package.json` and
|
|
75
|
+
`.claude-plugin/plugin.json` must agree on the version — CI checks that.
|
package/docs/maturity.md
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
# The four levels, and how to configure each one
|
|
2
|
+
|
|
3
|
+
Adopting this pipeline is not a switch. The industry framing that holds up best describes the
|
|
4
|
+
human's role changing as a platform matures — from executor, to validator, to orchestrator, to
|
|
5
|
+
constraint-setter. The stages do not disappear; what changes is who initiates them and what
|
|
6
|
+
governs the handoff.
|
|
7
|
+
|
|
8
|
+
Here that is not an abstraction: each level is a configuration. Start at the level that matches
|
|
9
|
+
the trust you actually have, and move up when the metrics say you have earned it.
|
|
10
|
+
|
|
11
|
+
## Level 1 — the human executes, agents assist
|
|
12
|
+
|
|
13
|
+
You direct the work and approve each step. The pipeline runs, but you are inside every stage.
|
|
14
|
+
|
|
15
|
+
```jsonc
|
|
16
|
+
{ "approvals": { "merge": "human", "release": "human" },
|
|
17
|
+
"enforce": { "pushToTrunkNeedsGate": true, "mergeNeedsReadiness": true,
|
|
18
|
+
"branchNeedsApprovedSpec": false } }
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Specifications are optional here; the refusals that protect your working tree are not. Use
|
|
22
|
+
`/agentic-sdlc:feature` by hand, read every diff.
|
|
23
|
+
|
|
24
|
+
**Move up when:** you stop finding surprises in the diffs.
|
|
25
|
+
|
|
26
|
+
## Level 2 — the human validates
|
|
27
|
+
|
|
28
|
+
Agents produce whole units of work; you verify behaviour rather than inspect every line. This
|
|
29
|
+
is where the pipeline starts to pay for itself, and where most teams should sit.
|
|
30
|
+
|
|
31
|
+
```jsonc
|
|
32
|
+
{ "approvals": { "merge": "human", "release": "human" },
|
|
33
|
+
"enforce": { "branchNeedsApprovedSpec": true, "mergeNeedsReadiness": true },
|
|
34
|
+
"reviewers": ["sdlc-code-reviewer", "sdlc-security-reviewer"],
|
|
35
|
+
"quality": { "cmd": "<your static analysis>", "coverageNewPct": 80 } }
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
The specification becomes mandatory, because at this level an unclear intent does not slow
|
|
39
|
+
someone down — it produces a confident, wrong pull request. Validation becomes a loop:
|
|
40
|
+
candidate → gate → failure routed back as enriched context → retry. `sdlc feedback` is what
|
|
41
|
+
makes the retry smarter than the attempt before it.
|
|
42
|
+
|
|
43
|
+
**Move up when:** `sdlc metrics` shows the gate passing first-time more often than not, and the
|
|
44
|
+
refusals that fire are near-misses rather than workflow problems.
|
|
45
|
+
|
|
46
|
+
## Level 3 — the human orchestrates
|
|
47
|
+
|
|
48
|
+
Agents run long tasks unattended. Work arrives from signals — a failing dependency check, an
|
|
49
|
+
advisory, a pattern in production telemetry — through `/agentic-sdlc:triage`. You set the rules
|
|
50
|
+
and review the exceptions.
|
|
51
|
+
|
|
52
|
+
```jsonc
|
|
53
|
+
{ "approvals": { "merge": "agent", "release": "human" },
|
|
54
|
+
"enforce": { "branchNeedsApprovedSpec": true, "mergeNeedsReadiness": true },
|
|
55
|
+
"release": { "deployCmd": "...", "smokeCmd": "...", "rollbackCmd": "...",
|
|
56
|
+
"environments": ["staging", "production"] } }
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Merging becomes rule-based for work that passed every gate; **deployment stays human**. The
|
|
60
|
+
constraint stops being review bandwidth and becomes the quality of your gates: at this level
|
|
61
|
+
the readiness gate is the only thing between an agent and your trunk, so a gate that does not
|
|
62
|
+
really check is now a direct risk rather than a missed opportunity.
|
|
63
|
+
|
|
64
|
+
**Move up when:** your post-deploy evidence is good enough that you would trust a rollback
|
|
65
|
+
decision made without you. Most teams should not.
|
|
66
|
+
|
|
67
|
+
## Level 4 — the human sets constraints
|
|
68
|
+
|
|
69
|
+
Paths run from signals without a human trigger, inside boundaries you defined. This is a
|
|
70
|
+
horizon, not a destination to rush: it requires evaluation infrastructure, workspace isolation,
|
|
71
|
+
cost governance and incident response that most organisations have not built. This plugin gives
|
|
72
|
+
you the gates and the audit trail; it does not give you those.
|
|
73
|
+
|
|
74
|
+
Be honest about where you are. Running at level 3 with level 1 gates is not maturity, it is
|
|
75
|
+
unmanaged risk with better vocabulary.
|
|
76
|
+
|
|
77
|
+
## What this still does not give you
|
|
78
|
+
|
|
79
|
+
Being specific about the gaps is part of the tool. Each of these is real, each is named in the
|
|
80
|
+
research this pipeline is built from, and none of them can be honestly claimed by a package of
|
|
81
|
+
markdown and one dependency-free script.
|
|
82
|
+
|
|
83
|
+
**Detection precision and recall.** `sdlc metrics` reports what the pipeline *did*, never how
|
|
84
|
+
much it *missed*. Precision and recall need a corpus of seeded defects with known answers, and
|
|
85
|
+
no repository has that about itself. If you need the numbers: take a tagged commit, inject a
|
|
86
|
+
set of defects you choose — an off-by-one, a missing authorization check, an unbounded
|
|
87
|
+
collection, a race — run the pipeline against each, and count what it found and what it
|
|
88
|
+
invented. Run it again when you change a prompt. Without that, "the reviewers are good" is an
|
|
89
|
+
impression.
|
|
90
|
+
|
|
91
|
+
**Runtime evidence.** Profiling, allocation tracing, race detection under load, fuzzing,
|
|
92
|
+
mutation testing and fault injection all need to *run* the system under conditions this tool
|
|
93
|
+
does not create. The concern profiles name the tool for each and point at the `quality.cmd`
|
|
94
|
+
seam; putting one there is what turns a `medium`-confidence reading into a `high`-confidence
|
|
95
|
+
measurement. Until you do, `PERF-*`, `MEM-*` and `CONC-*` findings are careful opinions.
|
|
96
|
+
|
|
97
|
+
**Token and money accounting.** `budget` counts tool calls and wall-clock because those are
|
|
98
|
+
observable from inside a repository. It cannot see your host's token meter. A ceiling that
|
|
99
|
+
stops the work is worth more than a number that describes the overspend afterwards, but it is
|
|
100
|
+
not the same thing as cost control, and this does not pretend otherwise.
|
|
101
|
+
|
|
102
|
+
**Workspace isolation at scale.** `git worktree` separates two tasks. It does not sandbox an
|
|
103
|
+
agent's filesystem or network, and the hook is not a security boundary against a process that
|
|
104
|
+
simply does not call it. See `docs/compliance.md`.
|
|
105
|
+
|
|
106
|
+
**Anything outside the repository.** Incident response, on-call, vendor risk, organisational
|
|
107
|
+
policy, training, and the people who have to live with a bad deploy.
|
|
108
|
+
|
|
109
|
+
## What to watch as you climb
|
|
110
|
+
|
|
111
|
+
```sh
|
|
112
|
+
sdlc metrics --since 2026-01-01
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
- **First-pass gate rate rising** → the specifications are getting clearer.
|
|
116
|
+
- **First-pass rate at 100%** → your gate is not checking anything. That is a finding.
|
|
117
|
+
- **The same refusal firing repeatedly** → a workflow problem, not a near-miss. Fix the
|
|
118
|
+
workflow, do not relax the rule.
|
|
119
|
+
- **Blocking findings rising while velocity rises** → the verification debt the research warns
|
|
120
|
+
about. Slow down before it compounds.
|
|
121
|
+
- **`unexecuted` findings accumulating** → fixes are being declared without being proved. This
|
|
122
|
+
is the number that quietly becomes a lie, because every one of them *looks* closed.
|
|
123
|
+
- **False-fix rate above zero** → work is coming back after being closed `fixed`. One is
|
|
124
|
+
normal; a trend means the verification step is not verifying.
|
|
125
|
+
- **Reproducible share falling** → findings are increasingly claims rather than observations,
|
|
126
|
+
and the repair policy will escalate more of them. That is the policy working, and a sign the
|
|
127
|
+
reviewers need a deterministic tool rather than more prompt.
|
|
128
|
+
- **`sdlc tests audit` firing often** → the gate is being treated as an obstacle rather than a
|
|
129
|
+
standard. Find out why before raising the threshold back.
|
package/docs/opencode.md
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Using the pipeline with opencode
|
|
2
|
+
|
|
3
|
+
[opencode](https://opencode.ai) has agents, commands and plugins, but no plugin marketplace, so
|
|
4
|
+
the same pipeline is installed by copying it in:
|
|
5
|
+
|
|
6
|
+
```sh
|
|
7
|
+
bin/sdlc-install-opencode # ~/.config/opencode by default
|
|
8
|
+
opencode reload # a stale background server shows none of it
|
|
9
|
+
sdlc doctor # in the repository you will work in
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
Options: `--prefix <dir>`, `--model <provider/model>` (pin every agent to one model),
|
|
13
|
+
`--dry-run`.
|
|
14
|
+
|
|
15
|
+
## What the installer changes, and why
|
|
16
|
+
|
|
17
|
+
| Claude Code | opencode |
|
|
18
|
+
| --- | --- |
|
|
19
|
+
| `tools: [Read, Bash, Grep]` in frontmatter | `permission: { edit: deny, bash: allow }` |
|
|
20
|
+
| `${CLAUDE_PLUGIN_ROOT}` | this checkout's absolute path |
|
|
21
|
+
| `hooks/hooks.json` → `PreToolUse` | `plugins/agentic-sdlc.ts` → `tool.execute.before` and `shell.create.before` |
|
|
22
|
+
| `/agentic-sdlc:land` | `/sdlc-land` |
|
|
23
|
+
|
|
24
|
+
An agent whose Claude Code frontmatter lists no writing tool becomes `edit: deny` — so the
|
|
25
|
+
reviewers and the gate genuinely cannot edit, which in opencode is enforced by the host rather
|
|
26
|
+
than by the agent's good intentions.
|
|
27
|
+
|
|
28
|
+
## One rule set, two hosts
|
|
29
|
+
|
|
30
|
+
Both hosts call the same `bin/sdlc guard` with the same JSON and treat exit code 2 as a block.
|
|
31
|
+
There is one place to fix a rule and no way for the two to drift. If the guard cannot run at
|
|
32
|
+
all, it stays silent rather than taking the session down — enforcement that breaks your editor
|
|
33
|
+
gets uninstalled, and then you have none.
|
|
34
|
+
|
|
35
|
+
## Re-running
|
|
36
|
+
|
|
37
|
+
Re-run the installer after pulling a new version. It overwrites only the files it owns:
|
|
38
|
+
`agents/sdlc-*.md`, `commands/sdlc-*.md`, `plugins/agentic-sdlc.ts`.
|
|
39
|
+
|
|
40
|
+
## With free or small models
|
|
41
|
+
|
|
42
|
+
The pipeline was built partly for this case. Small models are not careless so much as
|
|
43
|
+
forgetful: they skip a stage, not out of malice but because nothing stopped them. Receipts and
|
|
44
|
+
the hook are exactly that stop. Pin the bigger model you have to the reviewers and the gate
|
|
45
|
+
(`reviewers` in the config, `--model` at install) and let a cheaper one implement.
|
package/docs/openspec.md
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# OpenSpec integration
|
|
2
|
+
|
|
3
|
+
[OpenSpec](https://github.com/Fission-AI/OpenSpec) is spec-driven change governance: proposals,
|
|
4
|
+
designs, task lists and delta specs in a layout tools can read. This pipeline uses it as the
|
|
5
|
+
specification engine whenever it is present, because three of its properties are things a
|
|
6
|
+
pipeline needs and prose cannot give.
|
|
7
|
+
|
|
8
|
+
## Why it earns its place here
|
|
9
|
+
|
|
10
|
+
**A validator.** `openspec validate <id> --strict --json` fails on a malformed
|
|
11
|
+
specification. The spec reviewer runs it first and quotes the failure, so "changes-requested"
|
|
12
|
+
is sometimes a machine's verdict rather than a model's opinion.
|
|
13
|
+
|
|
14
|
+
**A task list that is the acceptance criteria.** `tasks.md` is one checklist item per
|
|
15
|
+
deliverable. The implementer ticks each in the commit that did it; the verifier maps each to
|
|
16
|
+
`file:line` and a test outcome; the readiness gate treats a ticked unfinished item as a blocker.
|
|
17
|
+
Progress stops being a feeling.
|
|
18
|
+
|
|
19
|
+
**An archive.** `openspec archive <id>` moves a landed change out of the active list, so
|
|
20
|
+
`openspec list` keeps describing reality rather than accumulating finished work.
|
|
21
|
+
|
|
22
|
+
## Setup
|
|
23
|
+
|
|
24
|
+
```sh
|
|
25
|
+
npm install -g @fission-ai/openspec # or your package manager of choice
|
|
26
|
+
openspec init # once per repository
|
|
27
|
+
/agentic-sdlc:init --write # detects openspec and sets spec.engine
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## The mapping
|
|
31
|
+
|
|
32
|
+
| Pipeline idea | OpenSpec artefact |
|
|
33
|
+
| --- | --- |
|
|
34
|
+
| Why this work exists | `openspec/changes/<id>/proposal.md` |
|
|
35
|
+
| What was chosen, over what | `<id>/design.md` |
|
|
36
|
+
| Acceptance criteria | `<id>/tasks.md` |
|
|
37
|
+
| Requirements on a published capability | `<id>/specs/<capability>/spec.md` |
|
|
38
|
+
| Well-formed | `openspec validate <id> --strict` |
|
|
39
|
+
| Done | every task ticked, in the commit that did it |
|
|
40
|
+
| History | `openspec archive <id>` |
|
|
41
|
+
|
|
42
|
+
## Writing `tasks.md` so the rest works
|
|
43
|
+
|
|
44
|
+
Each item must be one deliverable with an observable outcome.
|
|
45
|
+
|
|
46
|
+
> ✗ Wire up the parser
|
|
47
|
+
> ✓ `parse()` refuses an unterminated string with `E0012`, naming line and column, with a test
|
|
48
|
+
|
|
49
|
+
The first cannot be verified, so the verifier will mark it `unexecuted` and the gate will block.
|
|
50
|
+
The second tells the implementer what to build, the test author what to assert, and the verifier
|
|
51
|
+
what to look for.
|
|
52
|
+
|
|
53
|
+
## Without OpenSpec
|
|
54
|
+
|
|
55
|
+
`spec.engine` falls back to `prd-frd`: a PRD (what and why) and an FRD with numbered `FR-n` and
|
|
56
|
+
`AC-n`. Everything downstream behaves identically — the verifier addresses requirements by
|
|
57
|
+
identifier either way. Adopt OpenSpec when you want the validator and the archive; the pipeline
|
|
58
|
+
does not require it.
|