@antoneeo/agentic-sdlc-skill 1.49.0 → 1.50.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 CHANGED
@@ -2,6 +2,46 @@
2
2
 
3
3
  Tutte le modifiche significative a questa skill saranno documentate in questo file.
4
4
 
5
+ ## [1.50.0] - 2026-10-31
6
+
7
+ ### What's new
8
+
9
+ **You approve the design before any code is written.** On significant work, once the independent design review passes, the agent stops and shows you a short summary of the design: what the change does, for whom and through which surfaces, which files it touches, the risks and how they are handled, and what the review found. The work starts only after your yes, which the agent records in the unit's request record. A "go ahead" given before you saw the design does not count, and in a session with nobody to answer the unit waits for you. A design that is right but not what you meant is cheapest to fix before the code exists. If you work with devPNT, your acceptance of the design proposal there is this approval, and nothing else is asked.
10
+
11
+ **The npm page tells you what is new.** This section, at the top of the package page, now summarizes each version for the people who install it.
12
+
13
+ **From 1.49.0, published without notes:**
14
+ - **Fewer regressions on significant changes.** When an analysis states what must not break, the agent is reminded of it just before it edits that file, not only at the start of the work, and the reviewer has the list to check. It is a reminder and never blocks the work; for now it works on Claude Code.
15
+ - **The process checks can no longer be bypassed by accident.** Quoting a work level inside a sentence no longer counts as declaring it, and protected parts of the project stay protected when the agent changes folder.
16
+ - **You know what the project memory has not read yet.** The agent can tell how much of the project it has never examined (automatically in projects with a corpus, on request otherwise).
17
+ - **Defects found after the merge can be recorded** without distorting the review statistics.
18
+
19
+ #### What to do
20
+
21
+ **1. Update (everyone).** The changes arrive only with the update.
22
+ 1. Run `npm install -g @antoneeo/agentic-sdlc-skill@latest`, then `agentic-sdlc-install-skill`.
23
+ 2. Close and reopen your agent sessions: the new version loads only at startup.
24
+
25
+ To check: `npm ls -g @antoneeo/agentic-sdlc-skill` shows 1.50.0.
26
+
27
+ If you do not want the constraint reminder (Claude Code only, from 1.49.0): remove the entry that contains `constraints --hook` from `~/.claude/settings.json`. Later updates will not put it back.
28
+
29
+ **2. Approving the design (significant units).**
30
+ - **This concerns you if** you use the skill for significant (L3) work. Nothing to configure: after the design review passes, the agent asks whether to proceed. Answer yes to start the code, or say what to change; the design is then revised and, where the change touches what the review judged, reviewed again before you are asked again.
31
+ - **A unit already in progress.** Units started before 2026-10-31 are not affected. If a unit started on or after 2026-10-31 with an earlier version is already in progress or finished, `sdlc_check.py validate` shows a `[note]` saying it has `no design approval in its request record`. Why: the earlier version never asked you. To clear it, tell the agent that you approve the design as it was implemented; it records your words under a label that begins `design approved` (for example `design approved after implementation`). The note never fails a check, so you can also leave it.
32
+ - **To check:** on your next significant unit, the agent stops after the design review and asks you before any code starts.
33
+
34
+ **3. Protected folders in a repository with several `ai_docs/` (only if you use them; from 1.49.0).**
35
+ - **This concerns you if** your agent settings contain `gate --hook --protected` and the repository has more than one `ai_docs/` folder, for example a package with its own.
36
+ - **Why:** protected paths are now read from the `ai_docs/` nearest to the edited file. A path written from the repository root, such as `packages/api/src/auth`, no longer matches the files inside `packages/api`, so the agent could change them without an analysis.
37
+ - **Steps:** rewrite those paths from the package: `packages/api/src/auth` becomes `src/auth`. Note that `src/auth` then protects the folder with that name in every project that has its own `ai_docs/`.
38
+ - **To check:** in a session with no open analysis, ask the agent for a small change to a protected file. It must be refused.
39
+
40
+ ### Changed
41
+ - After the design review's final PASS, an L3 unit stops: the agent presents a short summary of the design (what it does, for whom and through which surfaces, what it touches, threats, the review's verdict) and asks the owner whether to proceed. Only a yes, recorded in the request record under a label that begins `design approved`, moves the ANALYSIS to `IN_PROGRESS`. An instruction given before the design was shown is not an approval; unattended, the unit is `BLOCKED on the user`; in Hybrid the approval in devPNT counts. The rule is in `review.md`; `SKILL.md`, `elicitation.md` and `templates.md` point at it (F-087).
42
+ - The shared validator: `validate` notes an L3 ANALYSIS in implementation, started on or after 2026-10-31, whose request record holds no entry whose label begins `design approved`. It is a `[note]`: `--strict` exits as before. The `gate` refusal message adds that at L3 the ANALYSIS goes `IN_PROGRESS` only after the owner's design approval; its exit codes are unchanged (F-087).
43
+ - The package's npm page (its README) gains a "What's new in <version>" section right after the introduction, written for the people who install the package and linking the full CHANGELOG. It appears from the first version that carries one; each version's notes are the `### What's new` at the top of its CHANGELOG section (F-070). The "Shared project memory" section moves from the top of the page to just after the features, unchanged.
44
+
5
45
  ## [1.49.0] - 2026-10-27
6
46
 
7
47
  ### Added
package/README.md CHANGED
@@ -1,22 +1,44 @@
1
1
  # Agentic SDLC Skill for Claude Code, Gemini CLI, Google Antigravity & Codex
2
2
 
3
- ## Shared project memory
3
+ `agentic-sdlc` is a Documentation-First SDLC protocol for AI coding agents. It supports Claude Code, Codex, Gemini CLI, Google Antigravity 2.0, Cursor/Windsurf-style project instructions, and optional devPNT governance.
4
4
 
5
- All four lenses include project memory by default; install the lens you need,
6
- not a second skill just for recall. `index` registers guides, decisions and plans
7
- in the docs root's `memory/INDEX.md`, linking originals without copying them.
8
- `recall "onboarding"` finds related metadata across domains; optional
9
- `topics: [onboarding]` links documents by subject. Read the originals for authority,
10
- status and evidence: discovery is not approval or proof of implementation.
5
+ <!-- whats-new:begin -->
6
+ <!-- generated by scripts/whats_new.js from CHANGELOG.md: edit the CHANGELOG, then run node scripts/whats_new.js --write -->
7
+ ## What's new in 1.50.0
11
8
 
12
- Registration happens at `index`/documentation closure, not through a background
13
- watcher. Existing projects acquire the catalog on their next `index`; `recall`
14
- also sees live metadata. The KB lens remains the specialist for ingestion and
15
- taxonomy. Marketing retains its numerical validators. See the skill's `memory.md`.
16
- Vendoring requires all three files: the entry point, `sdlc_core.py`, `knowledge.py`.
9
+ **You approve the design before any code is written.** On significant work, once the independent design review passes, the agent stops and shows you a short summary of the design: what the change does, for whom and through which surfaces, which files it touches, the risks and how they are handled, and what the review found. The work starts only after your yes, which the agent records in the unit's request record. A "go ahead" given before you saw the design does not count, and in a session with nobody to answer the unit waits for you. A design that is right but not what you meant is cheapest to fix before the code exists. If you work with devPNT, your acceptance of the design proposal there is this approval, and nothing else is asked.
17
10
 
11
+ **The npm page tells you what is new.** This section, at the top of the package page, now summarizes each version for the people who install it.
18
12
 
19
- `agentic-sdlc` is a Documentation-First SDLC protocol for AI coding agents. It supports Claude Code, Codex, Gemini CLI, Google Antigravity 2.0, Cursor/Windsurf-style project instructions, and optional devPNT governance.
13
+ **From 1.49.0, published without notes:**
14
+ - **Fewer regressions on significant changes.** When an analysis states what must not break, the agent is reminded of it just before it edits that file, not only at the start of the work, and the reviewer has the list to check. It is a reminder and never blocks the work; for now it works on Claude Code.
15
+ - **The process checks can no longer be bypassed by accident.** Quoting a work level inside a sentence no longer counts as declaring it, and protected parts of the project stay protected when the agent changes folder.
16
+ - **You know what the project memory has not read yet.** The agent can tell how much of the project it has never examined (automatically in projects with a corpus, on request otherwise).
17
+ - **Defects found after the merge can be recorded** without distorting the review statistics.
18
+
19
+ #### What to do
20
+
21
+ **1. Update (everyone).** The changes arrive only with the update.
22
+ 1. Run `npm install -g @antoneeo/agentic-sdlc-skill@latest`, then `agentic-sdlc-install-skill`.
23
+ 2. Close and reopen your agent sessions: the new version loads only at startup.
24
+
25
+ To check: `npm ls -g @antoneeo/agentic-sdlc-skill` shows 1.50.0.
26
+
27
+ If you do not want the constraint reminder (Claude Code only, from 1.49.0): remove the entry that contains `constraints --hook` from `~/.claude/settings.json`. Later updates will not put it back.
28
+
29
+ **2. Approving the design (significant units).**
30
+ - **This concerns you if** you use the skill for significant (L3) work. Nothing to configure: after the design review passes, the agent asks whether to proceed. Answer yes to start the code, or say what to change; the design is then revised and, where the change touches what the review judged, reviewed again before you are asked again.
31
+ - **A unit already in progress.** Units started before 2026-10-31 are not affected. If a unit started on or after 2026-10-31 with an earlier version is already in progress or finished, `sdlc_check.py validate` shows a `[note]` saying it has `no design approval in its request record`. Why: the earlier version never asked you. To clear it, tell the agent that you approve the design as it was implemented; it records your words under a label that begins `design approved` (for example `design approved after implementation`). The note never fails a check, so you can also leave it.
32
+ - **To check:** on your next significant unit, the agent stops after the design review and asks you before any code starts.
33
+
34
+ **3. Protected folders in a repository with several `ai_docs/` (only if you use them; from 1.49.0).**
35
+ - **This concerns you if** your agent settings contain `gate --hook --protected` and the repository has more than one `ai_docs/` folder, for example a package with its own.
36
+ - **Why:** protected paths are now read from the `ai_docs/` nearest to the edited file. A path written from the repository root, such as `packages/api/src/auth`, no longer matches the files inside `packages/api`, so the agent could change them without an analysis.
37
+ - **Steps:** rewrite those paths from the package: `packages/api/src/auth` becomes `src/auth`. Note that `src/auth` then protects the folder with that name in every project that has its own `ai_docs/`.
38
+ - **To check:** in a session with no open analysis, ask the agent for a small change to a protected file. It must be refused.
39
+
40
+ Full history: [CHANGELOG](https://github.com/Antoneeo/agentic-sdlc-skill/blob/main/CHANGELOG.md)
41
+ <!-- whats-new:end -->
20
42
 
21
43
  ## Key Features
22
44
 
@@ -33,12 +55,27 @@ Vendoring requires all three files: the entry point, `sdlc_core.py`, `knowledge.
33
55
  - **Self-activating**: a SessionStart hook emits repo-sourced orientation; a deterministic self-eval battery guards the skill's own doctrine as the release gate.
34
56
  - **Standalone complete**: works fully with local `ai_docs/` without requiring devPNT.
35
57
  - **devPNT symbiosis**: when devPNT is available, Master Plan, Action Plan, M-VISION, and governed artifacts become the authoritative planning layer, and every governed artifact passes an independent agent review before it is proposed; devPNT itself performs no review — it is where you review and approve.
36
- - **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, who receives the whole review mandate in a fixed block copied verbatim, never a paraphrase of it. 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.
58
+ - **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, who receives the whole review mandate in a fixed block copied verbatim, never a paraphrase of it. 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. After the design review passes, the owner approves the design before any code is written.
37
59
  - **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?".
38
60
  - **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 docs site generator `scripts/docs_site.py` and its page `docs_site/`, and the `LICENSE` and `NOTICE` it ships under.
39
61
  - **Docs site** (`scripts/docs_site.py --root <project> [--open] [--zip <file>]`): a static, offline, read-only website of what the agent reads in the project — reading guide, Vision, rules, documents, open work with each next step, analyses and, with a knowledge base, the topic map, each fact with its exact source passage, and the source documents. Written to `.docs-site/` (added to `.gitignore` on the first run), outside `ai_docs/`; nothing is ranked or recommended.
40
62
  - **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`, `review-map` (code lens: classes the files of a change for the merge review brief), `constraints` (code lens: a unit's constraints, or those binding a file). `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.
41
63
 
64
+ ## Shared project memory
65
+
66
+ All four lenses include project memory by default; install the lens you need,
67
+ not a second skill just for recall. `index` registers guides, decisions and plans
68
+ in the docs root's `memory/INDEX.md`, linking originals without copying them.
69
+ `recall "onboarding"` finds related metadata across domains; optional
70
+ `topics: [onboarding]` links documents by subject. Read the originals for authority,
71
+ status and evidence: discovery is not approval or proof of implementation.
72
+
73
+ Registration happens at `index`/documentation closure, not through a background
74
+ watcher. Existing projects acquire the catalog on their next `index`; `recall`
75
+ also sees live metadata. The KB lens remains the specialist for ingestion and
76
+ taxonomy. Marketing retains its numerical validators. See the skill's `memory.md`.
77
+ Vendoring requires all three files: the entry point, `sdlc_core.py`, `knowledge.py`.
78
+
42
79
  ## Installation
43
80
 
44
81
  ### Via npm
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentic-sdlc-skill",
3
- "version": "1.49.0",
3
+ "version": "1.50.0",
4
4
  "description": "Documentation-First SDLC protocol with triage, Vision governance and optional devPNT integration.",
5
5
  "author": "Antonio Pinto (https://github.com/Antoneeo)"
6
6
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@antoneeo/agentic-sdlc-skill",
3
- "version": "1.49.0",
3
+ "version": "1.50.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",
package/scripts/init.js CHANGED
@@ -203,16 +203,16 @@ in the skill's \`routing.md\`: it decides which lens's method and validation rul
203
203
  that unit. L1 never reaches it. Never refer to a document whose meaning differs by lens
204
204
  ("threat model", "vision", \`principles.md\`, \`handoff.md\`) by its bare name.
205
205
 
206
- Select the owning lens by the unit's purpose, then apply only its risk scale.
207
- The project's always-on pointer stays intact: consult the selected skill rather than
208
- merging multiple mandatory ladders. All lenses already carry shared project memory
209
- (\`memory.md\`); another installation is not needed for cross-domain recall.
206
+ Select the owning lens by the unit's purpose, then apply only its risk scale.
207
+ The project's always-on pointer stays intact: consult the selected skill rather than
208
+ merging multiple mandatory ladders. All lenses already carry shared project memory
209
+ (\`memory.md\`); another installation is not needed for cross-domain recall.
210
210
  This file is NOT auto-loaded by any client: it is a note for you, deliberately additive.
211
- Delete this note once the routing pointer is integrated.
211
+ Delete this note once the routing pointer is integrated.
212
212
  `, 'multi-lens routing note');
213
213
  if (wrote && protocolPreexisting) {
214
214
  console.log(' ⚠️ A protocol pointer already existed and was NOT overwritten.');
215
- console.log(' Integrate the routing pointer from AGENTIC_MULTI_LENS.md; keep one risk scale per unit.');
215
+ console.log(' Integrate the routing pointer from AGENTIC_MULTI_LENS.md; keep one risk scale per unit.');
216
216
  }
217
217
  }
218
218
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: agentic-sdlc
3
- version: 1.49.0
3
+ version: 1.50.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
@@ -195,7 +195,7 @@ Standalone L3:
195
195
  - Build the Impact/solution **on** the Vision, the use-cases/user-needs and the Security & Threat Model — read and trace to them first, and state the trace (which actor / use-case / threat / benefit each part serves) so the closure review (`review.md`) can verify conformance. Do not draft the Impact in isolation.
196
196
  - For a feature known to span multiple milestones, also create `ai_docs/vision/features/VISION_[feature].md`; the retroactive case (extract it when the SECOND `ANALYSIS_*` on a theme appears) is in Write Triggers.
197
197
 
198
- **Design review gate — the design is reviewed BEFORE any code (L3).** Close Phase 3 by handing the finished ANALYSIS to an *independent* reviewer: the procedure, the independence ladder, the round cap and the log row are `review.md` §When a review is due, moment 1 — follow it there, it is not restated here. Why the moment exists: the closure review can prove the code matches the design, never that the design was right, and the author is structurally blind to what their own design omitted. In Hybrid the same review runs on the `E-ISP`/`E-TDD`, by the client's agent, and its PASS precedes the proposal to devPNT, where the human reviews — `review.md` §When a review is due owns the order.
198
+ **Design review gate — the design is reviewed BEFORE any code (L3).** Close Phase 3 by handing the finished ANALYSIS to an *independent* reviewer: the procedure, the independence ladder, the round cap and the log row are `review.md` §When a review is due, moment 1 — follow it there, it is not restated here. Why the moment exists: the closure review can prove the code matches the design, never that the design was right, and the author is structurally blind to what their own design omitted. In Hybrid the same review runs on the `E-ISP`/`E-TDD`, by the client's agent, and its PASS precedes the proposal to devPNT, where the human reviews — `review.md` §When a review is due owns the order. In Standalone the final PASS is followed by the owner's approval of the design, asked and recorded before any code (same section).
199
199
 
200
200
  Hybrid L3:
201
201
  - Restore the Master Plan, Action Plan and linked documents.
@@ -206,7 +206,7 @@ Hybrid L3:
206
206
 
207
207
  ### 4. Development and Testing
208
208
 
209
- - Implement only after the documentation gate required by the level. **Flip the ANALYSIS frontmatter `PLANNED` → `IN_PROGRESS` when implementation starts** — that flip is what `gate` and the handoff registry key on, and nothing else performs it.
209
+ - Implement only after the documentation gate required by the level; at L3 it ends with the owner's design approval (`review.md` §When a review is due). **Flip the ANALYSIS frontmatter `PLANNED` → `IN_PROGRESS` when implementation starts** — that flip is what `gate` and the handoff registry key on, and nothing else performs it.
210
210
  - Isolate the work: run an L3 change on its own branch. In Hybrid, prefer a git worktree from the start — a running devPNT server locks `.devpnt/*.db` and blocks in-place branch switches/merges in the primary worktree. A session that may run while another session uses the same checkout works in its **own git worktree**, and never switches branch, stashes, resets or runs `index` in a checkout another session may be using. Parallel work also shares ids: choose a new unit's id **after fetching**, as the first id free on every branch and tag the checkout can see (`check` names a collision while the unit is open).
211
211
  - Modify surgically, consistently with the plan.
212
212
  - Implementation work follows the TDD discipline in `tdd.md` (RED/GREEN/REFACTOR — the L2/L3 default; record the reason when it does not apply).
@@ -34,11 +34,11 @@ proof that it caused this incident.
34
34
  Do not repeat an invalidated hypothesis unless new evidence reopens it.
35
35
 
36
36
  3. **Test and trace the mechanism.** Reproduce and isolate the smallest faithful
37
- failing case when feasible; bisect inputs, paths or changes when informative.
38
- Skip a reproduction already known to omit the incident's causal conditions;
39
- choose a faithful alternative or disclose the gap. Stop diagnostic checks when
40
- further results cannot change the causal or fix decision; this does not replace
41
- the regression and recovery verification in step 5.
37
+ failing case when feasible; bisect inputs, paths or changes when informative.
38
+ Skip a reproduction already known to omit the incident's causal conditions;
39
+ choose a faithful alternative or disclose the gap. Stop diagnostic checks when
40
+ further results cannot change the causal or fix decision; this does not replace
41
+ the regression and recovery verification in step 5.
42
42
  If the incident is intermittent or inaccessible, use captured traces and
43
43
  targeted diagnostic observations instead of declaring investigation impossible.
44
44
  Add minimal instrumentation when evidence is insufficient. Prefer read-only
@@ -126,8 +126,8 @@ Never legal:
126
126
 
127
127
  What questions are FOR — what the user uniquely owns: the benefit, priorities
128
128
  between conflicting goods, non-goals, acceptance, and the approvals doctrine
129
- reserves to them (Vision promotion and amendment, scope changes, proposal
130
- acceptance, merge decisions). Facts about intent come from the user; facts about
129
+ reserves to them (Vision promotion and amendment, design approval at L3, scope
130
+ changes, proposal acceptance, merge decisions). Facts about intent come from the user; facts about
131
131
  the system come from search.
132
132
 
133
133
  **Precedence, because both halves can fire at once:** this paragraph wins over
@@ -198,6 +198,34 @@ is a belief: the row would say a gate ran and never whether it could do its job,
198
198
  the correlation with `revise_rounds` and `findings_real` — the only evidence the
199
199
  policy pays — could not be drawn.
200
200
 
201
+ **The owner approves the design before the work starts (L3).** The reviewer judges
202
+ whether the design holds and serves the Vision; only the owner can say whether it is
203
+ what they meant beyond what the Vision wrote, and an intent error costs least before
204
+ the work exists. So the final design PASS — final once any scoped re-review it owed
205
+ has passed (§Review-driven corrections) — does not start the work: the agent
206
+ presents the design and asks the owner whether to proceed, in the form
207
+ `elicitation.md` §The form of a question gives a reserved approval. The presentation
208
+ is a short summary — what the change does (the Functional Spec, or the lens's
209
+ equivalent), for whom and through which surfaces (use cases, contract), what it
210
+ touches (Impact), the threats and their mitigations, the review's verdict with any
211
+ open findings — and the path of the full design. At the round cap, the hand-over the
212
+ cap prescribes, followed by this one question, takes the place of the form, and the
213
+ owner's answer settles both. An approval is recorded verbatim in the request record
214
+ under a label that begins `design approved`; a no or a correction takes its own
215
+ label, and the design goes back — where the revision changes what the review judged,
216
+ moment 1 runs again on that part first (the delta rule above). Only after the
217
+ approval does the ANALYSIS go `PLANNED` → `IN_PROGRESS` and the work start: code,
218
+ drafting or production, by lens. An instruction given before the design was shown
219
+ ("carry on", "do the whole unit") does not approve it. Where a lens's own phases
220
+ already have the owner approve the design — the marketing lens's strategy USER GATE
221
+ — that gate is this approval, never a second question, and the lens's own unattended
222
+ path applies. Otherwise, unattended, the unit is `BLOCKED on the user`
223
+ (`elicitation.md` Unattended path), never approved by assumption; a late arrival
224
+ (moment 1b) asks before any further work. Hybrid: the owner's approval of the
225
+ `E-ISP`/`E-TDD` proposal in devPNT, under devPNT's own authorization rules, is this
226
+ approval. In Standalone, `validate` notes an L3 ANALYSIS in implementation, started
227
+ on or after 2026-10-31, whose request record holds no `design approved` entry.
228
+
201
229
  **One schema for both modes**, meaning one required CORE plus each mode's own
202
230
  **mode-specific** realization columns. The core is what both modes actually share: `date`, `doc_key`,
203
231
  `tier`, `model`, `findings_raised`, `findings_real`, `verdict`, `revise_rounds`.
@@ -100,6 +100,10 @@ CHRONOLOGY_EPOCH = "2026-10-18"
100
100
  # filled '## Guide check'. The day AFTER the rule was written, so the analyses
101
101
  # opened that day by parallel units (which never saw the template) stay quiet.
102
102
  GUIDE_CHECK_EPOCH = "2026-10-24"
103
+ # Owner design approval (F-087): an L3 started on/after this date owes a request-
104
+ # record entry labelled `design approved` before implementation. The day AFTER the
105
+ # rule was written, like GUIDE_CHECK_EPOCH.
106
+ DESIGN_APPROVAL_EPOCH = "2026-10-31"
103
107
  NEXT_MAX_CHARS = 240 # this repository's longest `next:` was 214 at the epoch
104
108
  ID_SCAN_MAX_REFS = 300 # A3 is skipped above it (one advisory says so, T9)
105
109
  ID_SCAN_REFS_PER_CALL = 50 # keeps one git command line far below 32k chars
@@ -1479,17 +1483,50 @@ def id_advisories(root):
1479
1483
  return out
1480
1484
 
1481
1485
 
1482
- def design_review_due(meta):
1483
- """True when an L3 ANALYSIS owes a design-review row (review.md moment 1):
1484
- implementation has started or finished, and it began on/after the gate
1485
- shipped. PLANNED is exempt -- the review is due at the END of Phase 3, so an
1486
- analysis still being drafted is not late."""
1486
+ def _l3_in_work_since(meta, epoch):
1487
+ """True when an L3 ANALYSIS is in implementation or done and began on/after
1488
+ `epoch` (an ISO date string)."""
1487
1489
  if meta.get("level", "").upper() != "L3":
1488
1490
  return False
1489
1491
  if meta.get("status") not in ("IN_PROGRESS", "COMPLETED"):
1490
1492
  return False
1491
1493
  started = parse_iso((meta.get("start_date") or "").strip().strip("'\""))
1492
- return started is not None and started >= parse_iso(DESIGN_REVIEW_EPOCH)
1494
+ return started is not None and started >= parse_iso(epoch)
1495
+
1496
+
1497
+ def design_review_due(meta):
1498
+ """True when an L3 ANALYSIS owes a design-review row (review.md moment 1):
1499
+ implementation has started or finished, and it began on/after the gate
1500
+ shipped. PLANNED is exempt -- the review is due at the END of Phase 3, so an
1501
+ analysis still being drafted is not late."""
1502
+ return _l3_in_work_since(meta, DESIGN_REVIEW_EPOCH)
1503
+
1504
+
1505
+ def design_approval_due(meta):
1506
+ """True when an L3 ANALYSIS owes the owner's design approval (review.md
1507
+ section When a review is due): in implementation or done, begun on/after
1508
+ DESIGN_APPROVAL_EPOCH. PLANNED is exempt -- the question comes after the PASS."""
1509
+ return _l3_in_work_since(meta, DESIGN_APPROVAL_EPOCH)
1510
+
1511
+
1512
+ def requests_naming(root, analysis_name):
1513
+ """The request records whose `analysis:` field names this ANALYSIS file."""
1514
+ req = ai_path(root, "audit", "requests")
1515
+ if not req.is_dir():
1516
+ return []
1517
+ return [r for r in sorted(req.glob("REQUEST_*.md"))
1518
+ if str(load_frontmatter(read_text(r).splitlines()).get("analysis") or "")
1519
+ .strip().strip("'\"`") == analysis_name]
1520
+
1521
+
1522
+ def design_approval_logged(root, analysis_name):
1523
+ """True when a request record naming this ANALYSIS has an entry whose LABEL
1524
+ begins `design approved` (case-insensitive). Only the label is read, never
1525
+ the quoted words: a quotation is data, and a 'design approved?' inside a
1526
+ refusal approves nothing."""
1527
+ return any(label.lower().startswith("design approved")
1528
+ for r in requests_naming(root, analysis_name)
1529
+ for _, _, label, _ in request_entries(read_text(r))[0])
1493
1530
 
1494
1531
 
1495
1532
  def review_logged(root, analysis_name):
@@ -1801,6 +1838,12 @@ def cmd_validate(root, strict=False, hybrid=False):
1801
1838
  advisories.append(f"{rel}: L3 in implementation with no design-review row in "
1802
1839
  f"{review_log_rel()} -- the design was reviewed by nobody but its "
1803
1840
  "author before code was written (review.md moment 1)")
1841
+ if (not hybrid and design_approval_due(meta)
1842
+ and not design_approval_logged(root, p.name)):
1843
+ advisories.append(f"{rel}: L3 in implementation with no design approval in its "
1844
+ "request record (no entry whose label begins 'design approved') -- the "
1845
+ "owner never said the design was what they meant before the "
1846
+ "work started (review.md, When a review is due)")
1804
1847
  if ledger_due(meta) and not has_ledger_heading(text):
1805
1848
  advisories.append(f"{rel}: L3 without '## Capability Ledger' -- the architect pass "
1806
1849
  "left no record (architect.md); run it before the Impact")
@@ -2562,7 +2605,8 @@ def cmd_gate(args):
2562
2605
  sys.stderr.write(
2563
2606
  f"[sdlc gate] '{rel}' is on a protected path but no ANALYSIS_*.md is IN_PROGRESS. "
2564
2607
  "If your analysis already exists, set its frontmatter to 'status: IN_PROGRESS' "
2565
- "(that flip is what opens the gate); otherwise write it first (Phase 3).\n")
2608
+ "(that flip is what opens the gate; at L3, only after the owner's design approval, "
2609
+ "review.md); otherwise write it first (Phase 3).\n")
2566
2610
  return 2
2567
2611
 
2568
2612
 
@@ -3063,13 +3107,9 @@ def _unit_documents(root, p):
3063
3107
  reading or writing any of them is working on the unit."""
3064
3108
  slug = p.stem[len("ANALYSIS_"):]
3065
3109
  docs = {p, ai_path(root, "audit", f"HANDOFF_{slug}.md")}
3066
- req = ai_path(root, "audit", "requests")
3067
- if req.is_dir():
3068
- for r in req.glob("REQUEST_*.md"):
3069
- meta = load_frontmatter(read_text(r).splitlines())
3070
- if str(meta.get("analysis") or "").strip().strip("'\"`") == p.name:
3071
- docs.add(r)
3072
- docs.add(ai_path(root, "audit", f"HANDOFF_{r.stem[len('REQUEST_'):]}.md"))
3110
+ for r in requests_naming(root, p.name):
3111
+ docs.add(r)
3112
+ docs.add(ai_path(root, "audit", f"HANDOFF_{r.stem[len('REQUEST_'):]}.md"))
3073
3113
  return {_norm_rel(d.resolve().as_posix()) for d in docs}
3074
3114
 
3075
3115
 
@@ -377,7 +377,7 @@ checks: [marketing.funnel] # optional — extra portable checks to run on t
377
377
  the responsibility-level flow that deliver them; it NAMES the components in
378
378
  the flow, never their mechanism or file-level design (that is the Impact's
379
379
  vocabulary). After
380
- design approval, changing a contracted surface, flow or feedback is a scope
380
+ the owner's design approval (`review.md`), changing a contracted surface, flow or feedback is a scope
381
381
  change the USER approves: the solution may propose it, never enact it
382
382
  silently. Every contracted flow is covered by ## Test Strategy. -->
383
383
 
@@ -549,6 +549,9 @@ Context (agent): "the question it answered, quoted"
549
549
  entered only as `[NOT VERBATIM — from <source>]`, never as a quote.
550
550
  - **Unattended**: R1 quotes the trigger that started the unit, labelled as such.
551
551
  Declared assumptions are not owner statements and never enter the record.
552
+ - **Design approval** (L3): the owner's approval of the design is an entry whose
553
+ label begins `design approved`; a no or a correction takes its own label
554
+ (`review.md` §When a review is due).
552
555
  - **Hybrid**: always on the filesystem; governed artifacts cite entries too; an
553
556
  approval given in devPNT is named by its proposal, not quoted.
554
557