@rasensio/aidlc-content 1.40.2 → 1.42.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 +1 -1
- package/resources/rules/question-protocol.md +2 -0
- package/resources/rules/unattended.md +60 -0
- package/skills/00-overview.md +1 -1
- package/skills/03-entry-point.md +4 -2
- package/skills/04-roadmap.md +2 -3
- package/skills/20-requirements.md +16 -5
- package/skills/30-design.md +1 -1
- package/skills/40-implementation.md +3 -1
- package/skills/50-testing.md +6 -0
- package/skills/60-deployment.md +2 -0
package/package.json
CHANGED
|
@@ -38,4 +38,6 @@ Each question in the file ends with an `[Answer]:` tag — blank while open, car
|
|
|
38
38
|
|
|
39
39
|
With no interactive terminal, write the file, say where it is, and end the turn. Never assume an answer.
|
|
40
40
|
|
|
41
|
+
**Unattended (`AIDLC_UNATTENDED=1`)** is the one exception, and it is not an assumption: take the recommended option, write it into `[Answer]:` followed by `(unattended default)`, and log it — or, when the recommended option falls in a hard-stop class, stop. Both per `.aidlc/resources/rules/unattended.md`.
|
|
42
|
+
|
|
41
43
|
**At most five questions stand open at once.** At the limit, answering — or accepting the stated defaults — comes before asking another. The cap counts open questions, not questions asked: a long negotiation is fine, an accumulating pile is not.
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# The unattended rule
|
|
2
|
+
|
|
3
|
+
This file is the only statement of the rule. Skills point here instead of restating it, so there is no second copy to drift.
|
|
4
|
+
|
|
5
|
+
Unattended mode is on exactly when the environment variable `AIDLC_UNATTENDED` is `1` (`printenv AIDLC_UNATTENDED`). Otherwise every skill behaves as written. Nobody answers in this mode, so every place a skill would stop for a person has one outcome:
|
|
6
|
+
|
|
7
|
+
- **Default and log** — take the named default, log it, carry on.
|
|
8
|
+
- **Hard stop** — log it, park the item, release the claim, end the session.
|
|
9
|
+
- **Release boundary** — the normal end of an unattended run. Not a hard stop, and the item is not parked.
|
|
10
|
+
|
|
11
|
+
A situation no entry below covers is a hard stop. Guessing is what this mode exists to prevent.
|
|
12
|
+
|
|
13
|
+
## The log
|
|
14
|
+
|
|
15
|
+
Append one entry per default or hard stop to `.aidlc/state/<instance>/unattended-stops.md`: a `## <n>. <title> — <slug>` heading, then **Source:** (skill and section, or rule), **Instruction:** (the exact text), **Decided:** (the default, or "hard stop"), **Why:** (why it is safe, or which hard-stop class). A Question Protocol answer also carries `(unattended default)` in its `[Answer]:` — how a reviewer finds every choice nobody made.
|
|
16
|
+
|
|
17
|
+
## Hard stop
|
|
18
|
+
|
|
19
|
+
Always a hard stop:
|
|
20
|
+
|
|
21
|
+
1. Crossing a prohibition in `.aidlc/context/constitution.md`.
|
|
22
|
+
2. Deleting or overwriting data this session did not create.
|
|
23
|
+
3. Changing authentication, secrets, permissions or CI tokens, or handling real credentials.
|
|
24
|
+
4. Growing scope beyond the roadmap item's "What success looks like".
|
|
25
|
+
|
|
26
|
+
To stop:
|
|
27
|
+
|
|
28
|
+
1. Append the log entry.
|
|
29
|
+
2. Run `aidlc roadmap park <instance> --reason "<slug>: <one line>"`.
|
|
30
|
+
3. Run `aidlc release <instance>`.
|
|
31
|
+
4. End the session. Commit nothing more; try no other route to the same outcome.
|
|
32
|
+
|
|
33
|
+
## The release boundary
|
|
34
|
+
|
|
35
|
+
When testing completes, write the deployment record's release plan and end the session. Do not push, open a pull request, merge or release: whatever runs the agent owns those, and two actors on one release lane is how two releases collided on 2026-10-01.
|
|
36
|
+
|
|
37
|
+
## Every known stop
|
|
38
|
+
|
|
39
|
+
Each bullet begins with its one outcome; a condition after it is part of the rule.
|
|
40
|
+
|
|
41
|
+
- `entry-menu` — **default and log**: route to what the prompt names.
|
|
42
|
+
- `instance-name-taken` — **hard stop**: another session's work or an abandoned start, indistinguishable from here.
|
|
43
|
+
- `template-choice` — **default and log**: what the item or prompt names, else `defaults:` in `.aidlc/config.yaml`.
|
|
44
|
+
- `worktree-hand-off` — **default and log**: when the prompt says to continue, continue in the worktree.
|
|
45
|
+
- `roadmap-move-uncommitted` — **default and log**: leave it uncommitted; the caller commits.
|
|
46
|
+
- `roadmap-item-unlinked` — **default and log**: use `aidlc start --roadmap-item`; never move the item by hand.
|
|
47
|
+
- `requirements-input` — **default and log**: read `roadmap-item.md`; with neither it nor an ideation artifact, hard stop.
|
|
48
|
+
- `open-question` — **default and log**: the recommended option, marked `(unattended default)`; if it is a hard-stop class, hard stop — never another option.
|
|
49
|
+
- `requirements-confirmation` — **default and log**: hard stop if the requirements exceed the roadmap item.
|
|
50
|
+
- `design-confirmation` — **default and log**: the same scope test.
|
|
51
|
+
- `phase-end-turn` — **default and log**: continue into the next phase.
|
|
52
|
+
- `fresh-session` — **default and log**: continue; the runner decides where sessions start.
|
|
53
|
+
- `own-change-revert` — **default and log**: reverting this session's own change, after keeping a copy.
|
|
54
|
+
- `generated-output-discard` — **hard stop**: discarding output this session did not write.
|
|
55
|
+
- `sensitive-operation` — **hard stop**: deletions, infrastructure, permissions, credentials — except `own-change-revert`.
|
|
56
|
+
- `shared-state-prune` — **default and log**: it removes only entries whose worktree is gone and branch merged or deleted, and names each; log the names.
|
|
57
|
+
- `commit-incrementally` — **default and log**: on the instance branch only; never `main`, never push.
|
|
58
|
+
- `testing-security` — **hard stop**: production-like environments, real credentials, destructive operations.
|
|
59
|
+
- `platform-unknown` — **default and log**: carry on; the runner sets `AIDLC_AGENT`.
|
|
60
|
+
- `release-boundary` — **release boundary**: completing testing.
|
package/skills/00-overview.md
CHANGED
|
@@ -90,7 +90,7 @@ On each lifecycle event — `on-instance-start`, `on-phase-enter`, `on-phase-exi
|
|
|
90
90
|
|
|
91
91
|
## Question Protocol
|
|
92
92
|
|
|
93
|
-
When to ask the user something, how the question is written, and where it is recorded. The rule is in `.aidlc/resources/rules/question-protocol.md`.
|
|
93
|
+
When to ask the user something, how the question is written, and where it is recorded. The rule is in `.aidlc/resources/rules/question-protocol.md`. With nobody there: `.aidlc/resources/rules/unattended.md`.
|
|
94
94
|
|
|
95
95
|
## Ending a Phase or a Review
|
|
96
96
|
|
package/skills/03-entry-point.md
CHANGED
|
@@ -8,11 +8,13 @@ native_mode_hint:
|
|
|
8
8
|
claude-code: >-
|
|
9
9
|
This skill is an interactive entry point, not a phase artifact. Do not
|
|
10
10
|
enter plan mode. Read lifecycle state, present the menu, and wait for
|
|
11
|
-
the user's choice before doing any work
|
|
11
|
+
the user's choice before doing any work — unless their message already
|
|
12
|
+
says what they want; then route to it directly.
|
|
12
13
|
copilot: >-
|
|
13
14
|
This skill is an interactive entry point, not a phase artifact. Stay in the
|
|
14
15
|
default agent — do not switch to plan mode. Read lifecycle state, present the
|
|
15
|
-
menu, and wait for the user's choice before doing any work
|
|
16
|
+
menu, and wait for the user's choice before doing any work — unless their
|
|
17
|
+
message already says what they want; then route to it directly.
|
|
16
18
|
---
|
|
17
19
|
# AIDLC Entry Point
|
|
18
20
|
|
package/skills/04-roadmap.md
CHANGED
|
@@ -176,9 +176,8 @@ When the user asks for a worktree ("create a new worktree for roadmap `<file>`")
|
|
|
176
176
|
|
|
177
177
|
1. **Find the item** by file name, `id`, or title, in `backlog/` or `inbox/`. Asking for a worktree counts as choosing to skip triage. When more than one item matches, list them and ask which one.
|
|
178
178
|
2. **Instance name**: the item's file name without its date prefix and extension (the item filed as `20260929-say-what-to-do-next` becomes `say-what-to-do-next`). Template and scope come from the config defaults, unless the item or the user names them.
|
|
179
|
-
3. **Create the instance with** `aidlc start <template> --name <name> --scope <scope> --worktree --non-interactive
|
|
180
|
-
4. **
|
|
181
|
-
5. **Hand off. Do not start the phase in this session.** The work belongs to the new session. End with the exact command that opens it:
|
|
179
|
+
3. **Create the instance with** `aidlc start <template> --name <name> --scope <scope> --worktree --non-interactive --roadmap-item <item-file>`. Take the worktree path from the `Worktree:` line it prints. That one command creates the branch and the worktree, fires `on-instance-start`, sets the item's `promoted_to`, moves it to `in-progress/` in the primary checkout, and copies it into the instance as `roadmap-item.md` — which is the seeding step 5 above asks for. Do none of it by hand: a hand-made move is the step that got skipped. The move is left uncommitted in the primary checkout; committing it is yours.
|
|
180
|
+
4. **Hand off. Do not start the phase in this session** — unless the user's own message asks you to continue here, in which case `cd` into the worktree and follow **aidlc-continue** there. Otherwise the work belongs to the new session. End with the exact command that opens it:
|
|
182
181
|
```
|
|
183
182
|
cd <worktree> && claude "/aidlc-continue <name>"
|
|
184
183
|
```
|
|
@@ -39,35 +39,46 @@ See **The context rule** (`.aidlc/resources/rules/context.md`).
|
|
|
39
39
|
|
|
40
40
|
> {{glossary:artifact}}
|
|
41
41
|
|
|
42
|
-
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).
|
|
42
|
+
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). At Standard scope, read the roadmap item the instance was promoted from (`roadmap-item.md` in its state directory). Ask the user to describe the desired behaviour only when there is neither. Unattended (`AIDLC_UNATTENDED=1`): no artifact and no item is a hard stop, per `.aidlc/resources/rules/unattended.md`. Read the always-read guidance layers from `.aidlc/guidance/index.yaml` — see **The always-read rule** (`.aidlc/resources/rules/always-read.md`) for which layers those are and when to reach for the full `lessons.md`. Read `.aidlc/context/constitution.md` when it exists and apply the constitution rule in `.aidlc/resources/rules/constitution.md`.
|
|
43
43
|
2. **Write user stories.** Use the format: "As a [role], I want [capability], so that [benefit]."
|
|
44
44
|
3. **Define acceptance criteria.** Each criterion must be:
|
|
45
45
|
- Specific and unambiguous
|
|
46
46
|
- Testable (an observable outcome)
|
|
47
47
|
- Independent (not relying on unstated assumptions)
|
|
48
48
|
- **Identified**: write every criterion as a list item `- AC-<n>: <text>` (bold variants `- **AC-<n>**: ...` and `- **AC-<n>:** ...` are also valid). Assign `AC-1`, `AC-2`, ... sequentially. IDs are never renumbered or reused — an amended criterion keeps its meaning or is retired: mark it `- AC-<n> (retired YYYY-MM-DD, superseded by AC-<m>): <text>` and issue a new ID. The testing-phase gate parses these IDs and fails on any active criterion without a referencing test.
|
|
49
|
+
- **Shaped**, when the criterion is a behaviour. Write the text after the colon in one of four shapes, each naming its own test — the condition to set up and the response to check:
|
|
50
|
+
- Event — `- AC-1: WHEN the user presses Save, THE SYSTEM SHALL write the draft to disk`
|
|
51
|
+
- State — `- AC-2: WHILE the draft is unsaved, THE SYSTEM SHALL show a dot in the tab`
|
|
52
|
+
- Unwanted — `- AC-3: IF the disk is full, THEN THE SYSTEM SHALL keep the draft in memory and say so`
|
|
53
|
+
- Optional — `- AC-4: WHERE autosave is on, THE SYSTEM SHALL save the draft every 30 seconds`
|
|
54
|
+
|
|
55
|
+
A criterion that is not a behaviour — a performance budget, a docs change, a file that must exist — stays a plain sentence. A plain criterion is valid: the gate checks the ID, never the shape.
|
|
49
56
|
4. **Set scope boundaries.** Explicitly state what is NOT included.
|
|
50
57
|
5. **Non-functional requirements.** Address performance, security, accessibility, and compatibility where relevant.
|
|
51
58
|
6. **For open decisions**: When a decision would change what `requirements.md` says, ask it through the **Question Protocol** (`.aidlc/resources/rules/question-protocol.md`) — questions for this phase go to `.aidlc/state/<instance>/requirements-questions.md`. Prefer drafting `requirements.md` early with the unresolved points marked as explicit decision blocks: users decide better reacting to a concrete draft than answering abstract questions. Fold each answer into the draft and leave the question file as the record of what was decided and why.
|
|
52
59
|
|
|
53
60
|
## Bugfix Reproduction (bugfix template)
|
|
54
61
|
|
|
55
|
-
When the instance uses the `bugfix` template, this phase produces `reproduction.md`
|
|
62
|
+
When the instance uses the `bugfix` template, this phase produces `reproduction.md` and a bugfix-shaped `requirements.md`:
|
|
56
63
|
|
|
57
64
|
1. **Reproduce first.** Capture: observed behavior, expected behavior, minimal reproduction steps, affected versions/environment. A bug that cannot be reproduced gets documented as such — with the evidence tried — before any fix work.
|
|
58
65
|
2. **Acceptance criteria** for the fix follow the same `AC-<n>` ID rules as regular requirements (the reproduction steps typically become the test).
|
|
59
|
-
3. **
|
|
66
|
+
3. **Write `requirements.md` in three sections, in this order.** The testing gate reads criteria from `requirements.md` only, so they go here, not in `reproduction.md`:
|
|
67
|
+
- **Current behaviour** — what happens today. Description only; no IDs.
|
|
68
|
+
- **Expected behaviour** — what the fix makes happen. Each line an `AC-<n>` criterion.
|
|
69
|
+
- **Unchanged behaviour** — what works next to the fix today and must still work after it. Each line an `AC-<n>` criterion, so the gate demands a test for it. If you find nothing, write "None found" and say why; never leave the section out.
|
|
70
|
+
4. **Propose defect linkage (`caused_by`).** Identify which instance(s) likely introduced the defect:
|
|
60
71
|
- `git blame` the defective lines and match commits to instance branches (`fix|feat|chore/<YYYYMMDD>-<name>`)
|
|
61
72
|
- Query the knowledge graph for the module's history
|
|
62
73
|
- Check instance state dirs and the registry for names
|
|
63
74
|
Present the candidates *as guesses* with the evidence. The user confirms, edits, or declines — `caused_by` is **never written without explicit user confirmation**, and declining leaves the field absent (absent = unknown, never an error).
|
|
64
|
-
|
|
75
|
+
5. **Write the confirmed linkage** to `instance.yaml` as a list: `caused_by: [<instance>, ...]` (single cause = one-element list). Validate every name against existing state dirs or registry entries — an unknown name needs re-confirmation; reject the bugfix's own name (no self-reference).
|
|
65
76
|
|
|
66
77
|
## Exit Criteria
|
|
67
78
|
|
|
68
79
|
- `requirements.md` exists with at least one user story and corresponding acceptance criteria
|
|
69
80
|
- Each acceptance criterion is testable (has an observable pass/fail condition)
|
|
70
|
-
- The user has confirmed the requirements are complete for the chosen scope
|
|
81
|
+
- The user has confirmed the requirements are complete for the chosen scope. Unattended (`AIDLC_UNATTENDED=1`): log the confirmation as a default, or hard-stop when the requirements reach beyond the roadmap item, per `.aidlc/resources/rules/unattended.md`.
|
|
71
82
|
|
|
72
83
|
## Guidance
|
|
73
84
|
|
package/skills/30-design.md
CHANGED
|
@@ -66,7 +66,7 @@ transcript. See **The context rule** (`.aidlc/resources/rules/context.md`).
|
|
|
66
66
|
- Every knowledge-graph symbol the design builds on was checked against the source
|
|
67
67
|
- The design addresses all acceptance criteria from `requirements.md`
|
|
68
68
|
- For templates requiring it: `tasks.md` exists and every active acceptance criterion is claimed by at least one task, or the gap is deliberate
|
|
69
|
-
- The user has confirmed the design direction
|
|
69
|
+
- The user has confirmed the design direction. Unattended (`AIDLC_UNATTENDED=1`): log the confirmation as a default, or hard-stop when the design reaches beyond the roadmap item, per `.aidlc/resources/rules/unattended.md`.
|
|
70
70
|
|
|
71
71
|
## Guidance
|
|
72
72
|
|
|
@@ -44,7 +44,7 @@ Then the source files that task touches. See **The context rule** (`.aidlc/resou
|
|
|
44
44
|
2. **Load guidance.** Read the always-read guidance layers from `.aidlc/guidance/index.yaml` — see **The always-read rule** (`.aidlc/resources/rules/always-read.md`) for which layers those are and when to reach for the full `lessons.md`. Apply their rules during implementation.
|
|
45
45
|
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.
|
|
46
46
|
4. **Write code.** Follow the design interfaces. Match existing code style (naming, formatting, error handling patterns).
|
|
47
|
-
5. **Handle sensitive operations.** Before executing any of the following, describe the action and wait for explicit user confirmation:
|
|
47
|
+
5. **Handle sensitive operations.** Before executing any of the following, describe the action and wait for explicit user confirmation (unattended, `AIDLC_UNATTENDED=1`: each is a hard stop except reverting this session's own changes, per `.aidlc/resources/rules/unattended.md`):
|
|
48
48
|
- File deletions or destructive operations
|
|
49
49
|
- Infrastructure changes (provisioning, configuration)
|
|
50
50
|
- Permission or access control modifications
|
|
@@ -70,6 +70,8 @@ Then the source files that task touches. See **The context rule** (`.aidlc/resou
|
|
|
70
70
|
|
|
71
71
|
## Security Confirmation
|
|
72
72
|
|
|
73
|
+
Unattended (`AIDLC_UNATTENDED=1`): nobody can confirm, so everything this section asks to confirm is a hard stop, per `.aidlc/resources/rules/unattended.md`.
|
|
74
|
+
|
|
73
75
|
Before proceeding with any sensitive operation during implementation:
|
|
74
76
|
1. Describe what the operation does and what it affects
|
|
75
77
|
2. State whether it is reversible
|
package/skills/50-testing.md
CHANGED
|
@@ -47,6 +47,8 @@ See **The context rule** (`.aidlc/resources/rules/context.md`).
|
|
|
47
47
|
- Integration tests for component interactions
|
|
48
48
|
- Property-based tests where inputs have broad domains
|
|
49
49
|
- **Reference AC IDs.** When `requirements.md` defines `AC-n` criteria, each test names the criteria it verifies — in the test name or a comment (e.g. `// AC-3`). The testing-phase gate scans test files for these references and fails on any active criterion with none. If two instances define the same ID, qualify the reference as `<instance>/AC-n`.
|
|
50
|
+
- **Test the shape.** A `WHEN`/`WHILE`/`IF`/`WHERE` criterion names its own test: set up the condition, assert the `SHALL` response. An `IF` criterion is tested by causing the unwanted condition, not by the happy path.
|
|
51
|
+
- **Unchanged behaviour (bugfix).** Each criterion in that section of `requirements.md` gets a test that passes before the fix and after it. Run it once against the unfixed code to see it pass.
|
|
50
52
|
3. **Run tests.** Execute the project's test suite. All new tests must pass.
|
|
51
53
|
4. **Document results.** Write the phase's required artifact (see Required Artifacts above) with:
|
|
52
54
|
- Test plan (what was tested and why)
|
|
@@ -89,6 +91,8 @@ testing phase and record newly introduced advisories as findings.
|
|
|
89
91
|
|
|
90
92
|
## Security Confirmation
|
|
91
93
|
|
|
94
|
+
Unattended (`AIDLC_UNATTENDED=1`): nobody can confirm, so everything this section asks to confirm is a hard stop, per `.aidlc/resources/rules/unattended.md`.
|
|
95
|
+
|
|
92
96
|
If testing requires:
|
|
93
97
|
- Access to production-like environments
|
|
94
98
|
- Use of real credentials or sensitive data
|
|
@@ -100,6 +104,8 @@ You MUST describe the action, confirm it targets a safe environment, and wait fo
|
|
|
100
104
|
|
|
101
105
|
When exit criteria are met, update `phase-testing.yaml` status to `complete` and append a transition record to `transitions.log`.
|
|
102
106
|
|
|
107
|
+
Unattended (`AIDLC_UNATTENDED=1`): this is the release boundary. Write the deployment record's release plan and end the session — no push, pull request, merge or release — per `.aidlc/resources/rules/unattended.md`.
|
|
108
|
+
|
|
103
109
|
Then end the turn as **The next-steps rule** (`.aidlc/resources/rules/next-steps.md`) says.
|
|
104
110
|
|
|
105
111
|
**Changing a completed phase's artifact.** Do it only through an amendment — append an
|
package/skills/60-deployment.md
CHANGED
|
@@ -82,6 +82,8 @@ deployment checklist.
|
|
|
82
82
|
|
|
83
83
|
## Security Confirmation
|
|
84
84
|
|
|
85
|
+
Unattended (`AIDLC_UNATTENDED=1`): nobody can confirm, so everything this section asks to confirm is a hard stop, per `.aidlc/resources/rules/unattended.md`.
|
|
86
|
+
|
|
85
87
|
Deployment is inherently sensitive. You MUST:
|
|
86
88
|
1. Confirm the target environment with the user (production vs. staging vs. dev)
|
|
87
89
|
2. Present the full list of changes being deployed
|