@antoneeo/agentic-sdlc-skill 1.35.0 → 1.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +31 -8
- package/README.md +1 -1
- package/gemini-extension.json +1 -1
- package/package.json +4 -4
- package/skills/agentic-sdlc-skill/SKILL.md +12 -12
- package/skills/agentic-sdlc-skill/dispatch.md +5 -1
- package/skills/agentic-sdlc-skill/elicitation.md +216 -173
- package/skills/agentic-sdlc-skill/review.md +8 -1
- package/skills/agentic-sdlc-skill/scripts/sdlc_core.py +8 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,14 +2,37 @@
|
|
|
2
2
|
|
|
3
3
|
Tutte le modifiche significative a questa skill saranno documentate in questo file.
|
|
4
4
|
|
|
5
|
-
## [1.
|
|
6
|
-
|
|
7
|
-
###
|
|
8
|
-
- F-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
5
|
+
## [1.36.0] - 2026-09-25
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
- **F-026 revised: a real doubt is asked when it emerges.** The question discipline
|
|
9
|
+
no longer sends doubts to the deliverable ("Default non-blocking" is gone). A real
|
|
10
|
+
doubt (a fact the search leaves open, or a choice whose pros and cons do not
|
|
11
|
+
settle it) is asked before the first write that would embed its answer, grouped,
|
|
12
|
+
with the pros and cons of each option. A choice that clearly wins the weighing is
|
|
13
|
+
taken without asking, and the weighing is written next to it — each rejected option
|
|
14
|
+
stated at its strongest; options that serve different needs, none good enough at
|
|
15
|
+
both, that nothing the user wrote ranks are a real doubt, however clear the
|
|
16
|
+
agent's own ranking. Reserved approvals
|
|
17
|
+
are always asked. A real doubt becomes a declared assumption only in unattended
|
|
18
|
+
or delegated work. `review.md` makes an unasked doubt a design-review finding; `dispatch.md`
|
|
19
|
+
tells a subagent to return its real doubts instead of deciding them.
|
|
20
|
+
|
|
21
|
+
### Fixed
|
|
22
|
+
- **`stale` no longer counts the audit plan against the area that holds it.**
|
|
23
|
+
Committing a hash mark of `ai_docs/` changed `ai_docs/audit/audit_plan.md` after
|
|
24
|
+
the recorded commit, so the area went stale again and every re-mark repeated the
|
|
25
|
+
loop. The plan's own edits are now excluded; any other change in the area still
|
|
26
|
+
counts.
|
|
27
|
+
|
|
28
|
+
## [1.35.0] - 2026-09-19
|
|
29
|
+
|
|
30
|
+
### Added
|
|
31
|
+
- F-057: shared project memory in every lens, no sibling installation required.
|
|
32
|
+
`index` catalogs original documents; `recall QUERY` searches live metadata.
|
|
33
|
+
KB integrity is shared; domain ownership and marketing numerical checks remain.
|
|
34
|
+
Vendored validators now require entry point + sdlc_core.py + knowledge.py.
|
|
35
|
+
|
|
13
36
|
|
|
14
37
|
### Fixed
|
|
15
38
|
- **F-056: `stale` no longer reports an area fresh when it cannot evaluate it.** An
|
package/README.md
CHANGED
|
@@ -31,7 +31,7 @@ Vendoring requires all three files: the entry point, `sdlc_core.py`, `knowledge.
|
|
|
31
31
|
- **Standalone complete**: works fully with local `ai_docs/` without requiring devPNT.
|
|
32
32
|
- **devPNT symbiosis**: when devPNT is available, Master Plan, Action Plan, M-VISION, and governed artifacts become the authoritative planning layer, with independent fresh-context reviews of technical artifacts and diffs.
|
|
33
33
|
- **Independent review, twice**: the design is reviewed before it is implemented and the diff before the work is declared done — by somebody other than its author. Three rungs of independence (fresh-context subagent > one-shot run > a declared self-pass, legal only when no higher rung is usable: absent, or permission-gated and declined — a gated rung is asked about, never silently skipped, and the log says which), capped at 3 rounds, one log line per review, and a PASS is invalid on "found nothing" — it must state where each constraint is satisfied.
|
|
34
|
-
- **Question discipline**: a
|
|
34
|
+
- **Question discipline**: a real doubt is asked when it emerges, before its answer is written into any document — grouped, with the pros and cons of each option. A choice whose pros clearly win is taken without asking, and the weighing is written next to it; a fact is settled by evidence or asked, never weighed. A question is legal only when the agent searched first, names the search with its result, and names the decision it unblocks — never a stream of "shall I proceed?".
|
|
35
35
|
- **Installed support files**: Claude, Codex, Gemini, and Google Antigravity receive the full skill folder, including `templates.md`, `architect.md`, `guides.md`, `vision.md`, `tdd.md`, `debugging.md`, `elicitation.md`, `review.md`, `dispatch.md`, `routing.md`, `hybrid.md`, `ENFORCEMENT.md`, `memory.md`, and the validator's three files, `scripts/sdlc_check.py` + `scripts/sdlc_core.py` + `scripts/knowledge.py` — plus the `LICENSE` and `NOTICE` it ships under.
|
|
36
36
|
- **Mechanical checks**: optional validator for document structure, generated feature history, stale audit areas, and protected-path gates — `check`, `validate`, `index`, `stale`, `mark`, `benefit`, `gate`, `plan`, `orient`, `migrate`. `benefit` reports what the review gates have already caught, beside what the doctrine costs to read — it always exits 0 and carries no verdict, because a measurement that can fail a build becomes a target.
|
|
37
37
|
|
package/gemini-extension.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@antoneeo/agentic-sdlc-skill",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.36.0",
|
|
4
4
|
"description": "Documentation-First SDLC protocol for Claude Code, Gemini CLI, Google Antigravity and Codex with risk triage, Vision governance, installed support files and optional devPNT integration.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"claude-code",
|
|
@@ -39,9 +39,9 @@
|
|
|
39
39
|
"skills/agentic-sdlc-skill/routing.md",
|
|
40
40
|
"skills/agentic-sdlc-skill/ENFORCEMENT.md",
|
|
41
41
|
"skills/agentic-sdlc-skill/scripts/sdlc_check.py",
|
|
42
|
-
"skills/agentic-sdlc-skill/scripts/sdlc_core.py",
|
|
43
|
-
"skills/agentic-sdlc-skill/scripts/knowledge.py",
|
|
44
|
-
"skills/agentic-sdlc-skill/memory.md",
|
|
42
|
+
"skills/agentic-sdlc-skill/scripts/sdlc_core.py",
|
|
43
|
+
"skills/agentic-sdlc-skill/scripts/knowledge.py",
|
|
44
|
+
"skills/agentic-sdlc-skill/memory.md",
|
|
45
45
|
"skills/agentic-sdlc-skill/LICENSE",
|
|
46
46
|
"skills/agentic-sdlc-skill/NOTICE",
|
|
47
47
|
"gemini-extension.json",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: agentic-sdlc
|
|
3
|
-
version: 1.
|
|
3
|
+
version: 1.36.0
|
|
4
4
|
description: Documentation-First SDLC protocol with risk-proportional triage, Vision as a guide, a complete Standalone mode and optional symbiosis with devPNT. Use for features, significant bugs, refactors, audits and documented maintenance.
|
|
5
5
|
author: Antonio Pinto (https://github.com/Antoneeo)
|
|
6
6
|
copyright: (c) 2026 Antonio Pinto
|
|
@@ -20,7 +20,7 @@ Support files in the skill directory:
|
|
|
20
20
|
- `vision.md`: how to write a Vision a cold reviewer can actually apply — the properties that make a rule hold, the minimum operable sections, and the blind check run before promoting one to APPROVED.
|
|
21
21
|
- `hybrid.md`: the devPNT seam — the authoritative hierarchy, the ownership matrix (who owns what when both authorities are live), the triage equivalence, the feature-state mapping and the shadow discipline. Read it when the `devpnt_*` tools point at this project; a Standalone session never needs it.
|
|
22
22
|
- `routing.md`: which lens owns this unit of work. Read ONLY when a sibling lens skill is installed alongside this one; a single-lens install never reads it.
|
|
23
|
-
- `scripts/sdlc_check.py` + `scripts/sdlc_core.py`: the mechanical validator for the docs root (`check`, `validate`, `index`, `stale`, `mark`, `benefit`, `gate`, `plan`, `orient`, `migrate`). Keep the entry point, `scripts/sdlc_core.py` and `scripts/knowledge.py` together; the last supplies common memory and KB integrity.
|
|
23
|
+
- `scripts/sdlc_check.py` + `scripts/sdlc_core.py`: the mechanical validator for the docs root (`check`, `validate`, `index`, `stale`, `mark`, `benefit`, `gate`, `plan`, `orient`, `migrate`). Keep the entry point, `scripts/sdlc_core.py` and `scripts/knowledge.py` together; the last supplies common memory and KB integrity.
|
|
24
24
|
- `ENFORCEMENT.md`: optional setup for CI and hooks.
|
|
25
25
|
|
|
26
26
|
Read these files only when needed. `SKILL.md` is the operating contract; the support files are progressive resources.
|
|
@@ -37,15 +37,15 @@ Read these files only when needed. `SKILL.md` is the operating contract; the sup
|
|
|
37
37
|
|
|
38
38
|
If a patch looks easy but you do not understand why the current code is shaped the way it is, investigate first.
|
|
39
39
|
|
|
40
|
-
## Shared project memory
|
|
41
|
-
|
|
42
|
-
Project memory is available by default, independently of installed sibling lenses.
|
|
43
|
-
Read `memory.md` for the common consult/capture contract during orientation and
|
|
44
|
-
closure. Use `recall` for cross-domain discovery; `index` registers original guides,
|
|
45
|
-
plans and decisions without copying them. One owner still governs each unit.
|
|
46
|
-
The validator now ships as three files: entry point, `sdlc_core.py`, `knowledge.py`.
|
|
47
|
-
|
|
48
|
-
## Rule Zero: Triage
|
|
40
|
+
## Shared project memory
|
|
41
|
+
|
|
42
|
+
Project memory is available by default, independently of installed sibling lenses.
|
|
43
|
+
Read `memory.md` for the common consult/capture contract during orientation and
|
|
44
|
+
closure. Use `recall` for cross-domain discovery; `index` registers original guides,
|
|
45
|
+
plans and decisions without copying them. One owner still governs each unit.
|
|
46
|
+
The validator now ships as three files: entry point, `sdlc_core.py`, `knowledge.py`.
|
|
47
|
+
|
|
48
|
+
## Rule Zero: Triage
|
|
49
49
|
|
|
50
50
|
Always classify the request before choosing the process. Declare the chosen level to the user when you start operational work.
|
|
51
51
|
|
|
@@ -63,7 +63,7 @@ Cross-cutting rules:
|
|
|
63
63
|
- Parsing of external input, authN/authZ, cryptography, networking, personal data and filesystem access are security-sensitive: never L1.
|
|
64
64
|
- If a bigger impact emerges during L1/L2 work, stop, reclassify and declare it.
|
|
65
65
|
- When in doubt, pick the higher level.
|
|
66
|
-
- **
|
|
66
|
+
- **A real doubt is asked when it emerges, before its answer is written — any phase, any level; a question is legal only after naming the search with its result and the decision it blocks.** `elicitation.md` §The question discipline owns the rule — what is a real doubt, the pros-and-cons weighing, the form — and is the only place it is stated: read it before you ask or assume, and do not work from a summary of it.
|
|
67
67
|
- The full audit does not start for L1/L2 unless explicitly requested.
|
|
68
68
|
|
|
69
69
|
Triage rationalizations — the thought on the left is the signal to STOP and re-triage:
|
|
@@ -26,7 +26,11 @@ without an E-ISP.
|
|
|
26
26
|
- `sdlc_check.py plan brief PLAN_[feature].md --task <id>` — prints the
|
|
27
27
|
task block, the `produces` of prior-order tasks (interfaces), and
|
|
28
28
|
`guides` pointers (paths, never pasted content) to stdout.
|
|
29
|
-
- Spawn the subagent with that brief
|
|
29
|
+
- Spawn the subagent with that brief plus the return-doubts line as its
|
|
30
|
+
entire context window. The line: "An open point whose answer changes the
|
|
31
|
+
work is not yours to decide: return it in your final output with what you
|
|
32
|
+
searched." The orchestrator treats them as its own candidate doubts
|
|
33
|
+
(`elicitation.md` §When a doubt emerges).
|
|
30
34
|
- Run `task.verify` out of band (the orchestrator executes it — the
|
|
31
35
|
validator only ever prints it, never runs it) plus the one-shot review
|
|
32
36
|
below.
|
|
@@ -1,173 +1,216 @@
|
|
|
1
|
-
# Spec Elicitation
|
|
2
|
-
|
|
3
|
-
`## The question discipline` below governs EVERY question to the
|
|
4
|
-
phase, any level, inside or outside the round. The rest of the file is
|
|
5
|
-
elicitation round: it applies when an L3 request enters phase 3 (Request
|
|
6
|
-
Analysis), BEFORE drafting the ANALYSIS document (Standalone) or the D-UC/E-ISP
|
|
7
|
-
(Hybrid).
|
|
8
|
-
|
|
9
|
-
Skip path: if the spec is already complete — an approved Vision
|
|
10
|
-
requirements already answer goal, scope, and constraints,
|
|
11
|
-
|
|
12
|
-
a one-line note in the analysis stating why it was skipped and naming the
|
|
13
|
-
sources. Do not run the round as a formality when the answers are already on
|
|
14
|
-
record.
|
|
15
|
-
|
|
16
|
-
Unattended path: when the user is not reachable (a scheduled or autonomous run)
|
|
17
|
-
and
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
silently into a design is not.
|
|
22
|
-
|
|
23
|
-
## The question discipline
|
|
24
|
-
|
|
25
|
-
A
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
the
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
**
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
1
|
+
# Spec Elicitation
|
|
2
|
+
|
|
3
|
+
`## The question discipline` below governs EVERY doubt and EVERY question to the
|
|
4
|
+
user — any phase, any level, inside or outside the round. The rest of the file is
|
|
5
|
+
the spec elicitation round: it applies when an L3 request enters phase 3 (Request
|
|
6
|
+
Analysis), BEFORE drafting the ANALYSIS document (Standalone) or the D-UC/E-ISP
|
|
7
|
+
(Hybrid).
|
|
8
|
+
|
|
9
|
+
Skip path: if the spec is already complete — an approved Vision, explicit user
|
|
10
|
+
requirements or an earlier reply already answer goal, scope, and constraints, and
|
|
11
|
+
any remainder is settled as §When a doubt emerges allows — skip the round and add
|
|
12
|
+
a one-line note in the analysis stating why it was skipped and naming the
|
|
13
|
+
sources. Do not run the round as a formality when the answers are already on
|
|
14
|
+
record.
|
|
15
|
+
|
|
16
|
+
Unattended path: when the user is not reachable (a scheduled or autonomous run)
|
|
17
|
+
and a real doubt remains, do not stall and do not invent consensus. Write it as a
|
|
18
|
+
**declared assumption** (§Ask before the write) in the artifact it touches. At L3,
|
|
19
|
+
mark the ANALYSIS `BLOCKED on the user` and stop before implementation; below L3,
|
|
20
|
+
proceed and list the assumption in the reply. An assumption on the record is
|
|
21
|
+
reviewable; a guess folded silently into a design is not.
|
|
22
|
+
|
|
23
|
+
## The question discipline
|
|
24
|
+
|
|
25
|
+
A doubt kept silent is decided by the agent alone and reaches the documents
|
|
26
|
+
looking settled; a useless question wastes the user's attention. This section
|
|
27
|
+
rules on both.
|
|
28
|
+
|
|
29
|
+
### When a doubt emerges
|
|
30
|
+
|
|
31
|
+
A **candidate doubt** is an open point whose answer changes what you build or
|
|
32
|
+
write. The usual signals — they illustrate, they do not close the definition:
|
|
33
|
+
|
|
34
|
+
| Thought | What it means |
|
|
35
|
+
|---|---|
|
|
36
|
+
| "They probably mean…", "I'll assume…" | you are choosing between readings of the request |
|
|
37
|
+
| "The request doesn't say, so I'll fill it in" | a gap in scope, a non-goal, an acceptance criterion or a priority |
|
|
38
|
+
| "Either would work, I'll pick one" | equivalent in effect: yours, pick and do not ask; different in effect: weigh them below |
|
|
39
|
+
| "I'll note it as an assumption and move on" | with the user reachable, that note is where doubts go to be forgotten |
|
|
40
|
+
| "It's reversible, it can be fixed later" | later is after the documents built on it exist |
|
|
41
|
+
|
|
42
|
+
Settle it by kind:
|
|
43
|
+
|
|
44
|
+
- **A fact, or information only the user holds** (a deadline, a price, a
|
|
45
|
+
constraint): settled only by evidence, cited — never settled by a weighing. Left
|
|
46
|
+
open by the search and changing the work, it is a real doubt.
|
|
47
|
+
- **A choice** — a reading of intent, a design trade-off: cite the user's statement
|
|
48
|
+
that settles it (the request, an APPROVED Vision, an earlier reply); failing one,
|
|
49
|
+
weigh the pros and cons of each option, stating each rejected option
|
|
50
|
+
at its strongest — the need it serves best; a weighing won against a weak
|
|
51
|
+
version of the alternative is not a weighing. One clearly outweighs: take it and
|
|
52
|
+
write the weighing with the choice — "I take X over Z: pro …, contro …".
|
|
53
|
+
Balanced, or turning on a user priority not on record: a **real doubt** — and it
|
|
54
|
+
turns on one whenever the options serve different needs of the actor, each better
|
|
55
|
+
at one the actor would notice in using the result (reading in a spreadsheet
|
|
56
|
+
against processing by a program, a quick answer against a complete one) and
|
|
57
|
+
none good enough at both, and nothing the user wrote ranks those needs — however
|
|
58
|
+
clear your own ranking feels. "The more natural reading" with no pros and cons
|
|
59
|
+
written is not a weighing. Design is yours until it trades off something the
|
|
60
|
+
user owns. Reserved approvals never enter this test (§The form of a question).
|
|
61
|
+
|
|
62
|
+
### Ask before the write
|
|
63
|
+
|
|
64
|
+
A real doubt that passes the legality test below is **owed**, not merely allowed:
|
|
65
|
+
the test separates a doubt from a search not yet run, it never licenses silence.
|
|
66
|
+
Ask it before the first write that would embed its answer — in an analysis, plan,
|
|
67
|
+
guide or code — grouped with every doubt open at that point, in one numbered set,
|
|
68
|
+
with the client's structured-question facility where it has one. Never defer a
|
|
69
|
+
doubt to the deliverable, where the user must find it inside the document; never
|
|
70
|
+
drip one question per turn. The round below is this rule's planned occasion. Fold
|
|
71
|
+
every answer into the artifact, citing the reply (§Reflect); an intent choice with
|
|
72
|
+
neither a source nor a weighing is a finding (`review.md` §Reviewing).
|
|
73
|
+
|
|
74
|
+
**Declared assumptions exist only where no question can be asked:**
|
|
75
|
+
|
|
76
|
+
- **Unattended** — the user is not reachable (the Unattended path above).
|
|
77
|
+
- **Delegated** — the user's own words handed you this choice ("your call"); quote
|
|
78
|
+
them. A general "go ahead" is not a delegation.
|
|
79
|
+
|
|
80
|
+
Each states **what it is taken from** and **the alternative it excludes**, and is
|
|
81
|
+
listed where the user will read it: an assumption recorded alone is a decision
|
|
82
|
+
wearing an assumption's clothes, and one nobody is shown is a silent decision. A
|
|
83
|
+
dispatched subagent returns its open points in its final output (`dispatch.md`);
|
|
84
|
+
the orchestrator treats them as its own candidate doubts (§When a doubt emerges).
|
|
85
|
+
|
|
86
|
+
### The legality test
|
|
87
|
+
|
|
88
|
+
Everywhere, a question is legal only when BOTH hold:
|
|
89
|
+
|
|
90
|
+
1. **Searched first, and the search is named — with its result.** The answer is
|
|
91
|
+
not on record and not derivable from the repo, `ai_docs/`, the Vision or the
|
|
92
|
+
conversation — and the question states the terms, tools and areas you searched
|
|
93
|
+
**and what they returned**. Same standard as a router verdict or an
|
|
94
|
+
architect-pass MISSING, and it carries their floors, not only their vocabulary
|
|
95
|
+
(`architect.md`, `guides.md`): a search whose scope does not cover the question
|
|
96
|
+
is not a search; a hit you did not open does not narrow anything; and **never
|
|
97
|
+
fake the search** — "I looked and found nothing" that names no terms and no
|
|
98
|
+
areas is a search not run. A question the repo can answer is a search
|
|
99
|
+
outsourced to the user.
|
|
100
|
+
2. **It names what is blocked.** The question states the specific decision or
|
|
101
|
+
fact that cannot be resolved without the reply — what you will do differently
|
|
102
|
+
depending on the answer. If nothing downstream changes with the answer, there
|
|
103
|
+
is no question.
|
|
104
|
+
|
|
105
|
+
Never legal:
|
|
106
|
+
|
|
107
|
+
- **Generic confirmation** — "shall I proceed?", "is this OK?". The process
|
|
108
|
+
authorizes proceeding; if a real risk motivates the ask, name the risk and the
|
|
109
|
+
fork — that is a blocking question and carries the form below.
|
|
110
|
+
- **Preference-fishing** — asking the user to pick among options that are
|
|
111
|
+
equivalent **in their effect on the benefit** and already decided by the
|
|
112
|
+
project's conventions. Cheapness to undo is NOT the test.
|
|
113
|
+
- **Re-asking the record** — goal, scope or constraints that an APPROVED Vision,
|
|
114
|
+
an earlier reply, or the request itself already states.
|
|
115
|
+
|
|
116
|
+
What questions are FOR — what the user uniquely owns: the benefit, priorities
|
|
117
|
+
between conflicting goods, non-goals, acceptance, and the approvals doctrine
|
|
118
|
+
reserves to them (Vision promotion and amendment, scope changes, proposal
|
|
119
|
+
acceptance, merge decisions). Facts about intent come from the user; facts about
|
|
120
|
+
the system come from search.
|
|
121
|
+
|
|
122
|
+
**Precedence, because both halves can fire at once:** this paragraph wins over
|
|
123
|
+
the "never legal" list above it. A choice the user uniquely owns is never
|
|
124
|
+
preference-fishing, however cheap it is to undo; the list reaches choices that
|
|
125
|
+
are *not* theirs.
|
|
126
|
+
|
|
127
|
+
### The form of a question
|
|
128
|
+
|
|
129
|
+
The approvals reserved above and every stop the doctrine mandates are asked
|
|
130
|
+
whatever you expect the answer: **legal by mandate**, never weighed, never
|
|
131
|
+
re-argued here. Unattended, they are never assumed: the work holds, unless the
|
|
132
|
+
mandating rule prescribes its own unattended handling (`review.md`'s gated rung
|
|
133
|
+
does).
|
|
134
|
+
|
|
135
|
+
**Exactly two mandating files prescribe their own hand-over, and there the form
|
|
136
|
+
below does not apply** (two forms over one moment is the duplicate `review.md`
|
|
137
|
+
§Reviewing forbids): `debugging.md`'s circuit breaker — the minimal reproduction,
|
|
138
|
+
what was ruled out, the current best hypothesis; and `review.md`'s round cap —
|
|
139
|
+
the artifact plus the open findings. That list is closed. **Every other mandated
|
|
140
|
+
stop carries the form**, including one that names only its options and not its
|
|
141
|
+
evidence (`SKILL.md`'s Vision-Gate conflict names the two choices — the evidence
|
|
142
|
+
is still owed, and for a Vision conflict the quoted line IS the substance) and
|
|
143
|
+
one that prescribes nothing (`guides.md`'s guide proposal and its ingestion
|
|
144
|
+
bound). "The file mentions the moment" is not a prescription; only a stated
|
|
145
|
+
hand-over is.
|
|
146
|
+
|
|
147
|
+
A question outside the planned occasions carries the **blocking form**, one line
|
|
148
|
+
per element — surface both sides with their evidence, never silently pick one:
|
|
149
|
+
|
|
150
|
+
- the fork: the options, each with its pros and cons, and what each implies for
|
|
151
|
+
the work;
|
|
152
|
+
- the evidence: what you searched, read or tried, and what it leaves undecided;
|
|
153
|
+
- why no assumption survives — why the weighing does not settle it, and what a
|
|
154
|
+
wrong pick costs; a reserved approval or a mandated stop cites the approval or
|
|
155
|
+
the mandate instead;
|
|
156
|
+
- why it is the user's call — what makes the remainder intent, priority or
|
|
157
|
+
approval rather than a derivable fact;
|
|
158
|
+
- what stays blocked until answered.
|
|
159
|
+
|
|
160
|
+
## The round
|
|
161
|
+
|
|
162
|
+
**Derive before asking.** Answer each of the six from the record first — the
|
|
163
|
+
Vision, `ai_docs/`, the conversation; the code answers facts and constraints,
|
|
164
|
+
never the goal, scope or acceptance. Ask only the real doubts, and carry the
|
|
165
|
+
derived answers into the round with their source or weighing ("I take X from Y;
|
|
166
|
+
the questions below are what no source settles"), not re-confirmed one by one.
|
|
167
|
+
|
|
168
|
+
Ask ONE structured set of questions, not a drip of follow-ups. Keep each
|
|
169
|
+
question short and numbered; offer concrete options where a real choice
|
|
170
|
+
exists, each with its pros and cons (this narrows the reply and speeds up the
|
|
171
|
+
round). Cover:
|
|
172
|
+
|
|
173
|
+
1. **Goal / benefit** — what problem this closes and why now. The answer must
|
|
174
|
+
name what the actor *obtains*, not a mechanism: "a dashboard" is not an
|
|
175
|
+
answer to "never lose the thread" — ask again until it is a benefit
|
|
176
|
+
(`vision.md`: the Vision is the distilled benefit; solutions and preferences
|
|
177
|
+
are what gets filtered out).
|
|
178
|
+
2. **Actors** — who interacts with this: their role, primary goal, what
|
|
179
|
+
"good UX" means to them, and the surfaces they use today for this job
|
|
180
|
+
(the screens, commands or endpoints they operate — the Interface
|
|
181
|
+
Contract's as-is starts here; skip the surface half when no actor-facing
|
|
182
|
+
surface is in scope) and, at responsibility level, what happens when they
|
|
183
|
+
act (which components respond) — the Interface Contract's flow starts here. These become the Vision's `## Actors`; each
|
|
184
|
+
use-case below attaches to one (actor = who they are, use-case = what
|
|
185
|
+
they do). Skip only when an approved Vision already names them.
|
|
186
|
+
3. **Scope boundaries** — what is explicitly included in this unit of work.
|
|
187
|
+
4. **Non-goals** — what is explicitly excluded, so scope does not silently
|
|
188
|
+
creep in later.
|
|
189
|
+
5. **Constraints** — technical, compatibility, and security constraints that
|
|
190
|
+
bound the solution space.
|
|
191
|
+
6. **Acceptance signals** — how you and the user will both recognize the
|
|
192
|
+
work is done and correct.
|
|
193
|
+
|
|
194
|
+
## Reflect
|
|
195
|
+
|
|
196
|
+
Fold the answers into the ANALYSIS `## Objective` / `## Vision-Alignment`
|
|
197
|
+
sections (Standalone) or into the D-UC/E-ISP (Hybrid) — do not leave them
|
|
198
|
+
sitting only in the chat transcript. The written document, not the
|
|
199
|
+
conversation, is what the next session and the next reviewer will read.
|
|
200
|
+
|
|
201
|
+
Run a second round only when an answer opens a real fork in the design (a
|
|
202
|
+
genuinely new question the first round could not have anticipated). Do not
|
|
203
|
+
run a second round to double-check answers that were already clear.
|
|
204
|
+
|
|
205
|
+
## Anti-patterns
|
|
206
|
+
|
|
207
|
+
- **Interrogation**: an endless list of questions, or drip-feeding one
|
|
208
|
+
question at a time across many turns instead of one structured round.
|
|
209
|
+
- **Deferring a doubt into the document**: writing a guess into the artifact
|
|
210
|
+
and leaving the user to find it there.
|
|
211
|
+
- **Collecting answers without folding them in**: getting replies in chat
|
|
212
|
+
and proceeding to design without writing them into the analysis document —
|
|
213
|
+
the next reader has no record of why the scope is what it is.
|
|
214
|
+
|
|
215
|
+
(The illegal question forms — generic confirmation, preference-fishing,
|
|
216
|
+
re-asking the record — are defined once, in `## The question discipline`.)
|
|
@@ -55,7 +55,7 @@ above is already satisfiable and no stop fires (the row still carries
|
|
|
55
55
|
rung 2 is not "usable" for this clause, it joins the question instead. When the best rung is gated and no
|
|
56
56
|
ungated rung works, the gate STOPS and asks: descending to rung 3 on silence is
|
|
57
57
|
illegal while a user is reachable. The stop is doctrine-mandated (legal by mandate,
|
|
58
|
-
`elicitation.md` §
|
|
58
|
+
`elicitation.md` §The form of a question) and carries that file's five-bullet
|
|
59
59
|
blocking form — its closed-list exemption covers this file's round-cap hand-over
|
|
60
60
|
only, not this stop. The question offers the gated rung(s) against the fallback, with what each
|
|
61
61
|
buys; states each higher rung's status (tried / unusable / gated) with the
|
|
@@ -335,6 +335,13 @@ When you are the reviewer:
|
|
|
335
335
|
statement is the proof the check ran; an unfalsifiable "I checked" is the review
|
|
336
336
|
theater this discipline exists to prevent (the reviewer-side twin of §Receiving's
|
|
337
337
|
silent-drop rule). Plain code reviews stay findings-only.
|
|
338
|
+
- **An unasked doubt is a finding (impact/solution-analysis & design reviews).** An
|
|
339
|
+
intent choice written with no owner-authored source and no weighing, a weighing
|
|
340
|
+
that names no rejected option or turns on an owner priority not on record, and a
|
|
341
|
+
fact or owner-held datum settled by a weighing instead of evidence are findings;
|
|
342
|
+
so is a cited source that does not say what the line claims. What makes a ground
|
|
343
|
+
or an assumption legal is each lens's `elicitation.md` §The question discipline —
|
|
344
|
+
cite it, never restate it. The fix is the question, not a better justification.
|
|
338
345
|
- **Restated facts (cite, never copy).** Every governance slot has ONE owning document
|
|
339
346
|
per project. A fact restated in the artifact under review when another document owns
|
|
340
347
|
it is a **finding**: the fix is a citation naming the owner, not a better copy. This
|
|
@@ -1574,6 +1574,13 @@ def cmd_stale(root, hybrid=False):
|
|
|
1574
1574
|
return rc # was: return 0 — MUST carry guide rc
|
|
1575
1575
|
use_git = git_available(root)
|
|
1576
1576
|
entry = entry_script()
|
|
1577
|
+
# The audit plan records the marks: its own edits are not a change to the area
|
|
1578
|
+
# that contains it. Counting them made a committed hash mark of that area
|
|
1579
|
+
# stale again, and every re-mark repeated the loop.
|
|
1580
|
+
try:
|
|
1581
|
+
plan_rel = f.resolve().relative_to(Path(root).resolve()).as_posix()
|
|
1582
|
+
except ValueError:
|
|
1583
|
+
plan_rel = None
|
|
1577
1584
|
# F-056: an ANALYZED row whose reference cannot be evaluated is UNVERIFIED,
|
|
1578
1585
|
# never fresh. Each `continue` below that skips such a row records it here;
|
|
1579
1586
|
# skipping silently is how a pruned reference printed `[ok]` over three areas.
|
|
@@ -1641,6 +1648,7 @@ def cmd_stale(root, hybrid=False):
|
|
|
1641
1648
|
except ValueError: # symlink out of the tree: report absolute, never crash
|
|
1642
1649
|
name = str(fp)
|
|
1643
1650
|
changed.append(name)
|
|
1651
|
+
changed = [c for c in changed if c != plan_rel]
|
|
1644
1652
|
if changed:
|
|
1645
1653
|
stale.append((rel, changed))
|
|
1646
1654
|
|