@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.
Files changed (90) hide show
  1. package/.claude-plugin/marketplace.json +11 -0
  2. package/.claude-plugin/plugin.json +31 -0
  3. package/CHANGELOG.md +330 -0
  4. package/GETTING-STARTED.md +174 -0
  5. package/LICENSE +21 -0
  6. package/README.md +268 -2
  7. package/SECURITY.md +25 -0
  8. package/agents/sdlc-architecture-reviewer.md +71 -0
  9. package/agents/sdlc-branch-opener.md +83 -0
  10. package/agents/sdlc-code-reviewer.md +62 -0
  11. package/agents/sdlc-impact-analyst.md +70 -0
  12. package/agents/sdlc-implementer.md +60 -0
  13. package/agents/sdlc-lander.md +40 -0
  14. package/agents/sdlc-readiness-gate.md +128 -0
  15. package/agents/sdlc-release-manager.md +76 -0
  16. package/agents/sdlc-remediator.md +89 -0
  17. package/agents/sdlc-reporter.md +42 -0
  18. package/agents/sdlc-security-reviewer.md +62 -0
  19. package/agents/sdlc-spec-reviewer.md +56 -0
  20. package/agents/sdlc-spec-writer.md +62 -0
  21. package/agents/sdlc-test-author.md +32 -0
  22. package/agents/sdlc-triager.md +48 -0
  23. package/agents/sdlc-verifier.md +69 -0
  24. package/bin/__pycache__/sdlccpython-315.pyc +0 -0
  25. package/bin/sdlc +2747 -0
  26. package/bin/sdlc-install-opencode +10 -0
  27. package/commands/doctor.md +9 -0
  28. package/commands/feature.md +17 -0
  29. package/commands/gate.md +33 -0
  30. package/commands/impact.md +13 -0
  31. package/commands/implement.md +11 -0
  32. package/commands/init.md +15 -0
  33. package/commands/land.md +10 -0
  34. package/commands/metrics.md +12 -0
  35. package/commands/readiness.md +8 -0
  36. package/commands/release.md +16 -0
  37. package/commands/remediate.md +13 -0
  38. package/commands/report.md +11 -0
  39. package/commands/review.md +12 -0
  40. package/commands/status.md +9 -0
  41. package/commands/trace.md +9 -0
  42. package/commands/triage.md +14 -0
  43. package/commands/verify.md +10 -0
  44. package/docs/compliance.md +70 -0
  45. package/docs/configuration.md +106 -0
  46. package/docs/control-spec.md +269 -0
  47. package/docs/install.md +75 -0
  48. package/docs/maturity.md +129 -0
  49. package/docs/opencode.md +45 -0
  50. package/docs/openspec.md +58 -0
  51. package/docs/pipeline.md +160 -0
  52. package/docs/platforms.md +99 -0
  53. package/docs/rules.md +122 -0
  54. package/evals/baseline-attributes-failure/graders/criteria.md +18 -0
  55. package/evals/baseline-attributes-failure/prompt.md +23 -0
  56. package/evals/budget-stops-rather-than-asks/graders/criteria.md +19 -0
  57. package/evals/budget-stops-rather-than-asks/prompt.md +14 -0
  58. package/evals/critical-low-confidence-escalates/graders/criteria.md +22 -0
  59. package/evals/critical-low-confidence-escalates/prompt.md +17 -0
  60. package/evals/gate-refuses-unexecuted/graders/criteria.md +16 -0
  61. package/evals/gate-refuses-unexecuted/prompt.md +15 -0
  62. package/evals/refusal-is-not-negotiated/graders/criteria.md +17 -0
  63. package/evals/refusal-is-not-negotiated/prompt.md +7 -0
  64. package/evals/release-needs-rollback-and-approval/graders/criteria.md +15 -0
  65. package/evals/release-needs-rollback-and-approval/prompt.md +6 -0
  66. package/evals/remediator-refuses-weakened-test/graders/criteria.md +20 -0
  67. package/evals/remediator-refuses-weakened-test/prompt.md +33 -0
  68. package/evals/spec-review-catches-unfalsifiable/graders/criteria.md +17 -0
  69. package/evals/spec-review-catches-unfalsifiable/prompt.md +17 -0
  70. package/examples/worked-example.md +131 -0
  71. package/hooks/hooks.json +16 -0
  72. package/npm/cli.js +35 -0
  73. package/opencode/plugin/agentic-sdlc.ts +52 -0
  74. package/package.json +59 -4
  75. package/profiles/README.md +52 -0
  76. package/profiles/compiler.md +33 -0
  77. package/profiles/concerns/architecture.md +50 -0
  78. package/profiles/concerns/concurrency.md +59 -0
  79. package/profiles/concerns/data.md +62 -0
  80. package/profiles/concerns/memory.md +52 -0
  81. package/profiles/concerns/performance.md +54 -0
  82. package/profiles/concerns/platform.md +62 -0
  83. package/profiles/library.md +31 -0
  84. package/profiles/service.md +32 -0
  85. package/profiles/webapp.md +40 -0
  86. package/schema/finding.schema.json +267 -0
  87. package/schema/sdlc.config.schema.json +324 -0
  88. package/skills/agentic-sdlc-pipeline/SKILL.md +66 -0
  89. package/skills/openspec-with-sdlc/SKILL.md +56 -0
  90. 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.
@@ -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.
@@ -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.
@@ -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.
@@ -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.