@rasensio/aidlc-content 1.15.2 → 1.17.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/package.json +2 -1
- package/packs/soc2/controls.yaml +261 -0
- package/packs/soc2/guidance/soc2-constraints.md +69 -0
- package/packs/soc2/pack.yaml +25 -0
- package/skills/00-overview.md +8 -0
- package/skills/04-roadmap.md +2 -0
- package/skills/05-constitution.md +186 -0
- package/skills/10-ideation.md +1 -1
- package/skills/20-requirements.md +1 -1
- package/skills/30-design.md +11 -8
- package/skills/40-implementation.md +1 -1
- package/skills/60-deployment.md +6 -5
- package/skills/70-maintenance.md +7 -6
- package/skills/80-review.md +48 -3
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rasensio/aidlc-content",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.17.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
"skills/",
|
|
17
17
|
"templates/",
|
|
18
18
|
"guidance/",
|
|
19
|
+
"packs/",
|
|
19
20
|
"capabilities/",
|
|
20
21
|
"phases/",
|
|
21
22
|
"tutorials/",
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
# SOC 2 Trust Services Criteria — the Common Criteria only.
|
|
2
|
+
#
|
|
3
|
+
# `kind` says what the AIDLC artifact trail can establish:
|
|
4
|
+
#
|
|
5
|
+
# evidenced the trail genuinely demonstrates the control
|
|
6
|
+
# checked-only the control operates over a running system, so no document
|
|
7
|
+
# evidences it; the pack supplies a fail condition an agent
|
|
8
|
+
# applies, and the trail records only that the check happened
|
|
9
|
+
#
|
|
10
|
+
# `check_kind` says who applies the fail condition: `mechanical` controls carry a
|
|
11
|
+
# pattern the diff check evaluates itself, `agent` controls need a review session.
|
|
12
|
+
#
|
|
13
|
+
# Exactly one control is `evidenced`. Six are `checked-only`. Twenty-six Common
|
|
14
|
+
# Criteria points are not covered at all, each listed below with its reason.
|
|
15
|
+
#
|
|
16
|
+
# `references` points at the guidance layer whose rule a control restates, so the
|
|
17
|
+
# duplication is traceable and a later edit to that layer can be found. The pack's
|
|
18
|
+
# own constraint layer does not restate those rules.
|
|
19
|
+
|
|
20
|
+
controls:
|
|
21
|
+
# -------------------------------------------------------------------------
|
|
22
|
+
# Evidenced: the lifecycle trail is real evidence for this control.
|
|
23
|
+
# -------------------------------------------------------------------------
|
|
24
|
+
- id: CC8.1
|
|
25
|
+
kind: evidenced
|
|
26
|
+
check_kind: agent
|
|
27
|
+
severity: critical
|
|
28
|
+
phases:
|
|
29
|
+
- requirements
|
|
30
|
+
- design
|
|
31
|
+
- implementation
|
|
32
|
+
- testing
|
|
33
|
+
- deployment
|
|
34
|
+
requires: >-
|
|
35
|
+
The entity authorizes, designs, develops, configures, documents, tests,
|
|
36
|
+
approves and implements changes to infrastructure, data, software and
|
|
37
|
+
procedures to meet its objectives.
|
|
38
|
+
look_at: >-
|
|
39
|
+
requirements.md for numbered acceptance criteria; design.md for the design
|
|
40
|
+
the change was built to; tasks.md for the link from each task to the criteria
|
|
41
|
+
it satisfies; the review findings files; transitions.log for the recorded
|
|
42
|
+
phase progression; and deployment-record.md for the release.
|
|
43
|
+
fails_when: >-
|
|
44
|
+
A change reached deployment without an artifact recording each of
|
|
45
|
+
authorization, design, test and approval — that is, any of requirements.md,
|
|
46
|
+
design.md, a completed review findings file, test-results.md or
|
|
47
|
+
deployment-record.md is absent or names no outcome for the change.
|
|
48
|
+
evidence_artifact: design.md
|
|
49
|
+
|
|
50
|
+
# -------------------------------------------------------------------------
|
|
51
|
+
# Checked-only: these operate over a running system. The pack gives you a fail
|
|
52
|
+
# condition to apply; the trail records that you applied it, never that the
|
|
53
|
+
# control operates.
|
|
54
|
+
# -------------------------------------------------------------------------
|
|
55
|
+
- id: CC6.1
|
|
56
|
+
kind: checked-only
|
|
57
|
+
check_kind: agent
|
|
58
|
+
severity: critical
|
|
59
|
+
phases:
|
|
60
|
+
- design
|
|
61
|
+
- implementation
|
|
62
|
+
requires: >-
|
|
63
|
+
The entity implements logical access security software, infrastructure and
|
|
64
|
+
architectures over protected information assets to meet its objectives.
|
|
65
|
+
look_at: >-
|
|
66
|
+
Request handlers and data-access code in the change: where authorization is
|
|
67
|
+
decided, and whether any read or write of a protected record can be reached
|
|
68
|
+
without that decision. Also any credential handling.
|
|
69
|
+
fails_when: >-
|
|
70
|
+
A code path reads or writes a protected record without an authorization check
|
|
71
|
+
on the same path, or a credential, key or token appears in source.
|
|
72
|
+
references: secure-defaults#authentication-and-authorization
|
|
73
|
+
|
|
74
|
+
- id: CC6.6
|
|
75
|
+
kind: checked-only
|
|
76
|
+
check_kind: agent
|
|
77
|
+
severity: major
|
|
78
|
+
phases:
|
|
79
|
+
- design
|
|
80
|
+
- implementation
|
|
81
|
+
requires: >-
|
|
82
|
+
The entity implements logical access security measures to protect against
|
|
83
|
+
threats from sources outside its system boundaries.
|
|
84
|
+
look_at: >-
|
|
85
|
+
Every place external input crosses into the system in this change: HTTP
|
|
86
|
+
handlers, message consumers, file uploads, and any parser reached from them.
|
|
87
|
+
fails_when: >-
|
|
88
|
+
External input reaches a parser, query, filesystem path or command without
|
|
89
|
+
validation at the boundary, or an authentication endpoint has no rate limit.
|
|
90
|
+
references: secure-defaults#input-validation
|
|
91
|
+
|
|
92
|
+
- id: CC6.7
|
|
93
|
+
kind: checked-only
|
|
94
|
+
check_kind: mechanical
|
|
95
|
+
severity: major
|
|
96
|
+
phases:
|
|
97
|
+
- implementation
|
|
98
|
+
- deployment
|
|
99
|
+
requires: >-
|
|
100
|
+
The entity restricts the transmission, movement and removal of information to
|
|
101
|
+
authorized internal and external users and processes, and protects it during
|
|
102
|
+
transmission, movement or removal.
|
|
103
|
+
look_at: Network client configuration and request targets in the change.
|
|
104
|
+
fails_when: >-
|
|
105
|
+
An added line targets a plain-HTTP URL, so protected information could be
|
|
106
|
+
transmitted without transport encryption.
|
|
107
|
+
pattern: "http://(?!localhost|127\\.0\\.0\\.1|\\[::1\\])"
|
|
108
|
+
references: secure-defaults#transport-and-data-protection
|
|
109
|
+
|
|
110
|
+
- id: CC6.8
|
|
111
|
+
kind: checked-only
|
|
112
|
+
check_kind: agent
|
|
113
|
+
severity: major
|
|
114
|
+
phases:
|
|
115
|
+
- implementation
|
|
116
|
+
- deployment
|
|
117
|
+
requires: >-
|
|
118
|
+
The entity implements controls to prevent or detect and act upon the
|
|
119
|
+
introduction of unauthorized or malicious software.
|
|
120
|
+
look_at: >-
|
|
121
|
+
Dependency manifests and lockfiles in the change, and any script that fetches
|
|
122
|
+
and executes code at build or run time.
|
|
123
|
+
fails_when: >-
|
|
124
|
+
A dependency is added without a lockfile entry, a dependency range is
|
|
125
|
+
unpinned, or a script pipes a downloaded payload straight into a shell.
|
|
126
|
+
references: secure-defaults#dependency-security
|
|
127
|
+
|
|
128
|
+
- id: CC7.1
|
|
129
|
+
kind: checked-only
|
|
130
|
+
check_kind: agent
|
|
131
|
+
severity: major
|
|
132
|
+
phases:
|
|
133
|
+
- implementation
|
|
134
|
+
- deployment
|
|
135
|
+
requires: >-
|
|
136
|
+
The entity uses detection and monitoring procedures to identify changes to
|
|
137
|
+
configurations that result in the introduction of new vulnerabilities, and
|
|
138
|
+
susceptibilities to newly discovered vulnerabilities.
|
|
139
|
+
look_at: >-
|
|
140
|
+
Configuration and infrastructure changes in the diff, and whether a
|
|
141
|
+
vulnerability audit runs over the dependency set.
|
|
142
|
+
fails_when: >-
|
|
143
|
+
A configuration change relaxes a security setting with no stated reason, or the
|
|
144
|
+
project has no dependency vulnerability audit in its build or CI.
|
|
145
|
+
references: secure-defaults#dependency-security
|
|
146
|
+
|
|
147
|
+
- id: CC7.2
|
|
148
|
+
kind: checked-only
|
|
149
|
+
check_kind: agent
|
|
150
|
+
severity: major
|
|
151
|
+
phases:
|
|
152
|
+
- implementation
|
|
153
|
+
- deployment
|
|
154
|
+
- maintenance
|
|
155
|
+
requires: >-
|
|
156
|
+
The entity monitors system components and the operation of those components
|
|
157
|
+
for anomalies indicative of malicious acts, natural disasters and errors
|
|
158
|
+
affecting the entity's ability to meet its objectives.
|
|
159
|
+
look_at: >-
|
|
160
|
+
Error handling and logging in the change: whether failures are recorded with
|
|
161
|
+
enough context to notice an anomaly, and whether anything sensitive is logged.
|
|
162
|
+
fails_when: >-
|
|
163
|
+
A failure path swallows an error without logging it, a log statement records a
|
|
164
|
+
secret or personal data, or a user-facing error exposes a stack trace or
|
|
165
|
+
internal path.
|
|
166
|
+
references: secure-defaults#error-handling-and-logging
|
|
167
|
+
|
|
168
|
+
# ---------------------------------------------------------------------------
|
|
169
|
+
# Not covered. Twenty-six of the thirty-three Common Criteria points.
|
|
170
|
+
#
|
|
171
|
+
# organizational the control is about the entity's governance, people or
|
|
172
|
+
# processes; a tool that reads code cannot speak to it
|
|
173
|
+
# not-yet-built a code lifecycle could say something here, and this pack does
|
|
174
|
+
# not yet
|
|
175
|
+
# ---------------------------------------------------------------------------
|
|
176
|
+
excluded:
|
|
177
|
+
# CC1 — control environment. Board oversight, integrity and ethics, competence.
|
|
178
|
+
- id: CC1.1
|
|
179
|
+
reason: organizational
|
|
180
|
+
- id: CC1.2
|
|
181
|
+
reason: organizational
|
|
182
|
+
- id: CC1.3
|
|
183
|
+
reason: organizational
|
|
184
|
+
- id: CC1.4
|
|
185
|
+
reason: organizational
|
|
186
|
+
- id: CC1.5
|
|
187
|
+
reason: organizational
|
|
188
|
+
|
|
189
|
+
# CC2 — communication and information.
|
|
190
|
+
- id: CC2.1
|
|
191
|
+
reason: organizational
|
|
192
|
+
- id: CC2.2
|
|
193
|
+
reason: organizational
|
|
194
|
+
- id: CC2.3
|
|
195
|
+
reason: organizational
|
|
196
|
+
|
|
197
|
+
# CC3 — risk assessment.
|
|
198
|
+
- id: CC3.1
|
|
199
|
+
reason: organizational
|
|
200
|
+
- id: CC3.2
|
|
201
|
+
reason: organizational
|
|
202
|
+
- id: CC3.3
|
|
203
|
+
reason: organizational
|
|
204
|
+
- id: CC3.4
|
|
205
|
+
reason: organizational
|
|
206
|
+
|
|
207
|
+
# CC4 — monitoring activities.
|
|
208
|
+
- id: CC4.1
|
|
209
|
+
reason: organizational
|
|
210
|
+
- id: CC4.2
|
|
211
|
+
reason: organizational
|
|
212
|
+
|
|
213
|
+
# CC5 — control activities.
|
|
214
|
+
- id: CC5.1
|
|
215
|
+
reason: organizational
|
|
216
|
+
- id: CC5.2
|
|
217
|
+
reason: organizational
|
|
218
|
+
- id: CC5.3
|
|
219
|
+
reason: organizational
|
|
220
|
+
|
|
221
|
+
# CC6 — the access-management points, as distinct from the code-facing ones above.
|
|
222
|
+
- id: CC6.2
|
|
223
|
+
reason: organizational
|
|
224
|
+
note: >-
|
|
225
|
+
Registering and authorizing new users is the entity's access-management
|
|
226
|
+
process. An application's provisioning code is not the control.
|
|
227
|
+
- id: CC6.3
|
|
228
|
+
reason: organizational
|
|
229
|
+
note: >-
|
|
230
|
+
Removing access is the entity's process. Deprovisioning code in an
|
|
231
|
+
application is not the control.
|
|
232
|
+
- id: CC6.4
|
|
233
|
+
reason: organizational
|
|
234
|
+
note: Physical access to facilities is outside a code tool's reach entirely.
|
|
235
|
+
- id: CC6.5
|
|
236
|
+
reason: organizational
|
|
237
|
+
note: Disposal of physical media is outside a code tool's reach entirely.
|
|
238
|
+
|
|
239
|
+
# CC7 — the incident-response points.
|
|
240
|
+
- id: CC7.3
|
|
241
|
+
reason: organizational
|
|
242
|
+
note: Evaluating security events is an incident-response process, not a code property.
|
|
243
|
+
- id: CC7.4
|
|
244
|
+
reason: organizational
|
|
245
|
+
note: Responding to identified security incidents is an incident-response process.
|
|
246
|
+
- id: CC7.5
|
|
247
|
+
reason: organizational
|
|
248
|
+
note: Recovering from identified security incidents is an incident-response process.
|
|
249
|
+
|
|
250
|
+
# CC9 — risk mitigation.
|
|
251
|
+
- id: CC9.1
|
|
252
|
+
reason: organizational
|
|
253
|
+
note: Mitigating business-disruption risk is a continuity programme.
|
|
254
|
+
- id: CC9.2
|
|
255
|
+
reason: not-yet-built
|
|
256
|
+
note: >-
|
|
257
|
+
Vendor and business-partner risk has a real code angle — dependency
|
|
258
|
+
inventory, lockfiles and vulnerability audit. Those rules already exist in the
|
|
259
|
+
secure-defaults guidance layer and CC6.8 checks them, but this pack does not
|
|
260
|
+
claim them as CC9.2 evidence: a dependency audit is one input to vendor risk
|
|
261
|
+
management, not the control itself.
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: soc2-constraints
|
|
3
|
+
description: SOC 2 Common Criteria constraints that apply while code is being written
|
|
4
|
+
---
|
|
5
|
+
# SOC 2 Constraints
|
|
6
|
+
|
|
7
|
+
**This pack's control text has not been reviewed by a compliance practitioner.**
|
|
8
|
+
It was written by an engineer reading the Trust Services Criteria. Treat it as a
|
|
9
|
+
working draft: useful for applying controls while you write code, not as an opinion
|
|
10
|
+
on whether your controls are adequate. Nothing here makes a project SOC 2 certified,
|
|
11
|
+
attested, or audit-ready.
|
|
12
|
+
|
|
13
|
+
## Which controls apply, and when
|
|
14
|
+
|
|
15
|
+
| Phase | Controls to have in mind |
|
|
16
|
+
|---|---|
|
|
17
|
+
| Requirements, design | CC8.1, CC6.1, CC6.6 |
|
|
18
|
+
| Implementation | CC6.1, CC6.6, CC6.7, CC6.8, CC7.1, CC7.2, CC8.1 |
|
|
19
|
+
| Testing | CC8.1 |
|
|
20
|
+
| Deployment | CC6.7, CC6.8, CC7.1, CC7.2, CC8.1 |
|
|
21
|
+
| Maintenance | CC7.2 |
|
|
22
|
+
|
|
23
|
+
Run `aidlc compliance check` for each control's exact fail condition. Apply the fail
|
|
24
|
+
condition as written rather than your reading of the criterion — that is what makes
|
|
25
|
+
two reviews of the same change agree.
|
|
26
|
+
|
|
27
|
+
## One control is evidenced. Six are only checked.
|
|
28
|
+
|
|
29
|
+
**CC8.1 is evidenced.** It is a control over the change process, and this lifecycle
|
|
30
|
+
*is* a change process, so the artifact trail demonstrates it.
|
|
31
|
+
|
|
32
|
+
**CC6.1, CC6.6, CC6.7, CC6.8, CC7.1 and CC7.2 are checked only.** They operate over
|
|
33
|
+
a running system. No document establishes that your system monitors components for
|
|
34
|
+
anomalies or restricts information in transmission — so the pack gives you a fail
|
|
35
|
+
condition to apply, and the trail records that you applied it. A report will say
|
|
36
|
+
which is which. Never present a checked-only control as evidence.
|
|
37
|
+
|
|
38
|
+
## What CC8.1 asks of you while you build
|
|
39
|
+
|
|
40
|
+
Make sure each of these leaves a record, because the record is the evidence:
|
|
41
|
+
|
|
42
|
+
- **Authorization.** `requirements.md` carries numbered acceptance criteria and the
|
|
43
|
+
change stays inside them. Work no criterion asks for is unauthorized change,
|
|
44
|
+
however small.
|
|
45
|
+
- **Design.** `design.md` exists before implementation and names what the change
|
|
46
|
+
touches.
|
|
47
|
+
- **Traceability.** Every task in `tasks.md` references the criteria it satisfies. A
|
|
48
|
+
task referencing none is a gap to state, not to hide.
|
|
49
|
+
- **Test.** Every active criterion has a referencing test.
|
|
50
|
+
- **Approval.** A completed review findings file exists for each required artifact,
|
|
51
|
+
and no critical finding is left open.
|
|
52
|
+
- **Release.** `deployment-record.md` records what shipped.
|
|
53
|
+
|
|
54
|
+
## What CC8.1 does not evidence here
|
|
55
|
+
|
|
56
|
+
The trail shows a change passed through requirements, design, review and deployment.
|
|
57
|
+
It does **not** establish that `requirements.md` and the shipped code still agree.
|
|
58
|
+
There is no reopen protocol and no impact walk, so a requirement can change after
|
|
59
|
+
design signed off and every gate still passes. Closing that gap is tracked as
|
|
60
|
+
`item-20260815-change-management`. Until it ships, do not represent this pack's CC8.1
|
|
61
|
+
output as evidence of requirement-to-code agreement.
|
|
62
|
+
|
|
63
|
+
## Security rules live in one place, not here
|
|
64
|
+
|
|
65
|
+
This pack does not restate the project's security rules. Read
|
|
66
|
+
`.aidlc/guidance/secure-defaults.md` and apply it. The six checked-only controls
|
|
67
|
+
reference its sections — authentication and authorization, input validation,
|
|
68
|
+
transport and data protection, dependency security, error handling and logging — so
|
|
69
|
+
there is exactly one place to change when a rule changes.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
id: soc2
|
|
2
|
+
regime: SOC 2
|
|
3
|
+
version: 0.2.0
|
|
4
|
+
|
|
5
|
+
# SOC 2 is a service-organization examination, not an industry standard, so it
|
|
6
|
+
# applies to any industry. The field exists so an industry-scoped regime can use
|
|
7
|
+
# it later; the wizard skips the industry level while every pack is `any`.
|
|
8
|
+
industries:
|
|
9
|
+
- any
|
|
10
|
+
|
|
11
|
+
entitlement: unrestricted
|
|
12
|
+
|
|
13
|
+
# Null on purpose. The control text in this pack was written by an engineer, not
|
|
14
|
+
# a compliance practitioner. Nulling this field obliges the constraint layer to
|
|
15
|
+
# say so, obliges every report to say so, and makes a doctor check watch for
|
|
16
|
+
# someone editing the statement out.
|
|
17
|
+
reviewed_by: null
|
|
18
|
+
|
|
19
|
+
layers:
|
|
20
|
+
- name: soc2-constraints
|
|
21
|
+
file: soc2-constraints.md
|
|
22
|
+
# Pack layers are delivered as a read-instruction whatever their size. A small
|
|
23
|
+
# layer that got inlined would put pack text inside an emitted skill, which is
|
|
24
|
+
# forbidden outright.
|
|
25
|
+
always_pointer: true
|
package/skills/00-overview.md
CHANGED
|
@@ -178,6 +178,14 @@ An instance's **completion moment** is when the last applicable phase (template
|
|
|
178
178
|
- `lessons.md` is the retrospective-fed guidance layer: historical observations from completed instances. Read it via the index like any other layer; treat entries as observations, not directives
|
|
179
179
|
- Load context relevant to the current phase; avoid re-reading unchanged files
|
|
180
180
|
|
|
181
|
+
### The constitution rule
|
|
182
|
+
|
|
183
|
+
This is the canonical statement of the rule. Other skills point here instead of restating it, so there is no second copy to drift.
|
|
184
|
+
|
|
185
|
+
When `.aidlc/context/constitution.md` exists, read it before shaping work. It records what this repo owns (`IN-<n>` entries) and what it must never do (`NOT-<n>` entries), each citing the vision statement it was derived from. **If the work in front of you crosses a prohibition, name that prohibition by its id and say plainly that it does, before going further.** The user may still choose to proceed, or to amend the constitution — but the crossing gets stated out loud at the start rather than discovered in review.
|
|
186
|
+
|
|
187
|
+
The constitution never fails a gate and never blocks a transition; its whole force is that somebody read it out at the right moment. An absent file is a normal state, not a gap to fill — it is written by the **aidlc-constitution** skill, and only a project with a vision document to import has one.
|
|
188
|
+
|
|
181
189
|
## Security
|
|
182
190
|
|
|
183
191
|
Before executing any sensitive operation (infrastructure changes, permission modifications, file deletions), you MUST:
|
package/skills/04-roadmap.md
CHANGED
|
@@ -112,6 +112,8 @@ Moving an `inbox/` item to `backlog/` means "we agree to do this". Moving it to
|
|
|
112
112
|
|
|
113
113
|
Triage is the one flow that reads into the body, and it reads **the executive summary and nothing else**. Six labelled lines per item is what makes triaging a full inbox in one sitting possible; opening whole items is what makes triage something nobody ever gets round to. Show the summary, say which way you would go and why, and let the human decide. If an item has no executive summary, write one from what the item says before asking for a decision — a decision made without one is a decision made twice.
|
|
114
114
|
|
|
115
|
+
Read `.aidlc/context/constitution.md` when it exists and apply the constitution rule in **aidlc-overview**: an item that crosses a prohibition is the clearest `hold/` there is, and naming the prohibition turns "not for us" into a reason the submitter can read.
|
|
116
|
+
|
|
115
117
|
## Promote
|
|
116
118
|
|
|
117
119
|
Promotion is where the roadmap meets the lifecycle:
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: aidlc-constitution
|
|
3
|
+
description: Turns a product vision document into the repo's constitution — what this repo is for and what it must never become — and keeps it in step when the vision is updated
|
|
4
|
+
phase: ideation
|
|
5
|
+
priority: 88
|
|
6
|
+
trigger: When the user points at a product vision document, asks what this repo is or is not allowed to do, asks to create or update a project constitution, or when the vision document has changed
|
|
7
|
+
native_mode_hint:
|
|
8
|
+
claude-code: >-
|
|
9
|
+
This skill imports a document and drafts prose for the user to correct. Do
|
|
10
|
+
not enter plan mode. Never rewrite an existing constitution from the vision
|
|
11
|
+
in one step — propose changes into the inbox and apply only what the user
|
|
12
|
+
accepts.
|
|
13
|
+
---
|
|
14
|
+
# Constitution
|
|
15
|
+
|
|
16
|
+
A product has a vision. A repo usually builds only part of it. The constitution
|
|
17
|
+
writes down which part, and — more usefully — what this repo must never grow into.
|
|
18
|
+
|
|
19
|
+
Two files, and the difference between them matters:
|
|
20
|
+
|
|
21
|
+
- `.aidlc/context/vision-source.md` — the vision document's text, extracted and
|
|
22
|
+
hashed. Machine-written, never hand-edited.
|
|
23
|
+
- `.aidlc/context/constitution.md` — what this repo owns and what it is forbidden
|
|
24
|
+
to do, each line citing the vision statement it came from. Drafted by this
|
|
25
|
+
skill, owned by the user.
|
|
26
|
+
|
|
27
|
+
The vision is imported. The constitution is a judgement about the vision, and
|
|
28
|
+
judgement is why this is a skill and not just a command.
|
|
29
|
+
|
|
30
|
+
## First run
|
|
31
|
+
|
|
32
|
+
### Step 1 — Import the vision document
|
|
33
|
+
|
|
34
|
+
Ask for the path if the user has not given one. Then:
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
aidlc constitution import <path>
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
`.docx`, `.md`, `.markdown` and `.txt` are read directly. For a PDF, a Google Doc,
|
|
41
|
+
or anything else: read it yourself, save a markdown copy next to the original, and
|
|
42
|
+
import that — the command tells you the same thing if you try.
|
|
43
|
+
|
|
44
|
+
The command prints one line per statement, each with a `V-` id derived from that
|
|
45
|
+
statement's own text. Those ids are the vocabulary for everything below.
|
|
46
|
+
|
|
47
|
+
If anything in the extracted text looks like a credential — an API key, a token, a
|
|
48
|
+
password, a connection string — say so, and do not let it reach
|
|
49
|
+
`.aidlc/context/vision-source.md`. Ask the user to remove it from the source
|
|
50
|
+
document and re-import. The snapshot is committed; the vision document may not be.
|
|
51
|
+
|
|
52
|
+
### Step 2 — Read the repo, not just the document
|
|
53
|
+
|
|
54
|
+
The vision says what the product is. Only the code says what this repo does. Read
|
|
55
|
+
`.aidlc/context/architecture.md` if it exists, then look at the top-level layout
|
|
56
|
+
and the entry points. You are deciding one thing: which slice of the vision this
|
|
57
|
+
repo carries.
|
|
58
|
+
|
|
59
|
+
### Step 3 — Draft the constitution
|
|
60
|
+
|
|
61
|
+
Write `.aidlc/context/constitution.md`:
|
|
62
|
+
|
|
63
|
+
```markdown
|
|
64
|
+
---
|
|
65
|
+
generated_by: aidlc-constitution
|
|
66
|
+
generated_at: <ISO 8601 UTC>
|
|
67
|
+
vision_source: <path as imported>
|
|
68
|
+
---
|
|
69
|
+
# Constitution — <repo or component name>
|
|
70
|
+
|
|
71
|
+
## Mandate
|
|
72
|
+
|
|
73
|
+
One paragraph, plain words: which part of the product this repo owns, and which
|
|
74
|
+
parts belong to something else.
|
|
75
|
+
|
|
76
|
+
## In scope
|
|
77
|
+
|
|
78
|
+
- IN-1 [V-a1b2c3d4]: <what this repo builds>
|
|
79
|
+
- IN-2 [V-e5f6a7b8, V-11223344]: <another>
|
|
80
|
+
|
|
81
|
+
## Prohibitions
|
|
82
|
+
|
|
83
|
+
- NOT-1 [V-99887766]: <what this repo must never do>
|
|
84
|
+
- NOT-2 [V-a1b2c3d4]: <another>
|
|
85
|
+
|
|
86
|
+
## Amendments
|
|
87
|
+
|
|
88
|
+
<empty on the first run>
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Four rules that make the file usable later:
|
|
92
|
+
|
|
93
|
+
1. **Every entry cites at least one `V-` id.** An entry with no citation is an
|
|
94
|
+
opinion someone had, and a re-run cannot tell whether the vision still supports
|
|
95
|
+
it. If you cannot find a supporting statement, that is a finding — say so and
|
|
96
|
+
leave the entry out.
|
|
97
|
+
2. **`IN-` and `NOT-` ids are assigned once.** Never renumbered, never reused. An
|
|
98
|
+
entry that no longer holds is recorded in Amendments with a date and a reason,
|
|
99
|
+
not deleted — a deleted prohibition and one that never existed look identical.
|
|
100
|
+
3. **A prohibition is a sentence someone can be shown.** "No customer PII in this
|
|
101
|
+
service" is checkable. "Keep it simple" is not.
|
|
102
|
+
4. **Derive, do not invent.** A prohibition the vision does not support is your
|
|
103
|
+
opinion wearing the document's authority.
|
|
104
|
+
|
|
105
|
+
### Step 4 — Hand it back
|
|
106
|
+
|
|
107
|
+
Show the Mandate and the Prohibitions and ask the user to correct them. They will
|
|
108
|
+
know things the document does not say. Their corrections are the point — and step
|
|
109
|
+
2 of the re-run flow exists to protect them.
|
|
110
|
+
|
|
111
|
+
## When the vision is updated
|
|
112
|
+
|
|
113
|
+
The user replaces the vision document and re-runs this skill. Never rewrite
|
|
114
|
+
`.aidlc/context/constitution.md` from the new vision in one step: a human's
|
|
115
|
+
correction to a derived line and a genuine change in the vision are
|
|
116
|
+
indistinguishable once overwritten, and if corrections do not survive nobody makes
|
|
117
|
+
them twice.
|
|
118
|
+
|
|
119
|
+
### Step 1 — Ask what moved
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
aidlc constitution check
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
It reports statement ids **added** and **removed** relative to the snapshot. An
|
|
126
|
+
edited statement appears as one of each, because ids come from content. It also
|
|
127
|
+
names every constitution entry citing a removed id — those are the entries at
|
|
128
|
+
risk, and it exits 0 either way. This is advisory. It never fails a phase.
|
|
129
|
+
|
|
130
|
+
### Step 2 — Propose, do not apply
|
|
131
|
+
|
|
132
|
+
Write a proposal to `.aidlc/inbox/constitution-update-<YYYY-MM-DD>.md`, one
|
|
133
|
+
checkbox per change, following the User Input Protocol in the overview skill:
|
|
134
|
+
|
|
135
|
+
```markdown
|
|
136
|
+
# Constitution update — <date>
|
|
137
|
+
|
|
138
|
+
Vision source: <path> (<n> statements added, <m> removed)
|
|
139
|
+
|
|
140
|
+
## NOT-2 cites V-99887766, which is gone
|
|
141
|
+
|
|
142
|
+
The vision no longer says: "<old statement text>"
|
|
143
|
+
It now says: "<new statement text, if there is a successor>"
|
|
144
|
+
|
|
145
|
+
- [ ] Re-cite NOT-2 against V-<new id>, wording unchanged
|
|
146
|
+
- [ ] Reword NOT-2: <proposed wording>
|
|
147
|
+
- [ ] Retire NOT-2 — the vision no longer supports it
|
|
148
|
+
- [ ] Leave NOT-2 as it is (a deliberate local rule the vision never carried)
|
|
149
|
+
|
|
150
|
+
## V-<new id> is new and nothing covers it
|
|
151
|
+
|
|
152
|
+
"<statement text>"
|
|
153
|
+
|
|
154
|
+
- [ ] Add IN-<next>: <proposed wording>
|
|
155
|
+
- [ ] Add NOT-<next>: <proposed wording>
|
|
156
|
+
- [ ] Nothing — this statement is about a different repo
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Include the last option every time. "The vision changed and this repo's boundary
|
|
160
|
+
did not" is a common and correct answer.
|
|
161
|
+
|
|
162
|
+
### Step 3 — Apply only what is checked
|
|
163
|
+
|
|
164
|
+
Then re-import so the snapshot matches the vision the decisions were made against:
|
|
165
|
+
|
|
166
|
+
```
|
|
167
|
+
aidlc constitution import <path>
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
Append one line to Amendments for every applied change — date, entry id, what
|
|
171
|
+
changed, why. Amendments are how the next reader tells a deliberate local rule from
|
|
172
|
+
a stale derivation. Offer to delete the inbox file once its content has landed.
|
|
173
|
+
|
|
174
|
+
## Consulting the constitution
|
|
175
|
+
|
|
176
|
+
Reading it during other work is not this skill's job — the overview skill carries
|
|
177
|
+
that rule, and the requirements, design and roadmap skills point at it. This skill
|
|
178
|
+
writes the file; they read it.
|
|
179
|
+
|
|
180
|
+
## Exit criteria
|
|
181
|
+
|
|
182
|
+
- `.aidlc/context/vision-source.md` exists and its `source_path` names a real file.
|
|
183
|
+
- `.aidlc/context/constitution.md` has a Mandate, at least one prohibition, and a
|
|
184
|
+
cited `V-` id on every entry.
|
|
185
|
+
- On a re-run: every proposed change was either applied or explicitly declined, and
|
|
186
|
+
each applied one has an Amendments line.
|
package/skills/10-ideation.md
CHANGED
|
@@ -30,7 +30,7 @@ and open questions.
|
|
|
30
30
|
|
|
31
31
|
> {{glossary:artifact}}
|
|
32
32
|
|
|
33
|
-
1. **Consult the knowledge graph first.** If the project has a knowledge graph (`.aidlc/knowledge/` exists), run `aidlc knowledge context --scope phase --phase ideation` before exploring the codebase — the
|
|
33
|
+
1. **Consult the knowledge graph first.** If the project has a knowledge graph (`.aidlc/knowledge/` exists), run `aidlc knowledge context --scope phase --phase ideation` before exploring the codebase — it is the cheapest way to find where in the code to look, and re-exploring what it already covers wastes the phase. It is an index, not an authority: a specific symbol it names may have been renamed or deleted by a later instance, so open the source before treating any named component, table, or registry as real. Also read all active guidance layers from `.aidlc/guidance/index.yaml` (including `lessons.md` — lessons from completed instances) so fresh guidance applies without recompiling skills.
|
|
34
34
|
2. **Clarify the problem.** Ask the user what they want to build and why. Identify the core need vs. nice-to-haves.
|
|
35
35
|
3. **Explore constraints.** Document: timeline, technical constraints, platform limitations, team size, budget considerations.
|
|
36
36
|
4. **Generate options.** Propose 2-3 approaches. For each, note trade-offs (complexity, time, risk).
|
|
@@ -25,7 +25,7 @@ Translate the ideation output (or the user's direct request) into precise, testa
|
|
|
25
25
|
|
|
26
26
|
> {{glossary:artifact}}
|
|
27
27
|
|
|
28
|
-
1. **Gather requirements.** If a Full scope, read the ideation phase's artifact for context (`idea.md` for the feature templates, `research-question.md` for `spike`; `phase-ideation.yaml` names it). Otherwise, ask the user to describe desired behavior. Read all active guidance layers from `.aidlc/guidance/index.yaml` (including `lessons.md` — lessons from completed instances) so fresh guidance applies without recompiling skills.
|
|
28
|
+
1. **Gather requirements.** If a Full scope, read the ideation phase's artifact for context (`idea.md` for the feature templates, `research-question.md` for `spike`; `phase-ideation.yaml` names it). Otherwise, ask the user to describe desired behavior. Read all active guidance layers from `.aidlc/guidance/index.yaml` (including `lessons.md` — lessons from completed instances) so fresh guidance applies without recompiling skills. Read `.aidlc/context/constitution.md` when it exists and apply the constitution rule in **aidlc-overview**.
|
|
29
29
|
2. **Write user stories.** Use the format: "As a [role], I want [capability], so that [benefit]."
|
|
30
30
|
3. **Define acceptance criteria.** Each criterion must be:
|
|
31
31
|
- Specific and unambiguous
|
package/skills/30-design.md
CHANGED
|
@@ -26,14 +26,15 @@ Produce a technical design that satisfies the requirements. Define architecture,
|
|
|
26
26
|
> {{glossary:gate}}
|
|
27
27
|
|
|
28
28
|
1. **Review requirements.** Read `requirements.md` (or its summary if one exists). Identify the key technical challenges. When requirements carry `AC-n` IDs, note in each design section which criteria it addresses — that linkage is what reviewers and the testing phase trace against.
|
|
29
|
-
2. **Consult the knowledge graph.** If the project has a knowledge graph (`.aidlc/knowledge/` exists), run `aidlc knowledge context --scope phase --phase design` for existing architecture, decisions, and conventions before
|
|
30
|
-
3. **
|
|
31
|
-
4. **
|
|
32
|
-
5. **
|
|
33
|
-
6. **
|
|
34
|
-
7. **
|
|
35
|
-
8. **
|
|
36
|
-
9. **
|
|
29
|
+
2. **Consult the knowledge graph, then check it against the source.** If the project has a knowledge graph (`.aidlc/knowledge/` exists), run `aidlc knowledge context --scope phase --phase design` for existing architecture, decisions, and conventions. The graph is an index into the code, not an authority over it: an entry naming a component, table, column, function, or registry is a pointer to open, and an entry written by an earlier instance may name something a later one renamed or deleted. Confirm a named symbol exists in the source before designing against it — `aidlc knowledge verify <id>` records that you did, and `aidlc knowledge update <id>` corrects an entry that no longer matches. A design built on a symbol that is not there produces code against an API nobody has, and nothing downstream catches it until implementation. Also read all active guidance layers from `.aidlc/guidance/index.yaml` (including `lessons.md` — lessons from completed instances) so fresh guidance applies without recompiling skills. Read `.aidlc/context/constitution.md` when it exists and apply the constitution rule in **aidlc-overview**.
|
|
30
|
+
3. **Find the seams before proposing structure.** A project is brownfield from its second instance onwards, so start from the assumption that something in the codebase already does part of what the requirements ask for. For each capability in `requirements.md`, locate and read the existing code that carries any of it — the scheduler that already fires, the settings shape that already persists, the registry that already dispatches — and name those files in `design.md` before describing a single new component. Keep it narrow: the seams the requirements actually touch, a handful of files, not a survey. When nothing exists, write that down — "no existing seam" is a finding, and stating it is what separates a genuinely new component from one designed alongside the code that should have absorbed it.
|
|
31
|
+
4. **Define architecture.** Describe the high-level structure: components, their responsibilities, and how they communicate. Say for each one whether it extends a seam found in step 3 or is new.
|
|
32
|
+
5. **Specify interfaces.** For each component boundary, define the contract (function signatures, API shapes, data types).
|
|
33
|
+
6. **Data flow.** Document how data moves through the system — inputs, transformations, storage, outputs.
|
|
34
|
+
7. **Design decisions.** Record each significant decision with rationale and alternatives considered. Persist accepted decisions as `decision` entities: `aidlc knowledge add --type decision --id <slug> --name "<title>" --description "<rationale>"`.
|
|
35
|
+
8. **Address non-functional concerns.** Map performance, security, and accessibility requirements to design choices.
|
|
36
|
+
9. **Identify risks.** Note technical risks and mitigation strategies.
|
|
37
|
+
10. **Produce the task breakdown.** For templates that require it (full-feature, quick-feature), write `tasks.md` in the instance state directory as the final design step — the design is not done until it is actionable. Decompose the design into commit-sized tasks: each one reviewable in one sitting and independently verifiable. One task per line, in this exact grammar:
|
|
37
38
|
|
|
38
39
|
```
|
|
39
40
|
- [ ] T<n>: <title>
|
|
@@ -47,6 +48,8 @@ Produce a technical design that satisfies the requirements. Define architecture,
|
|
|
47
48
|
## Exit Criteria
|
|
48
49
|
|
|
49
50
|
- `design.md` exists with architecture, interfaces, and at least one design decision with rationale
|
|
51
|
+
- `design.md` names the existing code the change extends, or states that no such code exists
|
|
52
|
+
- Every knowledge-graph symbol the design builds on was checked against the source
|
|
50
53
|
- The design addresses all acceptance criteria from `requirements.md`
|
|
51
54
|
- For templates requiring it: `tasks.md` exists and every active acceptance criterion is claimed by at least one task, or the gap is deliberate
|
|
52
55
|
- The user has confirmed the design direction
|
|
@@ -26,7 +26,7 @@ Produce working code that satisfies the design and requirements. Follow project
|
|
|
26
26
|
|
|
27
27
|
> {{glossary:gate}}
|
|
28
28
|
|
|
29
|
-
1. **Load context.** Read `.aidlc/context/style-guide.md` and `.aidlc/context/architecture.md` if they exist. Match the project's established patterns. If the project has a knowledge graph (`.aidlc/knowledge/` exists), also run `aidlc knowledge context --scope phase --phase implementation` and query it (`aidlc knowledge query <term>`) before re-exploring code it already describes.
|
|
29
|
+
1. **Load context.** Read `.aidlc/context/style-guide.md` and `.aidlc/context/architecture.md` if they exist. Match the project's established patterns. If the project has a knowledge graph (`.aidlc/knowledge/` exists), also run `aidlc knowledge context --scope phase --phase implementation` and query it (`aidlc knowledge query <term>`) before re-exploring code it already describes — as an index into the source, never a substitute for reading it. Open the file before calling anything the graph names; an entry can outlive the symbol it describes.
|
|
30
30
|
2. **Load guidance.** Read all active guidance layers from `.aidlc/guidance/index.yaml`. Apply their rules during implementation.
|
|
31
31
|
3. **Execute the task breakdown.** When the instance has a `tasks.md` (produced in Design for full/quick-feature scope), read it and execute tasks in order: complete a task, then mark its checkbox `[x]` as part of the same work unit — never batch checkbox updates for later. A task that should not be done is deferred in place (`- [>] T<n>: <title> (deferred YYYY-MM-DD: <reason>)`) with a dated reason, never skipped silently or deleted; the implementation→testing gate blocks on open tasks. For bugfix scope, create the optional `tasks.md` at implementation start when the fix spans more than one commit-sized unit. For Micro scope, reference the task description and acceptance criteria directly — no task file.
|
|
32
32
|
4. **Write code.** Follow the design interfaces. Match existing code style (naming, formatting, error handling patterns).
|
package/skills/60-deployment.md
CHANGED
|
@@ -31,19 +31,20 @@ deployment checklist.
|
|
|
31
31
|
> {{glossary:gate}}
|
|
32
32
|
> {{glossary:artifact}}
|
|
33
33
|
|
|
34
|
-
1. **
|
|
35
|
-
2. **
|
|
34
|
+
1. **Load guidance.** Read all active guidance layers from `.aidlc/guidance/index.yaml` (including `lessons.md` — lessons from completed instances) so fresh guidance applies without recompiling skills. Layers can be added to a project after these skills were installed, so read the index rather than assuming the layers named at the bottom of this skill are the only ones.
|
|
35
|
+
2. **Validate readiness.** Check the phase state files: every preceding required phase must be complete (all required artifacts `complete`). If any gate fails, address the gap before proceeding. (CLI shortcut: `aidlc gate <instance> deployment` — the phase name is the second argument, not the first.)
|
|
36
|
+
3. **Write release plan.** Document in the phase's required artifact (see Required Artifacts above):
|
|
36
37
|
- What is being deployed (version, changes summary)
|
|
37
38
|
- Target environment(s)
|
|
38
39
|
- Deployment steps in order
|
|
39
40
|
- Rollback procedure
|
|
40
41
|
- Monitoring and verification steps post-deploy
|
|
41
|
-
|
|
42
|
+
4. **Pre-deployment checks.** Verify:
|
|
42
43
|
- CI pipeline passes
|
|
43
44
|
- No critical findings open from adversarial reviews
|
|
44
45
|
- Dependencies are pinned and audited
|
|
45
|
-
|
|
46
|
-
|
|
46
|
+
5. **Execute deployment.** Follow the release plan step by step.
|
|
47
|
+
6. **Verify.** Confirm the deployment succeeded using the monitoring steps.
|
|
47
48
|
|
|
48
49
|
## Exit Criteria
|
|
49
50
|
|
package/skills/70-maintenance.md
CHANGED
|
@@ -26,15 +26,16 @@ and follow-up items.
|
|
|
26
26
|
|
|
27
27
|
## Instructions
|
|
28
28
|
|
|
29
|
-
1. **
|
|
30
|
-
2. **
|
|
29
|
+
1. **Load guidance.** Read all active guidance layers from `.aidlc/guidance/index.yaml` (including `lessons.md` — lessons from completed instances) so fresh guidance applies without recompiling skills. Layers can be added to a project after these skills were installed, so read the index rather than assuming the layers named at the bottom of this skill are the only ones.
|
|
30
|
+
2. **Monitor.** Check that the deployed changes behave as expected in their target environment. Note any anomalies.
|
|
31
|
+
3. **Update documentation.** Ensure project docs reflect the new state:
|
|
31
32
|
- README or user-facing docs updated if behavior changed
|
|
32
33
|
- Architecture docs updated if new components were added
|
|
33
34
|
- API docs updated if endpoints changed
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
35
|
+
4. **Gather feedback.** Collect user/team feedback on the delivered feature.
|
|
36
|
+
5. **Record known issues.** Document any edge cases, limitations, or technical debt introduced. If the project has a knowledge graph, record debt as entities (`aidlc knowledge add --type debt …`) and update facts invalidated by code changes (`aidlc knowledge update` / `verify`); list candidates with `aidlc knowledge stale --check-git`.
|
|
37
|
+
6. **Plan follow-up.** If feedback or monitoring reveals needed improvements, document them as potential future lifecycle instances.
|
|
38
|
+
7. **Close the instance.** When maintenance tasks are complete, mark the lifecycle instance as done.
|
|
38
39
|
|
|
39
40
|
## Exit Criteria
|
|
40
41
|
|
package/skills/80-review.md
CHANGED
|
@@ -30,7 +30,9 @@ You MUST perform this review with fresh eyes. If you authored the artifact being
|
|
|
30
30
|
|
|
31
31
|
1. **Read the target artifact completely.** Do not skim.
|
|
32
32
|
- When reviewing a design artifact and the instance has a `tasks.md`, review it together with the design: breakdown completeness (every design section covered by a task), task sizing (commit-sized units), and AC linkage (tasks reference the criteria they satisfy). Record its findings in the design review's findings file — no separate `tasks.review.md`.
|
|
33
|
-
2. **
|
|
33
|
+
2. **Load guidance.** Read all active guidance layers from `.aidlc/guidance/index.yaml` (including `lessons.md` — lessons from completed instances) so fresh guidance applies without recompiling skills. A newly installed layer takes effect immediately, so do not assume the layers named in this skill are the only active ones.
|
|
34
|
+
3. **Check for installed compliance controls.** Run `aidlc compliance list`. If nothing is installed, skip this step and the compliance findings stream below entirely — there is nothing to check and no file to write. If a pack is installed, run `aidlc compliance check` to get the controls that apply to this phase, each with what it requires, where to look, and its fail condition. Apply those fail conditions **as written**: they are the pack's, and reinterpreting one turns a stated control into your opinion.
|
|
35
|
+
4. **Examine for each dimension:**
|
|
34
36
|
- **Ambiguities** — Vague terms, undefined behavior, unclear scope
|
|
35
37
|
- **Contradictions** — Requirements that conflict with each other
|
|
36
38
|
- **Missing edge cases** — Inputs, states, or scenarios not addressed
|
|
@@ -43,13 +45,27 @@ You MUST perform this review with fresh eyes. If you authored the artifact being
|
|
|
43
45
|
deserialization. Apply the secure-defaults guidance below as the checklist.
|
|
44
46
|
- **Scalability concerns** — Performance bottlenecks or resource limits
|
|
45
47
|
- **Scope creep** — Functionality beyond the stated scope
|
|
46
|
-
|
|
48
|
+
5. **Write findings.** For each issue found, record:
|
|
47
49
|
- **Severity**: `critical`, `major`, or `minor`
|
|
48
50
|
- **Section**: The specific part of the artifact
|
|
49
51
|
- **Issue**: Clear description of the problem
|
|
50
52
|
- **Suggestion**: A concrete resolution or question to ask
|
|
51
53
|
- **Status**: `open` (always for new findings)
|
|
52
|
-
|
|
54
|
+
6. **Save the findings file** as `<artifact>.review.md` in the instance namespace.
|
|
55
|
+
7. **Write the compliance findings stream**, only when a pack is installed. It is a
|
|
56
|
+
**separate file**: `<artifact>.compliance.md`, never mixed into
|
|
57
|
+
`<artifact>.review.md`. The separation is load-bearing — the phase transition gate
|
|
58
|
+
reads only `*.review.md`, so keeping control findings out of it is what lets them
|
|
59
|
+
be advisory by default. See "Compliance Findings Format" below.
|
|
60
|
+
|
|
61
|
+
Every applicable control must appear in exactly one of two places, or it counts as
|
|
62
|
+
unchecked:
|
|
63
|
+
- a finding block carrying its **Control** id, when the fail condition is met;
|
|
64
|
+
- a line in `## Controls Checked` reading `- **Control:** <id> — no issues`, when
|
|
65
|
+
you looked and found nothing.
|
|
66
|
+
|
|
67
|
+
Do not write a cleared line for a control you did not actually examine. An
|
|
68
|
+
unchecked control reported as covered is the one outcome worse than no check at all.
|
|
53
69
|
|
|
54
70
|
{{guidance:secure-defaults}}
|
|
55
71
|
|
|
@@ -70,11 +86,40 @@ reviewer: <session-id>
|
|
|
70
86
|
- **Status:** open
|
|
71
87
|
```
|
|
72
88
|
|
|
89
|
+
## Compliance Findings Format
|
|
90
|
+
|
|
91
|
+
Only written when a compliance pack is installed. File: `<artifact>.compliance.md`.
|
|
92
|
+
|
|
93
|
+
```markdown
|
|
94
|
+
---
|
|
95
|
+
artifact: <filename>
|
|
96
|
+
reviewed_at: <ISO 8601 UTC>
|
|
97
|
+
reviewer: <session-id>
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Finding 1
|
|
101
|
+
- **Control:** <control id from the pack>
|
|
102
|
+
- **Severity:** critical | major | minor
|
|
103
|
+
- **Section:** <where in the artifact or diff>
|
|
104
|
+
- **Issue:** <how the fail condition is met>
|
|
105
|
+
- **Suggestion:** <what would satisfy the control>
|
|
106
|
+
- **Status:** open
|
|
107
|
+
|
|
108
|
+
## Controls Checked
|
|
109
|
+
- **Control:** <control id> — no issues
|
|
110
|
+
- **Control:** <control id> — no issues
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
The `Control` bullet is what links a finding to a control. A finding without one
|
|
114
|
+
satisfies nothing, and a control appearing in neither section counts as unchecked.
|
|
115
|
+
|
|
73
116
|
## Exit Criteria
|
|
74
117
|
|
|
75
118
|
- Findings file exists in the instance namespace
|
|
76
119
|
- Every dimension was considered (even if no issues found — state "no issues" for that dimension)
|
|
77
120
|
- Findings are actionable (each has a concrete suggestion or question)
|
|
121
|
+
- When a compliance pack is installed: `<artifact>.compliance.md` exists and every
|
|
122
|
+
applicable control appears either as a finding carrying its id or as a cleared line
|
|
78
123
|
|
|
79
124
|
## Review Gate
|
|
80
125
|
|