@antoneeo/agentic-sdlc-skill 1.32.0 → 1.33.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,80 @@
2
2
 
3
3
  Tutte le modifiche significative a questa skill saranno documentate in questo file.
4
4
 
5
+ ## [1.33.0] - 2026-09-12
6
+
7
+ ### Added
8
+ - **F-048: the capability floor, and what may be delegated at all.** A review
9
+ run below the capability its judgement needs certifies the omission it was
10
+ there to catch. `review.md` now carries a floor — which tier may run which
11
+ role — with the rule that a tier may be lowered only where a **threshold
12
+ signal** scores the cheap answer, and an arbitration for the case where the
13
+ only independent rung sits under it (independence wins, both facts recorded).
14
+ `dispatch.md` gains the family-wide delegation boundary, keyed on whether a
15
+ pass's output is falsifiable and on its read/report ratio: a task whose brief
16
+ cannot be expressed as POINTERS is not delegable. `REVIEW_LOG` gains a
17
+ `model` column — tiers are client-relative capability levels, never provider
18
+ names. External evidence: cascade routing pays only where a threshold signal
19
+ exists, and multi-agent execution costs 3-15x the tokens and buys context
20
+ isolation rather than savings.
21
+ - **F-049: the floor reaches the AUTHOR, not only the gates.** A session's
22
+ floor is the highest floor among the roles it performs itself, and authoring
23
+ a governed artifact is a deep-floor role — its output is judgement and
24
+ nothing downstream scores it. Fails open by construction: a session that
25
+ cannot determine its own tier owes nothing. The reliably working half is
26
+ addressed to the user, in each package's README.
27
+ - **F-050: `benefit` — what the process caught, beside what it costs to read.**
28
+ The product's central claim becomes computable instead of asserted. It always
29
+ exits 0 and carries no verdict: a measurement that can fail a build becomes a
30
+ target, and a targeted measurement stops measuring.
31
+ - **F-051: the Hybrid seam leaves the mandatory read.** The devPNT ownership
32
+ matrix, triage equivalence, feature-state mapping and shadow discipline move
33
+ to a triggered `hybrid.md`; `SKILL.md` keeps a pointer carrying the trigger
34
+ and the consequence. Conservation is guarded by a digest stamped in the moved
35
+ file and computed from the PRE-MOVE source.
36
+
37
+ ### Fixed
38
+ - **F-053: nine defects a review on a DIFFERENT model found after six units
39
+ shipped.** Each of those six was reviewed in isolation, and each by the same
40
+ model family as its author; six rows reading "all findings folded" are one
41
+ loop, not two eyes. The scoped re-review `review.md` mandates had never been
42
+ run for seven unreleased rows — it has been now, late, and each row states
43
+ both verdicts WITH its limitation, because 35 findings across six of them
44
+ have no surviving per-finding record and no late round can certify them.
45
+ `benefit` printed "the share above is a floor, not a ceiling", which is
46
+ backwards — folding the post-implementation rows LOWERS the design share —
47
+ and excluded 46 of 117 rows in silence; it now prints a computed interval,
48
+ names the rows that state no count, and prints the read-cost TOTAL with the
49
+ support files itemised, because printing only the two terms let the one that
50
+ FELL be quoted while the one that GREW stayed lumped.
51
+ - **The mechanism behind five of those units' probes, recorded as an ADR.** Ten
52
+ assertions across six units were satisfiable by a LITERAL, because the probe
53
+ looked for a SHAPE in the output instead of recomputing the VALUE and
54
+ comparing. Every probe over a computed output now recomputes and compares and
55
+ carries a positive control on synthetic data; every probe over prose is
56
+ labelled a wording anchor.
57
+
58
+ ### Read cost
59
+ - `SKILL.md` **-7.9%** (49,413 -> 45,518 B) for a Standalone session. A Hybrid
60
+ L3 session reads **+5.6%** (`SKILL.md` + `hybrid.md`), and the package's
61
+ support files grow **+10.8%**: the cost did not fall so much as MOVE out of
62
+ the file the report prints. Stated here because the Vision's ceremony clause
63
+ counts relocated cost.
64
+
65
+ ## [1.32.1] - 2026-09-06
66
+
67
+ ### Fixed
68
+ - **F-046 shipped a hook that wired nowhere.** `wireRemindHookInto` used the
69
+ ORIENT hook's opt-out marker (`orient-hook-wired`) as its own. That file is
70
+ present on every machine that ever installed the skill, so the installer read
71
+ it as "the user opted out of the per-turn reminder" and never wrote the hook —
72
+ for everyone. Two smaller faults in the same function: the marker was checked
73
+ BEFORE testing whether the hook was already present, and no marker was ever
74
+ written after a successful wire, so the real opt-out could never arm. The hook
75
+ now has its own `remind-hook-wired` marker, checked after the presence test and
76
+ written only on success. Regression pinned in `scripts/test_clients.js` (red
77
+ against 1.32.0: an orient-marked machine got no hook).
78
+
5
79
  ## [1.32.0] - 2026-09-06
6
80
 
7
81
  ### Added
package/README.md CHANGED
@@ -16,8 +16,8 @@
16
16
  - **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.
17
17
  - **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.
18
18
  - **Question discipline**: a question to the user is legal only when the agent searched first and names the search with its result, and names the decision the answer unblocks. Otherwise it proceeds on a declared assumption — same evidence duty, batched, never a stream of "shall I proceed?".
19
- - **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`, `ENFORCEMENT.md`, and the validator's two files, `scripts/sdlc_check.py` + `scripts/sdlc_core.py`.
20
- - **Mechanical checks**: optional validator for document structure, generated feature history, stale audit areas, and protected-path gates — `check`, `validate`, `index`, `stale`, `mark`, `gate`, `plan`, `orient`, `migrate`.
19
+ - **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`, and the validator's two files, `scripts/sdlc_check.py` + `scripts/sdlc_core.py`.
20
+ - **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.
21
21
 
22
22
  ## Installation
23
23
 
@@ -84,6 +84,7 @@ skills/agentic-sdlc-skill/
84
84
  ├── review.md
85
85
  ├── dispatch.md
86
86
  ├── routing.md
87
+ ├── hybrid.md
87
88
  ├── ENFORCEMENT.md
88
89
  └── scripts/
89
90
  ├── sdlc_check.py
@@ -138,3 +139,32 @@ For native Gemini Agent Skills, the npm installer now copies the skill folder in
138
139
  Created by **Antonio Pinto** ([GitHub](https://github.com/Antoneeo)).
139
140
 
140
141
  MIT (c) 2026 Antonio Pinto.
142
+
143
+ ## Which model to run it on
144
+
145
+ The skill names **capability tiers**, never providers — a model name in doctrine
146
+ rots at the next release. The binding is yours to make, and the rule is one line:
147
+
148
+ > **A session's floor is the highest floor among the roles it performs itself.**
149
+
150
+ Authoring a governed artifact — the vision, the analysis, the use cases, the
151
+ threat model — is a **deep-tier** role: its output is judgement, and nothing
152
+ downstream scores it. So a session that will DESIGN wants your strongest model.
153
+ A session that only executes an already-approved plan, or does small maintenance,
154
+ can sit a tier lower. The cheapest tier is the wrong choice for the main session
155
+ whatever the task, because the failure there is not a wrong answer — it is
156
+ **silently not applying the process**: a triage never run, a router verdict
157
+ declared without the lookup, a gate nobody noticed. That failure is invisible to
158
+ every check in here.
159
+
160
+ **The reviewer's tier is not automatically yours.** On some clients a subagent
161
+ inherits the session's model; on others it takes one from its own definition, so
162
+ a strong session can be reviewed by a weak one — and a weak session can buy a
163
+ strong review. Set it deliberately; the
164
+ `model` column in the review log is where the choice becomes visible.
165
+
166
+ **Avoid one combination**: authoring below the floor AND reviewing below the floor
167
+ on the same unit. One disclosed weakness is a disclosed weakness; two is an
168
+ artifact nobody competent ever read. Where your client offers nothing better, the
169
+ review still runs and both facts are recorded — a disclosed worst case beats
170
+ skipping the review.
@@ -1,6 +1,6 @@
1
- {
2
- "name": "agentic-sdlc-skill",
3
- "version": "1.32.0",
4
- "description": "Documentation-First SDLC protocol with triage, Vision governance and optional devPNT integration.",
5
- "author": "Antonio Pinto (https://github.com/Antoneeo)"
6
- }
1
+ {
2
+ "name": "agentic-sdlc-skill",
3
+ "version": "1.33.0",
4
+ "description": "Documentation-First SDLC protocol with triage, Vision governance and optional devPNT integration.",
5
+ "author": "Antonio Pinto (https://github.com/Antoneeo)"
6
+ }
package/package.json CHANGED
@@ -1,50 +1,51 @@
1
- {
2
- "name": "@antoneeo/agentic-sdlc-skill",
3
- "version": "1.32.0",
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
- "keywords": [
6
- "claude-code",
7
- "claude-skill",
8
- "gemini-cli",
9
- "skill",
10
- "sdlc",
11
- "documentation",
12
- "ai-agent"
13
- ],
14
- "author": "Antonio Pinto (https://github.com/Antoneeo)",
15
- "license": "MIT",
16
- "publishConfig": {
17
- "access": "public"
18
- },
19
- "bin": {
20
- "agentic-sdlc-init": "scripts/init.js",
21
- "agentic-sdlc-install-skill": "scripts/postinstall.js"
22
- },
23
- "scripts": {
24
- "postinstall": "node scripts/postinstall.js",
25
- "preuninstall": "node scripts/preuninstall.js"
26
- },
27
- "files": [
28
- "skills/agentic-sdlc-skill/SKILL.md",
29
- "skills/agentic-sdlc-skill/templates.md",
30
- "skills/agentic-sdlc-skill/architect.md",
31
- "skills/agentic-sdlc-skill/guides.md",
32
- "skills/agentic-sdlc-skill/vision.md",
33
- "skills/agentic-sdlc-skill/tdd.md",
34
- "skills/agentic-sdlc-skill/debugging.md",
35
- "skills/agentic-sdlc-skill/elicitation.md",
36
- "skills/agentic-sdlc-skill/review.md",
37
- "skills/agentic-sdlc-skill/dispatch.md",
38
- "skills/agentic-sdlc-skill/routing.md",
39
- "skills/agentic-sdlc-skill/ENFORCEMENT.md",
40
- "skills/agentic-sdlc-skill/scripts/sdlc_check.py",
41
- "skills/agentic-sdlc-skill/scripts/sdlc_core.py",
42
- "gemini-extension.json",
43
- "README.md",
44
- "CHANGELOG.md",
45
- "scripts/lib.js",
46
- "scripts/init.js",
47
- "scripts/postinstall.js",
48
- "scripts/preuninstall.js"
49
- ]
50
- }
1
+ {
2
+ "name": "@antoneeo/agentic-sdlc-skill",
3
+ "version": "1.33.0",
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
+ "keywords": [
6
+ "claude-code",
7
+ "claude-skill",
8
+ "gemini-cli",
9
+ "skill",
10
+ "sdlc",
11
+ "documentation",
12
+ "ai-agent"
13
+ ],
14
+ "author": "Antonio Pinto (https://github.com/Antoneeo)",
15
+ "license": "MIT",
16
+ "publishConfig": {
17
+ "access": "public"
18
+ },
19
+ "bin": {
20
+ "agentic-sdlc-init": "scripts/init.js",
21
+ "agentic-sdlc-install-skill": "scripts/postinstall.js"
22
+ },
23
+ "scripts": {
24
+ "postinstall": "node scripts/postinstall.js",
25
+ "preuninstall": "node scripts/preuninstall.js"
26
+ },
27
+ "files": [
28
+ "skills/agentic-sdlc-skill/SKILL.md",
29
+ "skills/agentic-sdlc-skill/templates.md",
30
+ "skills/agentic-sdlc-skill/architect.md",
31
+ "skills/agentic-sdlc-skill/guides.md",
32
+ "skills/agentic-sdlc-skill/vision.md",
33
+ "skills/agentic-sdlc-skill/tdd.md",
34
+ "skills/agentic-sdlc-skill/debugging.md",
35
+ "skills/agentic-sdlc-skill/elicitation.md",
36
+ "skills/agentic-sdlc-skill/review.md",
37
+ "skills/agentic-sdlc-skill/dispatch.md",
38
+ "skills/agentic-sdlc-skill/hybrid.md",
39
+ "skills/agentic-sdlc-skill/routing.md",
40
+ "skills/agentic-sdlc-skill/ENFORCEMENT.md",
41
+ "skills/agentic-sdlc-skill/scripts/sdlc_check.py",
42
+ "skills/agentic-sdlc-skill/scripts/sdlc_core.py",
43
+ "gemini-extension.json",
44
+ "README.md",
45
+ "CHANGELOG.md",
46
+ "scripts/lib.js",
47
+ "scripts/init.js",
48
+ "scripts/postinstall.js",
49
+ "scripts/preuninstall.js"
50
+ ]
51
+ }
package/scripts/lib.js CHANGED
@@ -672,14 +672,45 @@ function findRemindHook(settings) {
672
672
  // Writes the hook into `target` (an already-chosen settings file) unless it is
673
673
  // there or the user opted out. Returns a code, never throws: an installer must
674
674
  // not die on someone's settings file.
675
+ function remindMarkerPath() {
676
+ const root = process.env.AGENTIC_SDLC_KB_ROOT
677
+ || path.join(os.homedir(), '.agentic-sdlc');
678
+ return path.join(root, 'remind-hook-wired');
679
+ }
680
+ function remindMarkerTargets() {
681
+ try {
682
+ return fs.readFileSync(remindMarkerPath(), 'utf8')
683
+ .split(/\r?\n/).map((x) => x.trim()).filter(Boolean);
684
+ } catch (e) {
685
+ return [];
686
+ }
687
+ }
688
+ function remindMarkerHas(target) {
689
+ return remindMarkerTargets().some((t) => pathsEqual(t, target));
690
+ }
691
+ function remindMarkerAdd(target) {
692
+ try {
693
+ if (remindMarkerHas(target)) return;
694
+ fs.mkdirSync(path.dirname(remindMarkerPath()), { recursive: true });
695
+ fs.appendFileSync(remindMarkerPath(), target + String.fromCharCode(10), 'utf8');
696
+ } catch (e) { /* fail-open */ }
697
+ }
698
+
675
699
  function wireRemindHookInto(target, python, validator) {
676
700
  if (!python) return { code: 'no-python' };
677
701
  if (!validator || ORIENT_UNSAFE_IN_PATH.test(validator)) return { code: 'unsafe-path', validator };
678
702
  const state = orientSettingsState(target);
679
703
  if (!state.ok) return { code: 'malformed', target, why: state.why };
680
- if (orientMarkerHas(target)) return { code: 'opted-out', target };
681
- const settings = state.settings;
682
- const existing = findRemindHook(settings);
704
+ const settings0 = state.settings;
705
+ // Order matters, and the first version had it wrong too: the hook being
706
+ // PRESENT is `already`, and only its ABSENCE plus our marker means the user
707
+ // removed it -- a standing opt-out. Marker-first would refuse to re-check a
708
+ // hook someone still has.
709
+ const present = findRemindHook(settings0);
710
+ if (present) return { code: 'already', target, command: present };
711
+ if (remindMarkerHas(target)) return { code: 'opted-out', target };
712
+ const settings = settings0;
713
+ const existing = null;
683
714
  if (existing) return { code: 'already', target, command: existing };
684
715
  const command = remindHookCommand(python, validator);
685
716
  if (!settings.hooks) settings.hooks = {};
@@ -693,6 +724,7 @@ function wireRemindHookInto(target, python, validator) {
693
724
  } catch (e) {
694
725
  return { code: 'write-failed', target, command, error: e.message };
695
726
  }
727
+ remindMarkerAdd(target);
696
728
  return { code: 'wired', target, command };
697
729
  }
698
730
 
@@ -718,6 +750,8 @@ module.exports = {
718
750
  wireOrientHook,
719
751
  wireRemindHookInto,
720
752
  wireGlobalRemindHook,
753
+ remindMarkerHas,
754
+ remindMarkerAdd,
721
755
  remindHookCommand,
722
756
  findRemindHook,
723
757
  wireGlobalOrientHook,
@@ -57,7 +57,7 @@ Semantics: exit code 2 + message on stderr ⇒ the write is blocked and the mess
57
57
  - The paths in `--protected` are prefixes relative to the project root, separated by `;`.
58
58
  - `ai_docs/`, `tests/` and `test/` are always excluded from blocking.
59
59
  - The hook assumes the working directory is the project root (standard behavior of Claude Code hooks).
60
- - **Hybrid/devPNT projects**: add `--hybrid` to the gate command. Governed designs live in the devPNT DB, so the gate also unlocks when an approved E-TDD shadow (`ai_docs/solutions/SHADOW_*tdd*.md`, exported before implementation — see the SKILL.md shadow discipline) is present. Without the flag the gate would block legitimate governed work. The flag is deliberately explicit: never auto-detected.
60
+ - **Hybrid/devPNT projects**: add `--hybrid` to the gate command. Governed designs live in the devPNT DB, so the gate also unlocks when an approved E-TDD shadow (`ai_docs/solutions/SHADOW_*tdd*.md`, exported before implementation — see `hybrid.md` §Shadow discipline) is present. Without the flag the gate would block legitimate governed work. The flag is deliberately explicit: never auto-detected.
61
61
 
62
62
  ## 4. SessionStart hook (orientation, recommended default)
63
63
 
@@ -216,3 +216,12 @@ It aggregates the test files (`test_plan.py` + `test_session_start.py` + `test_s
216
216
  **Optional CI** (same shape as §2, not mandatory): add a `run:` step invoking the `unittest discover` command above.
217
217
 
218
218
  **T10 note:** if you copied the validator (both files) and the `test_*.py` battery into the repo for CI, that copy is authoritative — keep it current when you update the skill.
219
+
220
+ ## `benefit` is a report, never a CI gate
221
+
222
+ `sdlc_check.py benefit` reports what the review gates caught and what the
223
+ doctrine costs to read. It always exits 0 and emits no warning: **never wire
224
+ it into CI**. It is the criterion by which future units are judged, and a
225
+ measurement that can fail a build becomes a target -- a targeted measurement
226
+ stops measuring. Run it when deciding whether a proposed rule is worth its
227
+ ceremony, not on every push.